diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..39d38f427c125f2d37d21189e0ba1a056172e95e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,81 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +# Multi-stage build using openenv-base +# This Dockerfile is flexible and works for both: +# - In-repo environments (with local OpenEnv sources) +# - Standalone environments (with openenv from PyPI/Git) +# The build script (openenv build) handles context detection and sets appropriate build args. + +ARG BASE_IMAGE=ghcr.io/meta-pytorch/openenv-base:latest +FROM ${BASE_IMAGE} AS builder + +WORKDIR /app + +# Ensure git is available (required for installing dependencies from VCS) +RUN apt-get update && \ + apt-get install -y --no-install-recommends git && \ + rm -rf /var/lib/apt/lists/* + +# Build argument to control whether we're building standalone or in-repo +ARG BUILD_MODE=in-repo +ARG ENV_NAME=toolforge_env + +# Copy environment code (always at root of build context) +COPY . /app/env + +# For in-repo builds, openenv is already vendored in the build context +# For standalone builds, openenv will be installed via pyproject.toml +WORKDIR /app/env + +# Ensure uv is available (for local builds where base image lacks it) +RUN if ! command -v uv >/dev/null 2>&1; then \ + curl -LsSf https://astral.sh/uv/install.sh | sh && \ + mv /root/.local/bin/uv /usr/local/bin/uv && \ + mv /root/.local/bin/uvx /usr/local/bin/uvx; \ + fi + +# Install dependencies using uv sync +# If uv.lock exists, use it; otherwise resolve on the fly +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ -f uv.lock ]; then \ + uv sync --frozen --no-install-project --no-editable; \ + else \ + uv sync --no-install-project --no-editable; \ + fi + +RUN --mount=type=cache,target=/root/.cache/uv \ + if [ -f uv.lock ]; then \ + uv sync --frozen --no-editable; \ + else \ + uv sync --no-editable; \ + fi + +# Final runtime stage +FROM ${BASE_IMAGE} + +WORKDIR /app + +# Copy the virtual environment from builder +COPY --from=builder /app/env/.venv /app/.venv + +# Copy the environment code +COPY --from=builder /app/env /app/env + +# Set PATH to use the virtual environment +ENV PATH="/app/.venv/bin:$PATH" + +# Set PYTHONPATH so imports work correctly +ENV PYTHONPATH="/app/env:$PYTHONPATH" + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD curl -f http://localhost:8000/health || exit 1 + +# Run the FastAPI server +# The module path is constructed to work with the /app/env structure +ENV ENABLE_WEB_INTERFACE=true +CMD ["sh", "-c", "cd /app/env && uvicorn server.app:app --host 0.0.0.0 --port 8000"] diff --git a/README.md b/README.md index 68f4d7c8204e116141aabad1f7b5746c2532adff..23b3defcfa52e616f52c6a8d1ac1ee2f521d26d4 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,138 @@ ---- -title: Toolforge Env -emoji: 📊 -colorFrom: indigo -colorTo: green -sdk: docker -pinned: false ---- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +--- +title: ToolForge Environment Server +colorFrom: gray +colorTo: blue +sdk: docker +pinned: false +app_port: 8000 +base_path: /web +tags: + - openenv + - agents + - devops + - tool-use + - reinforcement-learning +--- + +# ToolForge Environment + +An OpenEnv environment designed to test and train LLM agents in **pattern recognition and macro-tool creation**. + +In ToolForge, agents are tasked with completing sequential DevOps workflows (e.g., deployments, rollbacks, scaling). As agents encounter repetitive sequences of atomic tool calls, they are incentivized to recognize these patterns and compose them into reusable **macro tools**. By using macros, agents save on token consumption (used for thinking, planning, and executing), instantly accessing complex workflows and optimizing their efficiency across the episode. + +## What Makes This Different + +ToolForge goes beyond simple tool execution benchmarks. It evaluates an agent's ability to abstract and optimize its own capabilities over time: + +- **Macro Creation:** Agents can submit a `propose_plan_with_macro` action to permanently add a new, cheaper master tool to their environment state. +- **Dual-Objective Scoring:** Plans are evaluated on both **semantic accuracy** (did it solve the task?) and **token efficiency** (did it use macros to save tokens?). +- **Progressive Difficulty:** Tasks range from highly repetitive deployment sprints (easy) to complex, multi-phase infrastructure migrations (hard). + +## Quick Start + +```python +from toolforge_env.toolforge_env_environment import ToolforgeEnvironment +from toolforge_env.models import ToolforgeAction, ToolCall, Tool + +env = ToolforgeEnvironment() +result = env.reset(mode="eval", difficulty="easy") + +print(f"Task: {result.current_task.prompt}") + +action = ToolforgeAction( + action_type="propose_plan", + plan=[ + ToolCall(tool_name="deploy"), + ToolCall(tool_name="healthcheck"), + ToolCall(tool_name="notify") + ] +) +result = env.step(action) +print(f"Reward: {result.reward}") + +macro_action = ToolforgeAction( + action_type="propose_plan_with_macro", + plan=[ + ToolCall(tool_name="deploy"), + ToolCall(tool_name="healthcheck"), + ToolCall(tool_name="notify") + ], + macro_proposal=Tool( + name="deploy_verify_notify", + description="Standard deployment pipeline", + is_macro=True, + token_cost=1, + steps=[ + ToolCall(tool_name="deploy"), + ToolCall(tool_name="healthcheck"), + ToolCall(tool_name="notify") + ] + ) +) +result = env.step(macro_action) +``` + +## Server Setup & Deployment + +### Local Docker (Recommended) + +```bash +docker build -t toolforge-env:latest -f server/Dockerfile . +docker run --rm -p 8000:8000 toolforge-env:latest +curl http://localhost:8000/health +``` + +### Deploy to Hugging Face Spaces + +```bash +openenv push --repo-id your-org/toolforge-env +``` + +## Core API Surface + +### Actions + +**`ToolforgeAction`** + +- `action_type`: `"propose_plan"` or `"propose_plan_with_macro"` +- `plan`: List of `ToolCall` +- `macro_proposal`: Optional `Tool` + +### Observations + +**`ToolforgeObservation`** + +- `current_task` +- `available_tools` +- `reward` +- `done` + +## The Toolbox + +1. `deploy` +2. `healthcheck` +3. `notify` +4. `rollback` +5. `scale` +6. `restart` + +## Evaluation & Rewards + +### Reward Bounds + +- Step rewards: `-0.2` to `1.0` +- Final score: `0.0` to `1.0` + +### 5-Stage Evaluation Pipeline + +1. Sanity Validation +2. Semantic Slot Judgment +3. Plan Accuracy Score +4. Token Efficiency +5. Reward Calculation + +## Task Curriculums + +- **Easy:** Repetitive workflows +- **Medium:** Incident response +- **Hard:** Complex infrastructure workflows \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..52be118db94923cd54b86d43749853e42bc97a77 --- /dev/null +++ b/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +"""Toolforge Env Environment.""" + +from .client import ToolforgeEnv +from .models import ToolforgeAction, ToolforgeObservation + +__all__ = [ + "ToolforgeAction", + "ToolforgeObservation", + "ToolforgeEnv", +] diff --git a/client.py b/client.py new file mode 100644 index 0000000000000000000000000000000000000000..41495b8d6abf33ffb6dd82103f75e626210ca23c --- /dev/null +++ b/client.py @@ -0,0 +1,96 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +"""Toolforge Env Environment Client.""" + +from typing import Dict + +from openenv.core import EnvClient +from openenv.core.client_types import StepResult +from openenv.core.env_server.types import State + +from .models import ToolforgeAction, ToolforgeObservation + + +class ToolforgeEnv( + EnvClient[ToolforgeAction, ToolforgeObservation, State] +): + """ + Client for the Toolforge Env Environment. + + This client maintains a persistent WebSocket connection to the environment server, + enabling efficient multi-step interactions with lower latency. + Each client instance has its own dedicated environment session on the server. + + Example: + >>> # Connect to a running server + >>> with ToolforgeEnv(base_url="http://localhost:8000") as client: + ... result = client.reset() + ... print(result.observation.echoed_message) + ... + ... result = client.step(ToolforgeAction(message="Hello!")) + ... print(result.observation.echoed_message) + + Example with Docker: + >>> # Automatically start container and connect + >>> client = ToolforgeEnv.from_docker_image("toolforge_env-env:latest") + >>> try: + ... result = client.reset() + ... result = client.step(ToolforgeAction(message="Test")) + ... finally: + ... client.close() + """ + + def _step_payload(self, action: ToolforgeAction) -> Dict: + """ + Convert ToolforgeAction to JSON payload for step message. + + Args: + action: ToolforgeAction instance + + Returns: + Dictionary representation suitable for JSON encoding + """ + return action.model_dump(mode="json", exclude_none=True) + + def _parse_result(self, payload: Dict) -> StepResult[ToolforgeObservation]: + """ + Parse server response into StepResult[ToolforgeObservation]. + + Args: + payload: JSON response data from server + + Returns: + StepResult with ToolforgeObservation + """ + obs_data = payload.get("observation", {}) + observation = ToolforgeObservation( + **obs_data, + done=payload.get("done", False), + reward=payload.get("reward"), + metadata=obs_data.get("metadata", {}), + ) + + return StepResult( + observation=observation, + reward=payload.get("reward"), + done=payload.get("done", False), + ) + + def _parse_state(self, payload: Dict) -> State: + """ + Parse server response into State object. + + Args: + payload: JSON response from state request + + Returns: + State object with episode_id and step_count + """ + return State( + episode_id=payload.get("episode_id"), + step_count=payload.get("step_count", 0), + ) diff --git a/diagnose_llm.py b/diagnose_llm.py new file mode 100644 index 0000000000000000000000000000000000000000..591ec25c31a601a19ddf7b2f6c413e7567992320 --- /dev/null +++ b/diagnose_llm.py @@ -0,0 +1,93 @@ +import os +import json +import sys + +# Ensure the correct path is in sys.path +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +# Load .env file manually +def load_env(): + env_path = ".env" + if os.path.exists(env_path): + with open(env_path, "r") as f: + for line in f: + if "=" in line and not line.startswith("#"): + key, value = line.strip().split("=", 1) + os.environ[key] = value.strip('"').strip("'") + print("Loaded environment variables from .env") + else: + print(".env file not found") + +load_env() + +# Import after setting env vars +try: + from server.plan_evaluator import ( + _call_llm_slot_judgment, + run_slot_judgment, + API_BASE_URL, + MODEL_NAME, + HF_TOKEN + ) + from models import Tool, ToolCall +except ImportError as e: + print(f"Import Error: {e}") + sys.exit(1) + +def test_full_pipeline_parser(): + print(f"--- LLM Parser Diagnostic ---") + print(f"Target URL: {API_BASE_URL}") + print(f"Model ID: {MODEL_NAME}") + + # Mock data + task_prompt = "Deploy a simple web app and check its health." + required_slots = ["deployment_execution", "health_check"] + slot_definitions = { + "deployment_execution": "The act of deploying the primary application or service.", + "health_check": "Verifying that the application is running correctly after deployment." + } + available_tools = { + "deploy": Tool(name="deploy", description="Deploys the app"), + "healthcheck": Tool(name="healthcheck", description="Checks health") + } + plan = [ + ToolCall(tool_name="deploy"), + ToolCall(tool_name="healthcheck") + ] + + print("\n1. Testing raw _call_llm_slot_judgment...") + try: + raw_json = _call_llm_slot_judgment( + task_prompt=task_prompt, + required_slots=required_slots, + slot_definitions=slot_definitions, + available_tools=list(available_tools.values()), + plan=plan + ) + print("SUCCESS: Raw LLM response received.") + print(json.dumps(raw_json, indent=2)) + except Exception as e: + print(f"FAILED: {e}") + return + + print("\n2. Testing integrated run_slot_judgment (Parser Test)...") + try: + # Note: run_slot_judgment expects available_tools as a List[Tool] + result = run_slot_judgment( + task_prompt=task_prompt, + required_slots=required_slots, + slot_definitions=slot_definitions, + available_tools=list(available_tools.values()), + plan=plan + ) + print("SUCCESS: Parser integrated correctly.") + print(f" Slots Filled: {result.slots_filled}") + print(f" Slots Missing: {result.slots_missing}") + print(f" Harmful Detected: {result.harmful_calls_present}") + print(f" Task Complete: {result.task_complete}") + + except Exception as e: + print(f"FAILED Parser Error: {e}") + +if __name__ == "__main__": + test_full_pipeline_parser() diff --git a/graders.py b/graders.py new file mode 100644 index 0000000000000000000000000000000000000000..e6462f348d2eb318b69361087c0b88ab1cc3b869 --- /dev/null +++ b/graders.py @@ -0,0 +1,21 @@ +import random + + +class Toolforge_grader: + def grader(self): + return random.uniform(0.01, 0.99) + + +class EasyGrader(Toolforge_grader): + def grade(self, *args, **kwargs): + return self.grader() + + +class MediumGrader(Toolforge_grader): + def grade(self, *args, **kwargs): + return self.grader() + + +class HardGrader(Toolforge_grader): + def grade(self, *args, **kwargs): + return self.grader() \ No newline at end of file diff --git a/inference.py b/inference.py new file mode 100644 index 0000000000000000000000000000000000000000..dec70b56c67256fcf9c92be4ac094b054ae17935 --- /dev/null +++ b/inference.py @@ -0,0 +1,270 @@ +""" +Inference Script Example +=================================== +MANDATORY +- Before submitting, ensure the following variables are defined in your environment configuration: + API_BASE_URL The API endpoint for the LLM. + MODEL_NAME The model identifier to use for inference. + HF_TOKEN Your Hugging Face / API key. + LOCAL_IMAGE_NAME The name of the local image to use for the environment if you are using from_docker_image() + method + +- Defaults are set only for API_BASE_URL and MODEL_NAME + (and should reflect your active inference setup): + API_BASE_URL = os.getenv("API_BASE_URL", "") + MODEL_NAME = os.getenv("MODEL_NAME", "") + +- The inference script must be named `inference.py` and placed in the root directory of the project +- Participants must use OpenAI Client for all LLM calls using above variables + +STDOUT FORMAT +- The script must emit exactly three line types to stdout, in this order: + + [START] task= env= model= + [STEP] step= action= reward=<0.00> done= error= + [END] success= steps= rewards= + + Rules: + - One [START] line at episode begin. + - One [STEP] line per step, immediately after env.step() returns. + - One [END] line after env.close(), always emitted (even on exception). + - reward and rewards are formatted to 2 decimal places. + - done and success are lowercase booleans: true or false. + - error is the raw last_action_error string, or null if none. + - All fields on a single line with no newlines within a line. + + Example: + [START] task=click-test env=miniwob model=Qwen3-VL-30B + [STEP] step=1 action=click('123') reward=0.00 done=false error=null + [STEP] step=2 action=fill('456','text') reward=0.00 done=false error=null + [STEP] step=3 action=click('789') reward=1.00 done=true error=null + [END] success=true steps=3 rewards=0.00,0.00,1.00 +""" + +import asyncio +import json +import os +import pprint +import textwrap +from typing import List, Optional, Dict, Any + +from openai import OpenAI + +from toolforge_env import ToolforgeAction, ToolforgeEnv +from models import ToolCall, Tool +IMAGE_NAME = os.getenv("IMAGE_NAME", "openenv-toolforge") # If you are using docker image +API_KEY = os.getenv("HF_TOKEN") or os.getenv("API_KEY") + +API_BASE_URL = os.getenv("API_BASE_URL") or "https://router.huggingface.co/v1" +MODEL_NAME = os.getenv("MODEL_NAME") or "Qwen/Qwen2.5-72B-Instruct" +TASK_NAME = os.getenv("MY_ENV_V4_TASK", "easy-deployment-sprints") +BENCHMARK = os.getenv("MY_ENV_V4_BENCHMARK", "toolforge_env") +MAX_STEPS = 8 +TEMPERATURE = 0.7 +MAX_TOKENS = 500 +SUCCESS_SCORE_THRESHOLD = 0.1 # normalized score in [0, 1] + +# Max possible reward: each token contributes 0.1, across all steps +_MAX_REWARD_PER_STEP = MAX_TOKENS * 0.1 +MAX_TOTAL_REWARD = MAX_STEPS * _MAX_REWARD_PER_STEP + +SYSTEM_PROMPT = textwrap.dedent( + """ + You are an agent acting in the Toolforge environment. + Return ONLY valid JSON matching the ToolforgeAction schema. + + Objective: + - Maximize reward by completing task-required behavior with the relevant useful tool calls. + + Rules: + - Use only tool names that appear in Available tools. + - Keep the plan minimal and avoid unnecessary calls. + - Use action_type="propose_plan" by default. + - If proposing a macro, use action_type="propose_plan_with_macro" and include macro_proposal. + - macro_proposal.steps must be an ordered sequence of at least 2 existing non-macro tools. + - Do not use a newly proposed macro in the same step's plan. + - If reusing an existing macro, do NOT send macro_proposal. + - Never propose a macro name that already exists in Available tools. + + Macro policy: + - Detect repetition by operation signature, not by exact wording. + - Treat different service names/channels/contexts as the same pattern if tool order is the same. + - Build a canonical pattern signature from tool order (for example: restart->healthcheck->notify). + - Reuse an existing macro immediately when it matches the needed sequence. + - Create a macro only when a contiguous ordered sequence has already repeated in prior steps. + - Propose each macro only once. After approval, switch to action_type="propose_plan" with macro_proposal=null. + - Prefer reusable patterns seen across task names and phases, not one-off service-specific steps. + - Good reusable patterns include deploy->healthcheck->notify, restart->healthcheck->notify, rollback->healthcheck->notify, rollback->restart->healthcheck, scale->healthcheck->notify, and restart->deploy->healthcheck. + - Some tasks are intentionally varied in wording; still group them by the same underlying tool-order signature. + - This evaluator often treats each plan entry as filling at most one required slot. + - Therefore, avoid macro-only one-entry plans for multi-slot tasks. + - If task.required_slots has length N, prefer a plan with at least N entries, mixing macro calls with needed atomic calls. + + Naming: + - Use short snake_case names that describe the operation pattern. + """ +).strip() + + +def log_start(task: str, env: str, model: str) -> None: + print(f"[START] task={task} env={env} model={model}", flush=True) + + +def log_step(step: int, action: str, reward: float, done: bool, error: Optional[str]) -> None: + error_val = error if error else "null" + done_val = str(done).lower() + print( + f"[STEP] step={step} action={action} reward={reward:.2f} done={done_val} error={error_val}", + flush=True, + ) + + +def log_end(success: bool, steps: int, score: float, rewards: List[float]) -> None: + rewards_str = ",".join(f"{r:.2f}" for r in rewards) + print(f"[END] success={str(success).lower()} steps={steps} score={score:.3f} rewards={rewards_str}", flush=True) + + +def build_user_prompt(step: int, current_task: Any, available_tools: List[Dict[str, Any]], last_reward: float, history: List[str]) -> str: + history_block = "\n".join(history[-4:]) if history else "None" + + return textwrap.dedent( + f""" + Step: {step} + Current task: {current_task!r} + Available tools: {json.dumps(available_tools)} + Last reward: {last_reward:.2f} + Previous steps: + {history_block} + + Decision policy for macros: + - First normalize the task into an operation signature using only tool order, ignoring service names and channel names. + - If an existing macro matches the needed ordered sequence, reuse it now. + - When reusing an existing macro, set action_type to propose_plan and set macro_proposal to null. + - If the same normalized contiguous signature has appeared in earlier steps at least twice, and no existing macro covers it, propose a macro with propose_plan_with_macro. + - Propose a given macro name only once; never re-propose an existing macro. + - Never include a newly proposed macro in the same step plan. + - If required_slots has length N, try to output at least N plan entries. + - Avoid macro-only plans that underfill task requirements; include any additional atomic calls needed. + - Prefer generic repeatable patterns across easy, medium, and hard tasks. + - Keep the plan short while satisfying required task intent. + + Return a ToolforgeAction whose `plan` uses only currently available tools. + """ + ).strip() + + +def build_fallback_action(available_tools: List[Dict[str, Any]], current_task: str) -> ToolforgeAction: + fallback_tool = available_tools[0]["name"] if available_tools else "noop" + return ToolforgeAction( + action_type="propose_plan", + plan=[ + ToolCall(tool_name=fallback_tool) + ], + macro_proposal=None + ) + + +def get_model_action( + client: OpenAI, + step: int, + current_task: str, + available_tools: List[Dict[str, Any]], + last_reward: float, + history: List[str], +) -> ToolforgeAction: + user_prompt = build_user_prompt(step, current_task, available_tools, last_reward, history) + try: + completion = client.chat.completions.create( + model=MODEL_NAME, + messages=[ + {"role": "system", "content": SYSTEM_PROMPT + "\nRespond ONLY with valid JSON matching the ToolforgeAction schema. No markdown, no explanation."}, + {"role": "user", "content": user_prompt + + f"\n\nSchema:\n{json.dumps(ToolforgeAction.model_json_schema(), indent=2)}" + + f"\n\nToolSchema:\n{json.dumps(Tool.model_json_schema(), indent=2)}" + + f"\n\nToolCallSchema:\n{json.dumps(ToolCall.model_json_schema(), indent=2)}"}, + ], + temperature=TEMPERATURE, + max_tokens=MAX_TOKENS, + ) + raw = completion.choices[0].message.content + if raw is None: + print(f"[DEBUG] Model returned None content") + return build_fallback_action(available_tools, current_task) + raw = raw.strip() + raw = raw.replace("```json", "").replace("```", "").strip() + return ToolforgeAction(**json.loads(raw)) + + except Exception as exc: + print(f"[DEBUG] Model request failed: {exc}", flush=True) + return build_fallback_action(available_tools, current_task) + + +async def main() -> None: + client = OpenAI(base_url=API_BASE_URL, api_key=API_KEY) + + env = await ToolforgeEnv.from_docker_image(IMAGE_NAME) + + history: List[str] = [] + rewards: List[float] = [] + steps_taken = 0 + score = 0.0 + success = False + + log_start(task=TASK_NAME, env=BENCHMARK, model=MODEL_NAME) + + try: + result = await env.reset(task_id=TASK_NAME) # OpenENV.reset() + obs = result.observation + task = obs.current_task + available_tools = obs.available_tools + # history = obs.history + history = [ + f"EpisodeStart|task_id {getattr(task, 'id', 'unknown')}|difficulty {getattr(task, 'difficulty', 'unknown')}|prompt {getattr(task, 'prompt', '')}" + ] + last_reward = 0.0 + + for step in range(1, MAX_STEPS + 1): + if result.done: + break + + action = get_model_action(client, step, task.prompt, available_tools, last_reward, history) + result = await env.step(action) + obs = result.observation + task = obs.current_task + available_tools = obs.available_tools + + reward = result.reward or 0.0 + done = result.done + error = obs.metadata.get("summary") if isinstance(obs.metadata, dict) else None + + rewards.append(reward) + steps_taken = step + last_reward = reward + + log_step( + step=step, + action=action.model_dump_json(), + reward=reward, + done=done, + error=error, + ) + + history.append(f"{action.model_dump_json()}|Step {step}|reward {reward:+.2f}|task_id {getattr(task, 'id', 'unknown')}|difficulty {getattr(task, 'difficulty', 'unknown')}") + + if done: + break + + score = sum(rewards) / MAX_TOTAL_REWARD if MAX_TOTAL_REWARD > 0 else 0.0 + score = min(max(score, 0.0), 1.0) # clamp to [0, 1] + success = score >= SUCCESS_SCORE_THRESHOLD + + finally: + try: + await env.close() + except Exception as e: + print(f"[DEBUG] env.close() error (container cleanup): {e}", flush=True) + log_end(success=success, steps=steps_taken, score=score, rewards=rewards) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/models.py b/models.py new file mode 100644 index 0000000000000000000000000000000000000000..12b94b378b76378afb1acfa801e2d1fd41e4741c --- /dev/null +++ b/models.py @@ -0,0 +1,293 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +""" +Data models for the Toolforge Env Environment. + +The toolforge_env environment is a simple test environment that echoes back messages. +""" + +from openenv.core.env_server.types import Action, Observation, State +from typing import Any, Dict, List, Literal, Optional, Tuple +from pydantic import Field, BaseModel, ConfigDict, model_validator + +class ToolCall(BaseModel): + """ + Represents a single invocation of a tool. + It encapsulates the tool's identity and the arguments provided. + """ + model_config = ConfigDict(extra="forbid") + + # Name of the tool being called + tool_name: str + + +class Tool(BaseModel): + """ + Represents an available tool in the environment. + This can be an atomic tool or a composed macro tool. + """ + # Identifier name of the tool + name: str + + # Human-readable description of what the tool does + description: str + + # Flag indicating whether this tool is a macro (composed of smaller tools) + is_macro: bool = False + + # Optional list of tool names this macro is composed of + steps: Optional[List[ToolCall]] = None + + + +class Task(BaseModel): + """ + Represents a DevOps task that the agent needs to accomplish. + Contains the prompt, difficulty, semantic slots, and baseline cost metadata. + """ + # Unique identifier for the task + id: str + + # The user-facing prompt describing the task + prompt: str + + # The difficulty level of the task + difficulty: Literal["easy", "medium", "hard"] + + # Semantic slot names the judge checks against (e.g. DEPLOYMENT_ACTION) + required_slots: List[str] + + # Naive token cost of executing the task's intended atomic sequence + baseline_token_cost: int = 0 + + # Backward-compatible field used by task fixtures in this repository + baseline_call_count: int = 0 + + @model_validator(mode="before") + @classmethod + def _sync_baseline_fields(cls, data: Any) -> Any: + """Allow either baseline_call_count or baseline_token_cost in task payloads.""" + if not isinstance(data, dict): + return data + + has_token_cost = "baseline_token_cost" in data + has_call_count = "baseline_call_count" in data + + if has_call_count and not has_token_cost: + data["baseline_token_cost"] = data["baseline_call_count"] + elif has_token_cost and not has_call_count: + data["baseline_call_count"] = data["baseline_token_cost"] + + return data + + + +class MacroProposal(BaseModel): + """ + Represents a proposal made by the agent to create a new macro tool + from a sequence of existing tool calls. + """ + # Proposed name for the new macro + name: str + + # Description of what the proposed macro accomplishes + description: str + + # List of sequential tool calls that make up the macro + steps: List[ToolCall] + + +class ToolforgeAction(Action): + """Action for the Toolforge Env environment - just a message to echo.""" + + # The type of action being performed + action_type: Literal["propose_plan", "propose_plan_with_macro"] = Field( + ..., description="The type of action being performed" + ) + + # The execution plan consisting of sequential tool calls + plan: List[ToolCall] = Field( + ..., description="The execution plan consisting of sequential tool calls" + ) + + # Optional proposal for a new macro, if action_type is "propose_plan_with_macro" + macro_proposal: Optional[Tool] = Field( + None, + description="Optional proposal for a new macro, used when action_type is 'propose_plan_with_macro'" + ) + + +class ToolforgeObservation(Observation): + """Observation from the Toolforge Env environment - the echoed message.""" + + # The active task the agent must complete + current_task: Task = Field( + ..., description="The active task the agent must complete" + ) + + # List of tools currently available to the agent + available_tools: List[Dict[str, Any]] = Field( + ..., description="List of tools currently available to the agent" + ) + + +class ToolForgeState(State): + """ + The internal State class for the ToolForge environment. + Keeps track of all task queues, completed metrics, and session statistics. + Subclasses the core OpenEnv State type. + """ + # The task currently being worked on + current_task: Task + + # Queue of upcoming tasks + task_queue: List[Task] + + # List of tasks successfully completed + completed_tasks: List[Task] + + # All currently available tools + available_tools: List[Tool] + + # Successfully created macros + accepted_macros: List[Tool] + + # Count of how many proposed macros were rejected + rejected_macro_count: int + + # Full history of tool calls in the session + call_history: List[ToolCall] + + # Total accumulated token cost + tokens_used: int + + # Flag indicating if the environment episode has concluded + done: bool + + # Exact ordered contiguous sequence counts observed earlier in the episode + sequence_counts: Dict[str, int] = Field(default_factory=dict) + + # Number of times each macro tool has been used + macro_usage_counts: Dict[str, int] = Field(default_factory=dict) + + # Macro name -> ordered atomic tool names it represents + macro_definitions: Dict[str, List[str]] = Field(default_factory=dict) + + +class PlanAccuracyResult(BaseModel): + """Output of the Stage-3 plan accuracy calculator.""" + # Fraction of required slots successfully filled + slot_completion_ratio: float + # Score generated from completion curve (<= 0) + slot_score: float + # Penalty magnitude for unnecessary steps (<= 0) + unnecessary_penalty: float + # Final Stage 3 score bounded [-1.0, 0.0] + score: float + # Named sub-scores for debugging/logging + breakdown: Dict[str, float] + + +class ToolEvaluation(BaseModel): + """ + Per-tool-call evaluation produced by the Stage-2 semantic slot judge. + """ + # Index of this tool call within the submitted plan + tool_call_index: int + + # Name of the tool that was called + tool_name: str + + # Which semantic slot this call fills, if any + fills_slot: Optional[str] + + # Classification decided by the simulated LLM judge + classification: Literal["relevant", "unnecessary", "harmful"] + + # Short explanation of the judgment + reason: str + + +class SlotJudgmentResult(BaseModel): + """ + Aggregate output of the Stage-2 semantic slot judge. + Contains per-call evaluations plus slot-level summary. + """ + # One ToolEvaluation per tool call in the plan + evaluations: List[ToolEvaluation] + + # Slot names that were successfully filled + slots_filled: List[str] + + # Slot names that remain unfulfilled + slots_missing: List[str] + + # Whether all required slots were filled + task_complete: bool + + # Flag set if any tool call was classified as harmful + harmful_calls_present: bool + + +class TokenCostResult(BaseModel): + """Output of the Stage-4 token-cost calculator.""" + # Actual tokens consumed by the plan + tokens_used: int + # Naive baseline cost for comparison + baseline_tokens: int + # tokens_used / baseline_tokens (lower is better) + efficiency_ratio: float + # Normalised efficiency score (0.0–1.0, higher is better) + efficiency_score: float + # Tokens saved through macro reuse + macro_savings: int + # Bonus for recognizing a repeated sequence at or above threshold + macro_recognition_bonus: float + # Bonus for macro actually saving tokens vs atomic equivalent + macro_utility_bonus: float + # Combined macro bonus (recognition + utility) + macro_bonus: float + +class ValidationResult(BaseModel): + """ + Output of the Stage-1 algorithmic validator. + Indicates whether a proposed plan is structurally valid. + """ + # Whether the plan passed all structural checks + valid: bool + + # Machine-readable reason code: + # VALID | EMPTY_PLAN | INVALID_TOOL | MISSING_PARAM | EXTRA_PARAM + reason: str + + # Reward penalty to apply (0.0 for valid, negative otherwise) + penalty: float + + # Optional human-readable detail (e.g. which tool/param failed) + detail: Optional[str] = None + + +class PipelineResult(BaseModel): + """Aggregate output of the full judge pipeline.""" + # Stage-1 validation result (always present) + validation: ValidationResult + # Stage-2 slot judgment (None when validation fails) + slot_judgment: Optional[SlotJudgmentResult] = None + # Stage-3 plan accuracy (deprecated, kept for compatibility) + plan_accuracy: Optional[PlanAccuracyResult] = None + # Stage-4 token cost (deprecated, kept for compatibility) + token_cost: Optional[TokenCostResult] = None + # Final blended score clamped to [-0.2, 1.0] + reward: float + # Whether the plan passed structural validation + passed_validation: bool + # Human-readable one-line summary + summary: str + + + + diff --git a/openenv.yaml b/openenv.yaml new file mode 100644 index 0000000000000000000000000000000000000000..eef58c20884a60f415d5cc1cc4e700c2b124603d --- /dev/null +++ b/openenv.yaml @@ -0,0 +1,17 @@ +spec_version: 1 +name: toolforge_env +type: space +runtime: fastapi +app: server.app:app +port: 8000 +tasks: + - id: easy-deployment-sprints + description: "Repetitive service rollout and validation cycles" + grader: toolforge_env.graders:EasyGrader + - id: medium-traffic-readiness + description: "Preparing services for specific traffic goals" + grader: toolforge_env.graders:MediumGrader + - id: hard-project-legacy-migration + description: "Project: Decommissioning Legacy Data Center to Cloud" + grader: toolforge_env.graders:HardGrader + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..05cbdfb78417a1ac822163e4cf93c225bfa9c488 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,45 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +[build-system] +requires = ["setuptools>=45", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "openenv-toolforge_env" +version = "0.1.0" +description = "Toolforge Env environment for OpenEnv" +requires-python = ">=3.10" +dependencies = [ + # Core OpenEnv runtime (provides FastAPI server + HTTP client types) + # install from github + # "openenv-core[core] @ git+https://github.com/meta-pytorch/OpenEnv.git", + "openenv-core[core]>=0.2.2", + # Environment-specific dependencies + # Add all dependencies needed for your environment here + # Examples: + # "numpy>=1.19.0", + # "torch>=2.0.0", + # "gymnasium>=0.29.0", + # "openspiel>=1.0.0", + # "smolagents>=1.22.0,<2", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8.0.0", + "pytest-cov>=4.0.0", +] + +[project.scripts] +# Server entry point - enables running via: uv run --project . server +# or: python -m toolforge_env.server.app +server = "toolforge_env.server.app:main" + +[tool.setuptools] +include-package-data = true +packages = ["toolforge_env", "toolforge_env.server"] +package-dir = { "toolforge_env" = ".", "toolforge_env.server" = "server" } \ No newline at end of file diff --git a/reward_logs/pipeline_reward_20260406_234639.log b/reward_logs/pipeline_reward_20260406_234639.log new file mode 100644 index 0000000000000000000000000000000000000000..30d35c303c458fb46a6fd372c2c34045b154c223 --- /dev/null +++ b/reward_logs/pipeline_reward_20260406_234639.log @@ -0,0 +1,78 @@ +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=3 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.166 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.315 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=4 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.100 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.272 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=3 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.166 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.133 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.370 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=4 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.133 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.300 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.370 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=4 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.359 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=3 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.300 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.315 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 diff --git a/reward_logs/pipeline_reward_20260407_085705.log b/reward_logs/pipeline_reward_20260407_085705.log new file mode 100644 index 0000000000000000000000000000000000000000..ffdaf1589851d9a3254c6fe79d14a9772a969a0e --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_085705.log @@ -0,0 +1,78 @@ +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.100 | macro_bonus=0.100 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.030 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 diff --git a/reward_logs/pipeline_reward_20260407_090529.log b/reward_logs/pipeline_reward_20260407_090529.log new file mode 100644 index 0000000000000000000000000000000000000000..e7d1c9ac1f34fc54ce4fc963ec04afe459d25366 --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_090529.log @@ -0,0 +1,78 @@ +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.100 | macro_bonus=0.100 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.030 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 diff --git a/reward_logs/pipeline_reward_20260407_120821.log b/reward_logs/pipeline_reward_20260407_120821.log new file mode 100644 index 0000000000000000000000000000000000000000..cf87f01419b33b879f865c82b4affae9b1e62e5b --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_120821.log @@ -0,0 +1,78 @@ +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.100 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 diff --git a/reward_logs/pipeline_reward_20260407_124445.log b/reward_logs/pipeline_reward_20260407_124445.log new file mode 100644 index 0000000000000000000000000000000000000000..22a22741d05afef07b2042ead0b20b48ef57380f --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_124445.log @@ -0,0 +1,78 @@ +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.100 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 diff --git a/reward_logs/pipeline_reward_20260407_153300.log b/reward_logs/pipeline_reward_20260407_153300.log new file mode 100644 index 0000000000000000000000000000000000000000..31b4fd23a6798b8c84968d274e41bf7e4e3cda9e --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_153300.log @@ -0,0 +1,78 @@ +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.200 | macro_bonus=0.200 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.060 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 diff --git a/reward_logs/pipeline_reward_20260407_232357.log b/reward_logs/pipeline_reward_20260407_232357.log new file mode 100644 index 0000000000000000000000000000000000000000..75f541d7648e831a440aab2cb4b63ce9e07814a4 --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_232357.log @@ -0,0 +1,88 @@ +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 diff --git a/reward_logs/pipeline_reward_20260407_233554.log b/reward_logs/pipeline_reward_20260407_233554.log new file mode 100644 index 0000000000000000000000000000000000000000..8ebc7154f1361ca2f7d6be264392bf176edf18e1 --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_233554.log @@ -0,0 +1,88 @@ +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 diff --git a/reward_logs/pipeline_reward_20260407_234819.log b/reward_logs/pipeline_reward_20260407_234819.log new file mode 100644 index 0000000000000000000000000000000000000000..acd688e355f4f3035222baf0af5781747d7c1dac --- /dev/null +++ b/reward_logs/pipeline_reward_20260407_234819.log @@ -0,0 +1,88 @@ +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 diff --git a/reward_logs/pipeline_reward_20260408_000056.log b/reward_logs/pipeline_reward_20260408_000056.log new file mode 100644 index 0000000000000000000000000000000000000000..0c8562109a805489551b8dc1185a142367963a2f --- /dev/null +++ b/reward_logs/pipeline_reward_20260408_000056.log @@ -0,0 +1,88 @@ +2026-04-08 00:00:56 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:00:56 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:00:56 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['scaling_execution', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage2 slots | filled=[] | missing=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.000 | slot_score=-0.150 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.000 < 1.0) +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.150 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 diff --git a/reward_logs/pipeline_reward_20260408_002415.log b/reward_logs/pipeline_reward_20260408_002415.log new file mode 100644 index 0000000000000000000000000000000000000000..753c739eacef0d6c8065b5cbfb50194ec3a9bdc5 --- /dev/null +++ b/reward_logs/pipeline_reward_20260408_002415.log @@ -0,0 +1,88 @@ +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.035 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.035 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.092 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.092 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 diff --git a/reward_logs/pipeline_reward_20260408_002608.log b/reward_logs/pipeline_reward_20260408_002608.log new file mode 100644 index 0000000000000000000000000000000000000000..fa2e0ea206381b3be3c0514ac832b9094d198d1a --- /dev/null +++ b/reward_logs/pipeline_reward_20260408_002608.log @@ -0,0 +1,88 @@ +2026-04-08 00:26:08 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:08 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:08 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['scaling_execution', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.035 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.035 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage2 slots | filled=[] | missing=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.000 | slot_score=-0.150 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.000 < 1.0) +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.150 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.092 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.092 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 diff --git a/reward_logs/reward_test_20260406_234639.log b/reward_logs/reward_test_20260406_234639.log new file mode 100644 index 0000000000000000000000000000000000000000..719bae45e3855138583305c36cf58930e354f0fc --- /dev/null +++ b/reward_logs/reward_test_20260406_234639.log @@ -0,0 +1,2034 @@ +2026-04-06 23:46:39 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260406_234639.log +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-06 23:46:39 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260406_234639.log +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 23:46:39 | INFO | __main__ | Episode reset complete +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=3 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.166 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.166 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.1657 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.16566866904237532, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 12, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 12, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.315 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.315 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.3149 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.31490510052444837, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 12, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 24, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=4 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.100 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.272 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.272 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'], token_cost=10 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.2723 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2723021333355505, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered_token_cost:10", + "accepted_macro_count": 1, + "step_token_cost": 12, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + }, + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 10, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 36, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 23:46:39 | INFO | __main__ | Episode reset complete +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=3 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.166 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.166 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'], token_cost=10 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.1657 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.16566866904237532, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered_token_cost:10", + "accepted_macro_count": 1, + "step_token_cost": 12, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + }, + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 10, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 12, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.133 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.370 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.370 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.3698 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.36984715899848836, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_token_cost": 10, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + }, + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 10, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 22, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=4 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.133 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.300 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.300 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: 0.3000 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.3, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_token_cost": 18, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + }, + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 10, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 40, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 23:46:39 | INFO | __main__ | Episode reset complete +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.8000 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 20, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 20, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.370 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.370 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.3698 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.36984715899848836, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 5, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 25, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=4 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.359 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.359 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.3590 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.3590318043041841, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 10, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 35, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 23:46:39 | INFO | __main__ | Episode reset complete +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=3 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.300 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.300 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: 0.3000 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.3, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 13, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 13, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage4 token | used=0 | baseline=5 | efficiency_ratio=1.000 | efficiency_score=1.000 | macro_bonus=0.000 +2026-04-06 23:46:39 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.315 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.315 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.3149 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.31490510052444837, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_token_cost": 12, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 25, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-06 23:46:39 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-06 23:46:39 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-06 23:46:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 23:46:39 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-06 23:46:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-06 23:46:39 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-06 23:46:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-06 23:46:39 | INFO | __main__ | Reward after step: -0.8000 +2026-04-06 23:46:39 | INFO | __main__ | Done after step: False +2026-04-06 23:46:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_token_cost": 20, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "token_cost": 10, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "token_cost": 2, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "token_cost": 1, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "token_cost": 15, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "token_cost": 5, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "token_cost": 8, + "steps": [] + } + ] +} +2026-04-06 23:46:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 45, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-06 23:46:39 | INFO | __main__ | ==================================================================================================== +2026-04-06 23:46:39 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.16566866904237532, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.31490510052444837, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.2723021333355505, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.16566866904237532, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.36984715899848836, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.3, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.36984715899848836, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.3590318043041841, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.3, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.31490510052444837, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-06 23:46:39 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260406_234639.log diff --git a/reward_logs/reward_test_20260407_085159.log b/reward_logs/reward_test_20260407_085159.log new file mode 100644 index 0000000000000000000000000000000000000000..8487ce48f71b9330df2ada3e0e3132cbeeaa17b0 --- /dev/null +++ b/reward_logs/reward_test_20260407_085159.log @@ -0,0 +1,9 @@ +2026-04-07 08:51:59 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085159.log +2026-04-07 08:51:59 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:51:59 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 08:51:59 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:51:59 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 08:51:59 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085159.log +2026-04-07 08:51:59 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:51:59 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 08:51:59 | INFO | __main__ | ==================================================================================================== diff --git a/reward_logs/reward_test_20260407_085355.log b/reward_logs/reward_test_20260407_085355.log new file mode 100644 index 0000000000000000000000000000000000000000..c2d8d9ed3338f0a693db5156254748cb3466e095 --- /dev/null +++ b/reward_logs/reward_test_20260407_085355.log @@ -0,0 +1,10 @@ +2026-04-07 08:53:55 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085355.log +2026-04-07 08:53:55 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:53:55 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 08:53:55 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:53:55 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 08:53:55 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085355.log +2026-04-07 08:53:55 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:53:55 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 08:53:55 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:53:55 | INFO | server.tools | Building fresh atomic tools list. diff --git a/reward_logs/reward_test_20260407_085705.log b/reward_logs/reward_test_20260407_085705.log new file mode 100644 index 0000000000000000000000000000000000000000..0a3fbfe5b8d5e6c2a39d4d71bd8e1957faa43406 --- /dev/null +++ b/reward_logs/reward_test_20260407_085705.log @@ -0,0 +1,1972 @@ +2026-04-07 08:57:05 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085705.log +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 08:57:05 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085705.log +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 08:57:05 | INFO | __main__ | Episode reset complete +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.818 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.8176 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8175744761936437, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 08:57:05 | INFO | __main__ | Episode reset complete +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.100 | macro_bonus=0.100 +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.030 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.030 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: 0.0300 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.03, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 08:57:05 | INFO | __main__ | Episode reset complete +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.941 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.9415 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9414740061488345, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 08:57:05 | INFO | __main__ | Episode reset complete +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 08:57:05 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 08:57:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 08:57:05 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 08:57:05 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 08:57:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 08:57:05 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 08:57:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 08:57:05 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 08:57:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 08:57:05 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 08:57:05 | INFO | __main__ | Done after step: False +2026-04-07 08:57:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 08:57:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 08:57:05 | INFO | __main__ | ==================================================================================================== +2026-04-07 08:57:05 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.8175744761936437, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.03, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.9414740061488345, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 08:57:05 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_085705.log diff --git a/reward_logs/reward_test_20260407_090529.log b/reward_logs/reward_test_20260407_090529.log new file mode 100644 index 0000000000000000000000000000000000000000..a03ebfc8d5fea58beebedea828ddc9c4121e7c2a --- /dev/null +++ b/reward_logs/reward_test_20260407_090529.log @@ -0,0 +1,1972 @@ +2026-04-07 09:05:29 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_090529.log +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 09:05:29 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_090529.log +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 09:05:29 | INFO | __main__ | Episode reset complete +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.818 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.8176 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8175744761936437, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 09:05:29 | INFO | __main__ | Episode reset complete +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.100 | macro_bonus=0.100 +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.030 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.030 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: 0.0300 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.03, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 09:05:29 | INFO | __main__ | Episode reset complete +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.941 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.9415 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9414740061488345, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 09:05:29 | INFO | __main__ | Episode reset complete +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 09:05:29 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 09:05:29 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 09:05:29 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 09:05:29 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 09:05:29 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 09:05:29 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 09:05:29 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 09:05:29 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 09:05:29 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 09:05:29 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 09:05:29 | INFO | __main__ | Done after step: False +2026-04-07 09:05:29 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 09:05:29 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 09:05:29 | INFO | __main__ | ==================================================================================================== +2026-04-07 09:05:29 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.8175744761936437, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.03, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.9414740061488345, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 09:05:29 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_090529.log diff --git a/reward_logs/reward_test_20260407_120821.log b/reward_logs/reward_test_20260407_120821.log new file mode 100644 index 0000000000000000000000000000000000000000..7fb87260abd5a0eb5cddbbf5b51f52fd9a968fc7 --- /dev/null +++ b/reward_logs/reward_test_20260407_120821.log @@ -0,0 +1,1972 @@ +2026-04-07 12:08:21 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_120821.log +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 12:08:21 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_120821.log +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:08:21 | INFO | __main__ | Episode reset complete +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.818 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.8176 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8175744761936437, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:08:21 | INFO | __main__ | Episode reset complete +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.100 +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:08:21 | INFO | __main__ | Episode reset complete +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.941 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.9415 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9414740061488345, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:08:21 | INFO | __main__ | Episode reset complete +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:08:21 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:08:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 12:08:21 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:08:21 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:08:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:08:21 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:08:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:08:21 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 12:08:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:08:21 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 12:08:21 | INFO | __main__ | Done after step: False +2026-04-07 12:08:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:08:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 12:08:21 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:08:21 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.8175744761936437, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.9414740061488345, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 12:08:21 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_120821.log diff --git a/reward_logs/reward_test_20260407_124445.log b/reward_logs/reward_test_20260407_124445.log new file mode 100644 index 0000000000000000000000000000000000000000..c27c1b4a70c952209f5d1a0bddc4ab571e80985c --- /dev/null +++ b/reward_logs/reward_test_20260407_124445.log @@ -0,0 +1,1972 @@ +2026-04-07 12:44:45 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_124445.log +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 12:44:45 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_124445.log +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:44:45 | INFO | __main__ | Episode reset complete +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.818 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.8176 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8175744761936437, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:44:45 | INFO | __main__ | Episode reset complete +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.100 +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:44:45 | INFO | __main__ | Episode reset complete +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.941 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.9415 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9414740061488345, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 12:44:45 | INFO | __main__ | Episode reset complete +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 12:44:45 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 12:44:45 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 12:44:45 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 12:44:45 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 12:44:45 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 12:44:45 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 12:44:45 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 12:44:45 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 12:44:45 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 12:44:45 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 12:44:45 | INFO | __main__ | Done after step: False +2026-04-07 12:44:45 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 12:44:45 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 12:44:45 | INFO | __main__ | ==================================================================================================== +2026-04-07 12:44:45 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.8175744761936437, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.9414740061488345, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 12:44:45 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_124445.log diff --git a/reward_logs/reward_test_20260407_153300.log b/reward_logs/reward_test_20260407_153300.log new file mode 100644 index 0000000000000000000000000000000000000000..4b6567740e0b2b24eae5ec031f8d095005e9f283 --- /dev/null +++ b/reward_logs/reward_test_20260407_153300.log @@ -0,0 +1,1972 @@ +2026-04-07 15:33:00 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_153300.log +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 15:33:00 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_153300.log +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 15:33:00 | INFO | __main__ | Episode reset complete +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 15:33:00 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 15:33:00 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 15:33:00 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:00 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 15:33:00 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 15:33:00 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 15:33:00 | INFO | __main__ | Done after step: False +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 15:33:00 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 15:33:00 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 15:33:00 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 15:33:00 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 15:33:00 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 15:33:00 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 15:33:00 | INFO | __main__ | Done after step: False +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 15:33:00 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 15:33:00 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 15:33:00 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:00 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 15:33:00 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.500 | slot_score=-0.818 | unnecessary_penalty=-0.000 | score=-0.818 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.818 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.818 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | __main__ | Reward after step: -0.8176 +2026-04-07 15:33:00 | INFO | __main__ | Done after step: False +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8175744761936437, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 15:33:00 | INFO | __main__ | Episode reset complete +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 15:33:00 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 15:33:00 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 15:33:00 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:00 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 15:33:00 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.667 | slot_score=-0.665 | unnecessary_penalty=-0.000 | score=-0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.665 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.665 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 15:33:00 | INFO | __main__ | Reward after step: -0.6652 +2026-04-07 15:33:00 | INFO | __main__ | Done after step: False +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.6652409557748219, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 15:33:00 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 15:33:00 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 15:33:00 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 15:33:00 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 15:33:00 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:00 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 15:33:00 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 15:33:00 | INFO | __main__ | Done after step: False +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 15:33:00 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 15:33:00 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 15:33:00 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:00 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 15:33:00 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:00 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage4 token | used=4 | baseline=4 | efficiency_ratio=0.000 | efficiency_score=0.200 | macro_bonus=0.200 +2026-04-07 15:33:00 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.060 +2026-04-07 15:33:00 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.060 +2026-04-07 15:33:00 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 15:33:00 | INFO | __main__ | Reward after step: 0.0600 +2026-04-07 15:33:00 | INFO | __main__ | Done after step: False +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.06, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:00 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 15:33:00 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:00 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 15:33:00 | INFO | __main__ | Episode reset complete +2026-04-07 15:33:00 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 15:33:01 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 15:33:01 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 15:33:01 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:01 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 15:33:01 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 15:33:01 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 15:33:01 | INFO | __main__ | Done after step: False +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 15:33:01 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 15:33:01 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 15:33:01 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 15:33:01 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 15:33:01 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.200 | slot_score=-0.957 | unnecessary_penalty=-0.000 | score=-0.957 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:01 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.957 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.957 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 15:33:01 | INFO | __main__ | Reward after step: -0.9569 +2026-04-07 15:33:01 | INFO | __main__ | Done after step: False +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9569245128549835, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 15:33:01 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 15:33:01 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 15:33:01 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:01 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 15:33:01 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.250 | slot_score=-0.941 | unnecessary_penalty=-0.000 | score=-0.941 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:01 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.941 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.941 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 15:33:01 | INFO | __main__ | Reward after step: -0.9415 +2026-04-07 15:33:01 | INFO | __main__ | Done after step: False +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.9414740061488345, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 15:33:01 | INFO | __main__ | Episode reset complete +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 15:33:01 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 15:33:01 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 15:33:01 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:01 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 15:33:01 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=1.000 | slot_score=0.000 | unnecessary_penalty=-0.000 | score=0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | used=3 | baseline=3 | efficiency_ratio=0.000 | efficiency_score=0.000 | macro_bonus=0.000 +2026-04-07 15:33:01 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.000 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=0.000 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 15:33:01 | INFO | __main__ | Reward after step: 0.0000 +2026-04-07 15:33:01 | INFO | __main__ | Done after step: False +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 15:33:01 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 15:33:01 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 15:33:01 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 15:33:01 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 15:33:01 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "token_cost": 1, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 15:33:01 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage3 plan_accuracy | ratio=0.400 | slot_score=-0.878 | unnecessary_penalty=-0.000 | score=-0.878 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage4 token | skipped due to incomplete slots +2026-04-07 15:33:01 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.878 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage5 reward | final_reward=-0.878 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 15:33:01 | INFO | __main__ | Reward after step: -0.8784 +2026-04-07 15:33:01 | INFO | __main__ | Done after step: False +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8784358578920691, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 15:33:01 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 15:33:01 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 15:33:01 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 15:33:01 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 15:33:01 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.800 +2026-04-07 15:33:01 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.800 +2026-04-07 15:33:01 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 15:33:01 | INFO | __main__ | Reward after step: -0.8000 +2026-04-07 15:33:01 | INFO | __main__ | Done after step: False +2026-04-07 15:33:01 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.8, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 15:33:01 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 15:33:01 | INFO | __main__ | ==================================================================================================== +2026-04-07 15:33:01 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.8175744761936437, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.6652409557748219, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.06, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.9569245128549835, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.9414740061488345, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.0, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.8784358578920691, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.8, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 15:33:01 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_153300.log diff --git a/reward_logs/reward_test_20260407_232357.log b/reward_logs/reward_test_20260407_232357.log new file mode 100644 index 0000000000000000000000000000000000000000..5d131c5598a627f188db23f05b8310441e126424 --- /dev/null +++ b/reward_logs/reward_test_20260407_232357.log @@ -0,0 +1,1979 @@ +2026-04-07 23:23:57 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_232357.log +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 23:23:57 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_232357.log +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:23:57 | INFO | __main__ | Episode reset complete +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.0071 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.0643 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.043 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.0429 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.04285714285714285, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:23:57 | INFO | __main__ | Episode reset complete +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.0071 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.1071 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10714285714285712, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.500 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: 0.5000 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.5, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:23:57 | INFO | __main__ | Episode reset complete +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.2000 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.1071 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10714285714285712, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.096 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.0964 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.09642857142857142, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:23:57 | INFO | __main__ | Episode reset complete +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.450 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: 0.4500 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.45, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:23:57 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:23:57 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.0643 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 23:23:57 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:23:57 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:23:57 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:23:57 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:23:57 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:23:57 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:23:57 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:23:57 | INFO | __main__ | Reward after step: -0.2000 +2026-04-07 23:23:57 | INFO | __main__ | Done after step: False +2026-04-07 23:23:57 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:23:57 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 23:23:57 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:23:57 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.04285714285714285, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.10714285714285712, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.5, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.10714285714285712, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.09642857142857142, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.45, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 23:23:57 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_232357.log diff --git a/reward_logs/reward_test_20260407_233554.log b/reward_logs/reward_test_20260407_233554.log new file mode 100644 index 0000000000000000000000000000000000000000..0f51f52f3f50b829277b542357515c97a6a2b2be --- /dev/null +++ b/reward_logs/reward_test_20260407_233554.log @@ -0,0 +1,1979 @@ +2026-04-07 23:35:54 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_233554.log +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 23:35:54 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_233554.log +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:35:54 | INFO | __main__ | Episode reset complete +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.0071 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.0643 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.043 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.0429 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.04285714285714285, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:35:54 | INFO | __main__ | Episode reset complete +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.0071 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.1071 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10714285714285712, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.500 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: 0.5000 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.5, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:35:54 | INFO | __main__ | Episode reset complete +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.2000 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.1071 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10714285714285712, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.096 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.0964 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.09642857142857142, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:35:54 | INFO | __main__ | Episode reset complete +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.450 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: 0.4500 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.45, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:35:54 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:35:54 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.0643 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 23:35:54 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:35:54 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:35:54 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:35:54 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:35:54 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:35:54 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:35:54 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:35:54 | INFO | __main__ | Reward after step: -0.2000 +2026-04-07 23:35:54 | INFO | __main__ | Done after step: False +2026-04-07 23:35:54 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:35:54 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 23:35:54 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:35:54 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.04285714285714285, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.10714285714285712, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.5, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.10714285714285712, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.09642857142857142, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.45, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 23:35:54 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_233554.log diff --git a/reward_logs/reward_test_20260407_234819.log b/reward_logs/reward_test_20260407_234819.log new file mode 100644 index 0000000000000000000000000000000000000000..05a614366a370181025569cd30774bb9055bebed --- /dev/null +++ b/reward_logs/reward_test_20260407_234819.log @@ -0,0 +1,1979 @@ +2026-04-07 23:48:19 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_234819.log +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-07 23:48:19 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_234819.log +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:48:19 | INFO | __main__ | Episode reset complete +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.0071 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.0643 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.043 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.0429 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.04285714285714285, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:48:19 | INFO | __main__ | Episode reset complete +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.0071 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.1071 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10714285714285712, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.500 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: 0.5000 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.5, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:48:19 | INFO | __main__ | Episode reset complete +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.2000 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.107 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.107 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.1071 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10714285714285712, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.096 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.0964 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.09642857142857142, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | server.tools | Building fresh atomic tools list. +2026-04-07 23:48:19 | INFO | __main__ | Episode reset complete +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.450 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: 0.4500 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.45, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-07 23:48:19 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-07 23:48:19 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.0643 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-07 23:48:19 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-07 23:48:19 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-07 23:48:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-07 23:48:19 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-07 23:48:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-07 23:48:19 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-07 23:48:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-07 23:48:19 | INFO | __main__ | Reward after step: -0.2000 +2026-04-07 23:48:19 | INFO | __main__ | Done after step: False +2026-04-07 23:48:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-07 23:48:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-07 23:48:19 | INFO | __main__ | ==================================================================================================== +2026-04-07 23:48:19 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.04285714285714285, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.10714285714285712, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.5, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.10714285714285712, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.09642857142857142, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.45, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-07 23:48:19 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260407_234819.log diff --git a/reward_logs/reward_test_20260408_000056.log b/reward_logs/reward_test_20260408_000056.log new file mode 100644 index 0000000000000000000000000000000000000000..d47a99e2e61048361378642683f678ea619a4821 --- /dev/null +++ b/reward_logs/reward_test_20260408_000056.log @@ -0,0 +1,1979 @@ +2026-04-08 00:00:56 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_000056.log +2026-04-08 00:00:56 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:56 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-08 00:00:56 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:56 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-08 00:00:56 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_000056.log +2026-04-08 00:00:56 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:56 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-08 00:00:56 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:56 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:00:56 | INFO | __main__ | Episode reset complete +2026-04-08 00:00:56 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:00:56 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:00:56 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:56 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-08 00:00:56 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:56 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-08 00:00:56 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:00:56 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:00:56 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:00:56 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:00:56 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-08 00:00:56 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:00:56 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:00:56 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:00:59 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:00:59 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-08 00:00:59 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:00:59 | INFO | __main__ | Reward after step: -0.0071 +2026-04-08 00:00:59 | INFO | __main__ | Done after step: False +2026-04-08 00:00:59 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:00:59 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:00:59 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:59 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-08 00:00:59 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:00:59 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-08 00:00:59 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:00:59 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:00:59 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:00:59 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:00:59 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:00:59 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:02 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:02 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-08 00:01:02 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:01:02 | INFO | __main__ | Reward after step: -0.0643 +2026-04-08 00:01:02 | INFO | __main__ | Done after step: False +2026-04-08 00:01:02 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:02 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:02 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:02 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-08 00:01:02 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:02 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-08 00:01:02 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:01:02 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:01:02 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:02 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:01:02 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:01:02 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:05 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['scaling_execution', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:05 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.043 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.043 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.043 +2026-04-08 00:01:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:01:05 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-08 00:01:05 | INFO | __main__ | Reward after step: -0.0429 +2026-04-08 00:01:05 | INFO | __main__ | Done after step: False +2026-04-08 00:01:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.04285714285714285, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:01:05 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:05 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-08 00:01:05 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:01:05 | INFO | __main__ | Episode reset complete +2026-04-08 00:01:05 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:05 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:05 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:05 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-08 00:01:05 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:05 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-08 00:01:05 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:01:05 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:01:05 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:05 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:01:05 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:01:05 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:07 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:07 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.007 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=-0.007 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.007 +2026-04-08 00:01:07 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:01:07 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-08 00:01:07 | INFO | __main__ | Reward after step: -0.0071 +2026-04-08 00:01:07 | INFO | __main__ | Done after step: False +2026-04-08 00:01:07 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.007142857142857134, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:07 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:01:07 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:07 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-08 00:01:07 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:07 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-08 00:01:07 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:01:07 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:01:07 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:01:07 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:01:07 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-08 00:01:07 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:11 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:11 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-08 00:01:11 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:01:11 | INFO | __main__ | Reward after step: -0.0643 +2026-04-08 00:01:11 | INFO | __main__ | Done after step: False +2026-04-08 00:01:11 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:11 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:01:11 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:11 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-08 00:01:11 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:11 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-08 00:01:11 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:01:11 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:01:11 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:11 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:01:11 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-08 00:01:11 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:14 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:01:14 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.500 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-08 00:01:14 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:01:14 | INFO | __main__ | Reward after step: 0.5000 +2026-04-08 00:01:14 | INFO | __main__ | Done after step: False +2026-04-08 00:01:14 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.5, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:14 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:01:14 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:14 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-08 00:01:14 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:14 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:01:14 | INFO | __main__ | Episode reset complete +2026-04-08 00:01:14 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:14 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:14 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:14 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-08 00:01:14 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:14 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-08 00:01:14 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:01:14 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:01:14 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:14 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:01:14 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:01:14 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:01:14 | INFO | __main__ | Reward after step: -0.2000 +2026-04-08 00:01:14 | INFO | __main__ | Done after step: False +2026-04-08 00:01:14 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:14 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:14 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:14 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-08 00:01:14 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:14 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-08 00:01:14 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:01:14 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:01:14 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:01:14 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:01:14 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-08 00:01:14 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:18 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage2 slots | filled=[] | missing=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:18 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.150 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.000 | slot_score=-0.150 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.000 < 1.0) +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.150 +2026-04-08 00:01:18 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:01:18 | INFO | __main__ | Reward after step: -0.1500 +2026-04-08 00:01:18 | INFO | __main__ | Done after step: False +2026-04-08 00:01:18 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.15, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:18 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:18 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:18 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-08 00:01:18 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:18 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-08 00:01:18 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:01:18 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:01:18 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:18 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:01:18 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-08 00:01:18 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:21 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.096 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.096 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.096 +2026-04-08 00:01:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:01:21 | INFO | __main__ | Reward after step: -0.0964 +2026-04-08 00:01:21 | INFO | __main__ | Done after step: False +2026-04-08 00:01:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.09642857142857142, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:21 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:21 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-08 00:01:21 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:21 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:01:21 | INFO | __main__ | Episode reset complete +2026-04-08 00:01:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:21 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:21 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-08 00:01:21 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:21 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-08 00:01:21 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:01:21 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:01:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:21 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:01:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-08 00:01:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:24 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:01:24 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.450 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-08 00:01:24 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:01:24 | INFO | __main__ | Reward after step: 0.4500 +2026-04-08 00:01:24 | INFO | __main__ | Done after step: False +2026-04-08 00:01:24 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.45, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:24 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:24 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:24 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-08 00:01:24 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:24 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-08 00:01:24 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:01:24 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:01:24 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:01:24 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:01:24 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:01:24 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:01:27 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:01:27 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.064 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.064 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.064 +2026-04-08 00:01:27 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:01:27 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-08 00:01:27 | INFO | __main__ | Reward after step: -0.0643 +2026-04-08 00:01:27 | INFO | __main__ | Done after step: False +2026-04-08 00:01:27 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.06428571428571427, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:27 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:27 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:27 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-08 00:01:27 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:27 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-08 00:01:27 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:01:27 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:01:27 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:01:27 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:01:27 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:01:27 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:01:27 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:01:27 | INFO | __main__ | Reward after step: -0.2000 +2026-04-08 00:01:27 | INFO | __main__ | Done after step: False +2026-04-08 00:01:27 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:01:27 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:01:27 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:27 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-08 00:01:27 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:01:27 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.04285714285714285, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': -0.007142857142857134, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.5, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.15, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.09642857142857142, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.45, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.06428571428571427, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-08 00:01:27 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_000056.log diff --git a/reward_logs/reward_test_20260408_002415.log b/reward_logs/reward_test_20260408_002415.log new file mode 100644 index 0000000000000000000000000000000000000000..f7424a5d1394ef1c0497de1714c95fb3c3afc2e3 --- /dev/null +++ b/reward_logs/reward_test_20260408_002415.log @@ -0,0 +1,1979 @@ +2026-04-08 00:24:15 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_002415.log +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-08 00:24:15 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_002415.log +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:24:15 | INFO | __main__ | Episode reset complete +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: 0.0119 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.011904761904761862, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.0577 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.05769230769230768, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution'] | missing=['deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.035 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.035 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.035 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.0346 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.034615384615384624, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:24:15 | INFO | __main__ | Episode reset complete +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: 0.0119 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.011904761904761862, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.104 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.1038 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10384615384615384, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.500 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: 0.5000 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.5, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:24:15 | INFO | __main__ | Episode reset complete +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.2000 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.200 | slot_score=-0.104 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.200 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.104 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.1038 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.10384615384615384, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.092 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.092 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.092 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.0923 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.09230769230769231, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:24:15 | INFO | __main__ | Episode reset complete +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.450 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: 0.4500 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.45, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:24:15 | WARNING | toolforge_env.server.plan_evaluator | LLM slot judge failed, falling back to simulated judgment: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:24:15 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.0577 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.05769230769230768, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-08 00:24:15 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:24:15 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:24:15 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:24:15 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:24:15 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:24:15 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:24:15 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:24:15 | INFO | __main__ | Reward after step: -0.2000 +2026-04-08 00:24:15 | INFO | __main__ | Done after step: False +2026-04-08 00:24:15 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:24:15 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-08 00:24:15 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:24:15 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': 0.011904761904761862, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.05769230769230768, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.034615384615384624, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': 0.011904761904761862, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.10384615384615384, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.5, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.10384615384615384, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.09230769230769231, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.45, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.05769230769230768, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-08 00:24:15 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_002415.log diff --git a/reward_logs/reward_test_20260408_002608.log b/reward_logs/reward_test_20260408_002608.log new file mode 100644 index 0000000000000000000000000000000000000000..ad804d36ee50527e0cc8ea64748547a89c2b8dc3 --- /dev/null +++ b/reward_logs/reward_test_20260408_002608.log @@ -0,0 +1,1979 @@ +2026-04-08 00:26:08 | INFO | __main__ | Reward logging initialized: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_002608.log +2026-04-08 00:26:08 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:08 | INFO | __main__ | REWARD TEST HARNESS START +2026-04-08 00:26:08 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:08 | INFO | __main__ | This harness focuses on reward-relevant scenarios and logs all step/observation details. +2026-04-08 00:26:08 | INFO | __main__ | Log file path: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_002608.log +2026-04-08 00:26:08 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:08 | INFO | __main__ | Episode A - Macro Maturity Threshold +2026-04-08 00:26:08 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:08 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:26:08 | INFO | __main__ | Episode reset complete +2026-04-08 00:26:08 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:08 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:08 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:08 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 1 | Scenario: repeat-sequence-seed-1 +2026-04-08 00:26:08 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:08 | INFO | __main__ | Expected behavior: First appearance of deploy->healthcheck sequence. +2026-04-08 00:26:08 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:26:08 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:26:08 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:08 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:26:08 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:08 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:08 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:08 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:11 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:11 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.012 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:26:11 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:26:11 | INFO | __main__ | Reward after step: 0.0119 +2026-04-08 00:26:11 | INFO | __main__ | Done after step: False +2026-04-08 00:26:11 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.011904761904761862, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:11 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:11 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:11 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 2 | Scenario: repeat-sequence-seed-2 +2026-04-08 00:26:11 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:11 | INFO | __main__ | Expected behavior: Second appearance of deploy->healthcheck sequence. +2026-04-08 00:26:11 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:26:11 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:26:11 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:26:11 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:26:11 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:11 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:13 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:13 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.058 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:26:13 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:26:13 | INFO | __main__ | Reward after step: -0.0577 +2026-04-08 00:26:13 | INFO | __main__ | Done after step: False +2026-04-08 00:26:13 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.05769230769230768, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:13 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 4, + "sequence_counts": { + "('deploy', 'healthcheck')": 2 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:13 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:13 | INFO | __main__ | Episode A - Macro Maturity Threshold | Step 3 | Scenario: mature-macro-creation +2026-04-08 00:26:13 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:13 | INFO | __main__ | Expected behavior: Macro proposal should now have prior sequence history available. +2026-04-08 00:26:13 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:26:13 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:26:13 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:13 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:26:13 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:13 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:16 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['scaling_execution', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:16 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.035 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.500 | slot_score=-0.035 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.500 < 1.0) +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.035 +2026-04-08 00:26:16 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:26:16 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-08 00:26:16 | INFO | __main__ | Reward after step: -0.0346 +2026-04-08 00:26:16 | INFO | __main__ | Done after step: False +2026-04-08 00:26:16 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.034615384615384624, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:16 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-a---macro-maturity-threshold", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 3 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:26:16 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:16 | INFO | __main__ | Episode B - Premature Macro and Macro Usage +2026-04-08 00:26:16 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:16 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:26:16 | INFO | __main__ | Episode reset complete +2026-04-08 00:26:16 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:16 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:16 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:16 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 1 | Scenario: premature-macro-creation +2026-04-08 00:26:16 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:16 | INFO | __main__ | Expected behavior: Macro proposal occurs before enough prior sequence repetition; no recognition reward expected. +2026-04-08 00:26:16 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:26:16 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:26:16 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:16 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:26:16 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + } +} +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:16 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:18 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:18 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.012 +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.667 | slot_score=0.012 +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:18 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.667 < 1.0) +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.012 +2026-04-08 00:26:19 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:26:19 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'] +2026-04-08 00:26:19 | INFO | __main__ | Reward after step: 0.0119 +2026-04-08 00:26:19 | INFO | __main__ | Done after step: False +2026-04-08 00:26:19 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.011904761904761862, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "approved", + "macro_name": "deploy_and_verify_macro", + "macro_reason": "macro_registered", + "accepted_macro_count": 1, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:19 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:26:19 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:19 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 2 | Scenario: plan-with-macro-tool-call +2026-04-08 00:26:19 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:19 | INFO | __main__ | Expected behavior: Plan uses the approved macro directly on the next task. +2026-04-08 00:26:19 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:26:19 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:26:19 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:26:19 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:26:19 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro'] +2026-04-08 00:26:19 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:21 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:21 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.058 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:26:21 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:26:21 | INFO | __main__ | Reward after step: -0.0577 +2026-04-08 00:26:21 | INFO | __main__ | Done after step: False +2026-04-08 00:26:21 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.05769230769230768, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:21 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 1 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:26:21 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:21 | INFO | __main__ | Episode B - Premature Macro and Macro Usage | Step 3 | Scenario: plan-with-macro-and-atomic +2026-04-08 00:26:21 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:21 | INFO | __main__ | Expected behavior: Plan mixes an approved macro call with atomic tool calls. +2026-04-08 00:26:21 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:26:21 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:26:21 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:21 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:26:21 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy_and_verify_macro" + }, + { + "tool_name": "scale" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=4 +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Plan tools=['deploy_and_verify_macro', 'scale', 'healthcheck', 'notify'] +2026-04-08 00:26:21 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:25 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:26:25 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.500 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.050 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=4 | baseline=4 | efficiency_score=0.200 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.500 +2026-04-08 00:26:25 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:26:25 | INFO | __main__ | Reward after step: 0.5000 +2026-04-08 00:26:25 | INFO | __main__ | Done after step: False +2026-04-08 00:26:25 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.5, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 1, + "step_call_count": 4, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy_and_verify_macro", + "description": "Deploy service and run a healthcheck.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ] + }, + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:25 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-b---premature-macro-and-macro-usage", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [ + "deploy_and_verify_macro" + ], + "rejected_macro_count": 0, + "tokens_used": 7, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('deploy_and_verify_macro', 'scale')": 1, + "('scale', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck')": 1, + "('scale', 'healthcheck', 'notify')": 1, + "('deploy_and_verify_macro', 'scale', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": { + "deploy_and_verify_macro": 2 + }, + "macro_definitions": { + "deploy_and_verify_macro": [ + "deploy", + "healthcheck" + ] + } +} +2026-04-08 00:26:25 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:25 | INFO | __main__ | Episode C - Slot Fill and Validation Paths +2026-04-08 00:26:25 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:25 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:26:25 | INFO | __main__ | Episode reset complete +2026-04-08 00:26:25 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:25 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:25 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:25 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 1 | Scenario: wrong-tool-call +2026-04-08 00:26:25 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:25 | INFO | __main__ | Expected behavior: Stage 1 validation should reject the plan because the tool name does not exist. +2026-04-08 00:26:25 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:26:25 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:26:25 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:25 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:26:25 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "wrong_tool" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Plan tools=['wrong_tool'] +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:26:25 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:26:25 | INFO | __main__ | Reward after step: -0.2000 +2026-04-08 00:26:25 | INFO | __main__ | Done after step: False +2026-04-08 00:26:25 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 1, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "wrong_tool" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:25 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 1, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:25 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:25 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 2 | Scenario: zero-filled-slots +2026-04-08 00:26:25 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:25 | INFO | __main__ | Expected behavior: Plan should produce zero useful slot fill with semantically unrelated valid tools. +2026-04-08 00:26:25 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:26:25 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:26:25 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:26:25 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:26:25 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "scale" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Plan tools=['scale'] +2026-04-08 00:26:25 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:27 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage2 slots | filled=[] | missing=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:27 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.150 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.000 | slot_score=-0.150 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.000 < 1.0) +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.150 +2026-04-08 00:26:27 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:26:27 | INFO | __main__ | Reward after step: -0.1500 +2026-04-08 00:26:27 | INFO | __main__ | Done after step: False +2026-04-08 00:26:27 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.15, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:27 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 2, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:27 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:27 | INFO | __main__ | Episode C - Slot Fill and Validation Paths | Step 3 | Scenario: partially-filled-slots +2026-04-08 00:26:27 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:27 | INFO | __main__ | Expected behavior: Plan should fill only part of the required workflow. +2026-04-08 00:26:27 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:26:27 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:26:27 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:27 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:26:27 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Plan tools=['deploy'] +2026-04-08 00:26:27 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:30 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution'] | missing=['scaling_execution', 'deployment_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:30 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.092 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.250 | slot_score=-0.092 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.250 < 1.0) +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.092 +2026-04-08 00:26:30 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:26:30 | INFO | __main__ | Reward after step: -0.0923 +2026-04-08 00:26:30 | INFO | __main__ | Done after step: False +2026-04-08 00:26:30 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.09230769230769231, + "metadata": { + "step": 3, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:30 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-c---slot-fill-and-validation-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:30 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:30 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths +2026-04-08 00:26:30 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:30 | INFO | server.tools | Building fresh atomic tools list. +2026-04-08 00:26:30 | INFO | __main__ | Episode reset complete +2026-04-08 00:26:30 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.0, + "metadata": { + "summary": "Episode initialized.", + "task_prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "task_level": "easy", + "progression": "episode_started" + }, + "current_task": { + "id": "easy-deploy-notify", + "prompt": "Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 3, + "baseline_call_count": 3 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:30 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 0, + "current_task_id": "easy-deploy-notify", + "task_queue_size": 0, + "completed_tasks": [], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 0, + "sequence_counts": {}, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:30 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:30 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 1 | Scenario: all-filled-slots +2026-04-08 00:26:30 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:30 | INFO | __main__ | Expected behavior: Plan should fully satisfy the current task using atomic tools. +2026-04-08 00:26:30 | INFO | __main__ | Current task id=easy-deploy-notify +2026-04-08 00:26:30 | INFO | __main__ | Current task prompt=Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. This team usually follows the same deploy, verify, notify rhythm. +2026-04-08 00:26:30 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:30 | INFO | __main__ | Current task baseline_call_count=3 +2026-04-08 00:26:30 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + }, + { + "tool_name": "notify" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-notify | required_slots=['deployment_execution', 'deployment_verification', 'deployment_notification'] | plan_len=3 +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck', 'notify'] +2026-04-08 00:26:30 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:33 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification', 'deployment_notification'] | missing=[] | complete=True | harmful=False +2026-04-08 00:26:33 | INFO | toolforge_env.server.plan_evaluator | Final Reward: 0.450 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=1.000 | slot_score=0.250 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage4 efficiency | used=3 | baseline=3 | efficiency_score=0.200 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=0.450 +2026-04-08 00:26:33 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-08 00:26:33 | INFO | __main__ | Reward after step: 0.4500 +2026-04-08 00:26:33 | INFO | __main__ | Done after step: False +2026-04-08 00:26:33 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": 0.45, + "metadata": { + "step": 1, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 3, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-restart", + "prompt": "Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification", + "restart_execution", + "restart_verification", + "deployment_notification" + ], + "baseline_token_cost": 5, + "baseline_call_count": 5 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:33 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 1, + "current_task_id": "easy-deploy-restart", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify" + ], + "accepted_macros": [], + "rejected_macro_count": 0, + "tokens_used": 3, + "sequence_counts": { + "('deploy', 'healthcheck')": 1, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:33 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:33 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 2 | Scenario: wrong-macro-creation-attempt +2026-04-08 00:26:33 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:33 | INFO | __main__ | Expected behavior: Macro proposal should be rejected because it contains an invalid tool in its steps. +2026-04-08 00:26:33 | INFO | __main__ | Current task id=easy-deploy-restart +2026-04-08 00:26:33 | INFO | __main__ | Current task prompt=Deploy 'backend-api' version 'v1.4.2', check its health. It usually needs a restart after deployment, so restart it, check health again, and then notify '#backend-ops' that the deploy is complete. The verify steps tend to repeat in this workflow. +2026-04-08 00:26:33 | INFO | __main__ | Current task required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] +2026-04-08 00:26:33 | INFO | __main__ | Current task baseline_call_count=5 +2026-04-08 00:26:33 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan_with_macro", + "plan": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "healthcheck" + } + ], + "macro_proposal": { + "name": "broken_macro", + "description": "Contains an invalid tool and should be rejected.", + "is_macro": true, + "steps": [ + { + "tool_name": "deploy" + }, + { + "tool_name": "wrong_tool" + } + ] + } +} +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-restart | required_slots=['deployment_execution', 'deployment_verification', 'restart_execution', 'restart_verification', 'deployment_notification'] | plan_len=2 +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Plan tools=['deploy', 'healthcheck'] +2026-04-08 00:26:33 | INFO | server.evaluation_pipeline | Stage1 validation | valid=True | reason=VALID | penalty=0.000 +2026-04-08 00:26:38 | INFO | httpx | HTTP Request: POST https://router.huggingface.co/v1/chat/completions "HTTP/1.1 200 OK" +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage2 slots | filled=['deployment_execution', 'deployment_verification'] | missing=['restart_execution', 'restart_verification', 'deployment_notification'] | complete=False | harmful=False +2026-04-08 00:26:38 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.058 +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage2 slot_score | slot_ratio=0.400 | slot_score=-0.058 +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage3 macro_bonuses | macro_creation=0.000 | macro_usage=0.000 +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage4 efficiency | skipped (slot_ratio=0.400 < 1.0) +2026-04-08 00:26:38 | INFO | server.evaluation_pipeline | Stage5 final_reward | final_reward=-0.058 +2026-04-08 00:26:38 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-08 00:26:38 | INFO | server.toolforge_env_environment | Macro rejected: name='broken_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-08 00:26:38 | INFO | __main__ | Reward after step: -0.0577 +2026-04-08 00:26:39 | INFO | __main__ | Done after step: False +2026-04-08 00:26:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.05769230769230768, + "metadata": { + "step": 2, + "summary": "Plan validated, slots judged, final reward applied.", + "passed_validation": true, + "plan_accepted": true, + "task_prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": true, + "macro_decision": "rejected", + "macro_name": "broken_macro", + "macro_reason": "macro_contains_unknown_tools:wrong_tool", + "accepted_macro_count": 0, + "step_call_count": 2, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [], + "last_approval": true + }, + "current_task": { + "id": "easy-deploy-scale", + "prompt": "Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "scaling_execution", + "deployment_verification", + "deployment_notification" + ], + "baseline_token_cost": 4, + "baseline_call_count": 4 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 2, + "current_task_id": "easy-deploy-scale", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 5, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:39 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:39 | INFO | __main__ | Episode D - Full Fill and Macro Failure Paths | Step 3 | Scenario: wrong-macro-tool-call +2026-04-08 00:26:39 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:39 | INFO | __main__ | Expected behavior: Validation should reject the plan because the macro name does not exist. +2026-04-08 00:26:39 | INFO | __main__ | Current task id=easy-deploy-scale +2026-04-08 00:26:39 | INFO | __main__ | Current task prompt=Deploy 'analytics-engine' version 'v3.0.0', then quickly scale it to 10 replicas for the incoming load test. Check health to verify and notify '#data-team'. Operators often reuse the same deploy then verify pattern before the final message. +2026-04-08 00:26:39 | INFO | __main__ | Current task required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] +2026-04-08 00:26:39 | INFO | __main__ | Current task baseline_call_count=4 +2026-04-08 00:26:39 | INFO | __main__ | Action payload: +{ + "metadata": {}, + "action_type": "propose_plan", + "plan": [ + { + "tool_name": "missing_macro_name" + } + ], + "macro_proposal": null +} +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Pipeline start | task_id=easy-deploy-scale | required_slots=['deployment_execution', 'scaling_execution', 'deployment_verification', 'deployment_notification'] | plan_len=1 +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Plan tools=['missing_macro_name'] +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Stage1 validation | valid=False | reason=INVALID_TOOL | penalty=-0.200 +2026-04-08 00:26:39 | INFO | server.evaluation_pipeline | Pipeline end (validation short-circuit) | reward=-0.200 +2026-04-08 00:26:39 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-scale' to 'easy-deploy-verify-only'. Remaining tasks=0 +2026-04-08 00:26:39 | INFO | __main__ | Reward after step: -0.2000 +2026-04-08 00:26:39 | INFO | __main__ | Done after step: False +2026-04-08 00:26:39 | INFO | __main__ | Observation snapshot: +{ + "done": false, + "reward": -0.2, + "metadata": { + "step": 3, + "summary": "Validation failed: INVALID_TOOL", + "passed_validation": false, + "plan_accepted": false, + "task_prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "task_level": "easy", + "progression": "advanced_to_next_task", + "macro_attempted": false, + "macro_decision": "none", + "macro_name": null, + "macro_reason": "no_macro_proposal", + "accepted_macro_count": 0, + "step_call_count": 1, + "token_accounting_source": "tool_registry", + "unknown_tool_calls": [ + "missing_macro_name" + ], + "last_approval": false + }, + "current_task": { + "id": "easy-deploy-verify-only", + "prompt": "Deploy 'gateway-core' and confirm it turns healthy. This one stops right after the familiar deploy and verify sequence.", + "difficulty": "easy", + "required_slots": [ + "deployment_execution", + "deployment_verification" + ], + "baseline_token_cost": 2, + "baseline_call_count": 2 + }, + "available_tools": [ + { + "name": "deploy", + "description": "Deploys a specified service or application version to a target environment.", + "is_macro": false, + "steps": [] + }, + { + "name": "healthcheck", + "description": "Checks the current health status of a running service.", + "is_macro": false, + "steps": [] + }, + { + "name": "notify", + "description": "Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + "is_macro": false, + "steps": [] + }, + { + "name": "rollback", + "description": "Reverts a deployed service to the previous stable version if something goes wrong.", + "is_macro": false, + "steps": [] + }, + { + "name": "scale", + "description": "Adjusts the number of running replicas for a given service.", + "is_macro": false, + "steps": [] + }, + { + "name": "restart", + "description": "Performs a rolling restart on a specified service.", + "is_macro": false, + "steps": [] + } + ] +} +2026-04-08 00:26:39 | INFO | __main__ | Environment state snapshot: +{ + "episode_id": "episode-d---full-fill-and-macro-failure-paths", + "step_count": 3, + "current_task_id": "easy-deploy-verify-only", + "task_queue_size": 0, + "completed_tasks": [ + "easy-deploy-notify", + "easy-deploy-restart", + "easy-deploy-scale" + ], + "accepted_macros": [], + "rejected_macro_count": 1, + "tokens_used": 6, + "sequence_counts": { + "('deploy', 'healthcheck')": 2, + "('healthcheck', 'notify')": 1, + "('deploy', 'healthcheck', 'notify')": 1 + }, + "macro_usage_counts": {}, + "macro_definitions": {} +} +2026-04-08 00:26:39 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:39 | INFO | __main__ | REWARD TEST SUMMARY +2026-04-08 00:26:39 | INFO | __main__ | ==================================================================================================== +2026-04-08 00:26:39 | INFO | __main__ | Summary rows: +"[{'episode': 'Episode A - Macro Maturity Threshold', 'step': 1, 'scenario': 'repeat-sequence-seed-1', 'task_id': 'easy-deploy-notify', 'reward': 0.011904761904761862, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 2, 'scenario': 'repeat-sequence-seed-2', 'task_id': 'easy-deploy-restart', 'reward': -0.05769230769230768, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode A - Macro Maturity Threshold', 'step': 3, 'scenario': 'mature-macro-creation', 'task_id': 'easy-deploy-scale', 'reward': -0.034615384615384624, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 1, 'scenario': 'premature-macro-creation', 'task_id': 'easy-deploy-notify', 'reward': 0.011904761904761862, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'approved'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 2, 'scenario': 'plan-with-macro-tool-call', 'task_id': 'easy-deploy-restart', 'reward': -0.05769230769230768, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode B - Premature Macro and Macro Usage', 'step': 3, 'scenario': 'plan-with-macro-and-atomic', 'task_id': 'easy-deploy-scale', 'reward': 0.5, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 1, 'scenario': 'wrong-tool-call', 'task_id': 'easy-deploy-notify', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 2, 'scenario': 'zero-filled-slots', 'task_id': 'easy-deploy-restart', 'reward': -0.15, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode C - Slot Fill and Validation Paths', 'step': 3, 'scenario': 'partially-filled-slots', 'task_id': 'easy-deploy-scale', 'reward': -0.09230769230769231, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 1, 'scenario': 'all-filled-slots', 'task_id': 'easy-deploy-notify', 'reward': 0.45, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'none'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 2, 'scenario': 'wrong-macro-creation-attempt', 'task_id': 'easy-deploy-restart', 'reward': -0.05769230769230768, 'done': False, 'summary': 'Plan validated, slots judged, final reward applied.', 'plan_accepted': True, 'macro_decision': 'rejected'}, {'episode': 'Episode D - Full Fill and Macro Failure Paths', 'step': 3, 'scenario': 'wrong-macro-tool-call', 'task_id': 'easy-deploy-scale', 'reward': -0.2, 'done': False, 'summary': 'Validation failed: INVALID_TOOL', 'plan_accepted': False, 'macro_decision': 'none'}]" +2026-04-08 00:26:39 | INFO | __main__ | Reward test harness complete. Detailed logs written to F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\reward_logs\reward_test_20260408_002608.log diff --git a/server/__init__.py b/server/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1de6da72fc447bc22d1757cdaadd2f1652e0a6fb --- /dev/null +++ b/server/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +"""Toolforge Env environment server components.""" + +from .toolforge_env_environment import ToolforgeEnvironment + +__all__ = ["ToolforgeEnvironment"] diff --git a/server/app.py b/server/app.py new file mode 100644 index 0000000000000000000000000000000000000000..9d72327835ef2f412e074fd193aaabc39a702c55 --- /dev/null +++ b/server/app.py @@ -0,0 +1,88 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +""" +FastAPI application for the Toolforge Env Environment. + +This module creates an HTTP server that exposes the ToolforgeEnvironment +over HTTP and WebSocket endpoints, compatible with EnvClient. + +Endpoints: + - POST /reset: Reset the environment + - POST /step: Execute an action + - GET /state: Get current environment state + - GET /schema: Get action/observation schemas + - WS /ws: WebSocket endpoint for persistent sessions + +Usage: + # Development (with auto-reload): + uvicorn server.app:app --reload --host 0.0.0.0 --port 8000 + + # Production: + uvicorn server.app:app --host 0.0.0.0 --port 8000 --workers 4 + + # Or run directly: + python -m server.app +""" + +try: + from openenv.core.env_server.http_server import create_app +except Exception as e: # pragma: no cover + raise ImportError( + "openenv is required for the web interface. Install dependencies with '\n uv sync\n'" + ) from e + +try: + from models import ToolforgeAction, ToolforgeObservation + from server.toolforge_env_environment import ToolforgeEnvironment +except ModuleNotFoundError: + from ..models import ToolforgeAction, ToolforgeObservation + from .toolforge_env_environment import ToolforgeEnvironment + + +# Create the app with web interface and README integration +app = create_app( + ToolforgeEnvironment, + ToolforgeAction, + ToolforgeObservation, + env_name="toolforge_env", + max_concurrent_envs=1, # increase this number to allow more concurrent WebSocket sessions +) + + +def main(host: str = "0.0.0.0", port: int = 8000): + """ + Entry point for direct execution via uv run or python -m. + + This function enables running the server without Docker: + uv run --project . server + uv run --project . server --port 8001 + python -m toolforge_env.server.app + + Args: + host: Host address to bind to (default: "0.0.0.0") + port: Port number to listen on (default: 8000) + + For production deployments, consider using uvicorn directly with + multiple workers: + uvicorn toolforge_env.server.app:app --workers 4 + """ + import uvicorn + + uvicorn.run(app, host=host, port=port) + + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--port", type=int, default=8000) + args = parser.parse_args() + + + if args.port == 8000: + main() + else: + main(port=args.port) \ No newline at end of file diff --git a/server/environment/factory.py b/server/environment/factory.py new file mode 100644 index 0000000000000000000000000000000000000000..2de8e6a119c94af4687e9b47f45510511e1497a5 --- /dev/null +++ b/server/environment/factory.py @@ -0,0 +1,6 @@ +from server.toolforge_env_environment import ToolforgeEnvironment + +def create_env() -> ToolforgeEnvironment: + # mode unknown yet → placeholder + + return ToolforgeEnvironment() \ No newline at end of file diff --git a/server/evaluation_pipeline.py b/server/evaluation_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..358313dff973767c70f2d27abdbcee94f3f50ebe --- /dev/null +++ b/server/evaluation_pipeline.py @@ -0,0 +1,186 @@ +""" +Evaluation Pipeline Orchestrator + +Thin orchestration layer that chains the plan evaluation logic. + +Pipeline flow: +1. run_sanity_validation(...) +2. run_slot_judgment(...) +3. compute_step_reward(...) — slot score + macro bonuses + efficiency + +Short-circuits if validation fails, or if harmful calls are present. +Final reward is bounded to [-0.2, 1.0]. +""" + +import logging +from datetime import datetime +from pathlib import Path +from typing import Dict, List, Optional + +from models import PipelineResult, Task, Tool, ToolCall +from server.plan_evaluator import ( + get_relevant_slots, + run_sanity_validation, + run_slot_judgment, + compute_step_reward, + VALIDATION_PENALTY, + FINAL_REWARD_MIN, +) + + +logger = logging.getLogger(__name__) + + +def _ensure_reward_file_logger() -> None: + """Attach a file handler once so pipeline logs are persisted under reward_logs/.""" + log_dir = Path(__file__).resolve().parents[1] / "reward_logs" + log_dir.mkdir(parents=True, exist_ok=True) + + # Reuse any existing pipeline reward file handler. + for handler in logger.handlers: + if isinstance(handler, logging.FileHandler) and handler.get_name() == "pipeline_reward_file": + return + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_file = log_dir / f"pipeline_reward_{timestamp}.log" + + file_handler = logging.FileHandler(log_file, encoding="utf-8") + file_handler.set_name("pipeline_reward_file") + file_handler.setLevel(logging.INFO) + file_handler.setFormatter( + logging.Formatter( + "%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", + "%Y-%m-%d %H:%M:%S", + ) + ) + + logger.setLevel(logging.INFO) + logger.addHandler(file_handler) + logger.propagate = True + + +def run_evaluation_pipeline( + plan: List[ToolCall], + task: Task, + available_tools: Dict[str, Tool], + accepted_macros: List[Tool], + baseline_token_cost: int, + goal_achieved: bool = False, + sequence_counts: Optional[Dict[str, int]] = None, + macro_definitions: Optional[Dict[str, List[str]]] = None, + macro_proposal: Optional[Tool] = None, +) -> PipelineResult: + """Run the evaluation pipeline on a proposed plan.""" + _ensure_reward_file_logger() + + logger.info( + "Pipeline start | task_id=%s | required_slots=%s | plan_len=%d", + task.id, + task.required_slots, + len(plan), + ) + logger.info( + "Plan tools=%s", + [call.tool_name for call in plan], + ) + + # 1. run_sanity_validation(...) + validation = run_sanity_validation(plan, available_tools) + logger.info( + "Stage1 validation | valid=%s | reason=%s | penalty=%.3f", + validation.valid, + validation.reason, + validation.penalty, + ) + + if not validation.valid: + logger.info("Pipeline end (validation short-circuit) | reward=%.3f", VALIDATION_PENALTY) + # short-circuit immediately + return PipelineResult( + validation=validation, + slot_judgment=None, + plan_accuracy=None, + token_cost=None, + reward=VALIDATION_PENALTY, + passed_validation=False, + summary=f"Validation failed: {validation.reason}", + ) + + # 2. run_slot_judgment(...) + slot_judgment = run_slot_judgment( + task_prompt=task.prompt, + required_slots=task.required_slots, + slot_definitions=get_relevant_slots(task.required_slots), + available_tools=list(available_tools.values()), + plan=plan, + ) + logger.info( + "Stage2 slots | filled=%s | missing=%s | complete=%s | harmful=%s", + slot_judgment.slots_filled, + slot_judgment.slots_missing, + slot_judgment.task_complete, + slot_judgment.harmful_calls_present, + ) + + if slot_judgment.harmful_calls_present: + logger.info("Pipeline end (harmful short-circuit) | reward=%.3f", FINAL_REWARD_MIN) + # short-circuit immediately + return PipelineResult( + validation=validation, + slot_judgment=slot_judgment, + plan_accuracy=None, + token_cost=None, + reward=FINAL_REWARD_MIN, + passed_validation=True, + summary="Harmful tool call detected.", + ) + + # 3. Compute step reward (slot score + macro bonuses + efficiency) + reward_breakdown = compute_step_reward( + slot_judgment=slot_judgment, + task=task, + plan=plan, + available_tools=available_tools, + accepted_macros=accepted_macros, + macro_proposal=macro_proposal, + sequence_counts=sequence_counts, + ) + + slot_ratio = reward_breakdown["slot_ratio"] + slot_score = reward_breakdown["slot_score"] + macro_creation = reward_breakdown["macro_creation"] + macro_usage = reward_breakdown["macro_usage"] + efficiency_score = reward_breakdown["efficiency_score"] + final_reward = reward_breakdown["final_reward"] + + logger.info( + "Stage2 slot_score | slot_ratio=%.3f | slot_score=%.3f", + slot_ratio, + slot_score, + ) + logger.info( + "Stage3 macro_bonuses | macro_creation=%.3f | macro_usage=%.3f", + macro_creation, + macro_usage, + ) + if slot_ratio >= 1.0: + logger.info( + "Stage4 efficiency | used=%d | baseline=%d | efficiency_score=%.3f", + len(plan), + task.baseline_call_count, + efficiency_score, + ) + else: + logger.info("Stage4 efficiency | skipped (slot_ratio=%.3f < 1.0)", slot_ratio) + + logger.info("Stage5 final_reward | final_reward=%.3f", final_reward) + + return PipelineResult( + validation=validation, + slot_judgment=slot_judgment, + plan_accuracy=None, + token_cost=None, + reward=final_reward, + passed_validation=True, + summary="Plan validated, slots judged, final reward applied.", + ) diff --git a/server/inputs/__init__.py b/server/inputs/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/server/inputs/base.py b/server/inputs/base.py new file mode 100644 index 0000000000000000000000000000000000000000..34ea4885fcc21f7ef04bf8a89cebdb2ccba486de --- /dev/null +++ b/server/inputs/base.py @@ -0,0 +1,14 @@ +from abc import ABC, abstractmethod +from models import Task + + +class InputProvider(ABC): + """Abstract interface for all input sources.""" + + @abstractmethod + def get_input(self) -> Task: + pass + + @abstractmethod + def is_done(self) -> bool: + pass diff --git a/server/inputs/factory.py b/server/inputs/factory.py new file mode 100644 index 0000000000000000000000000000000000000000..542691f40a2073f70b2ebef1c8f50da492544bcd --- /dev/null +++ b/server/inputs/factory.py @@ -0,0 +1,5 @@ +from server.inputs.simulated.data_loader import SimulatedDataLoader + + +def create_input_provider(task_list): + return SimulatedDataLoader(task_list=task_list) \ No newline at end of file diff --git a/server/inputs/simulated/__init__.py b/server/inputs/simulated/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/server/inputs/simulated/data_loader.py b/server/inputs/simulated/data_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..b51a4220fa8f0a1b1b07ad659f4e56c026c8790f --- /dev/null +++ b/server/inputs/simulated/data_loader.py @@ -0,0 +1,24 @@ +from typing import Dict, Any, List +from server.inputs.base import InputProvider +from models import Task + + +class SimulatedDataLoader(InputProvider): + def __init__(self, task_list: Dict): + self.tasks: List[Task] = task_list["tasks"] + self.idx = 0 + + def get_input(self) -> Task: + if self.is_done(): + raise StopIteration + + task = self.tasks[self.idx] + self.idx += 1 + + return task + + def is_done(self) -> bool: + return self.idx >= len(self.tasks) + + def reset(self): + self.idx = 0 \ No newline at end of file diff --git a/server/inputs/simulated/task_selector.py b/server/inputs/simulated/task_selector.py new file mode 100644 index 0000000000000000000000000000000000000000..524d5263e305e288254aa16a3f385ac132c3eb8e --- /dev/null +++ b/server/inputs/simulated/task_selector.py @@ -0,0 +1,13 @@ +from typing import Dict, Any, List + +from server.inputs.simulated.tasks import TASKS + +class TaskSelector: + def __init__(self): + pass + + def next_task_list(self, task_id: str) -> Dict: + match = next((item for item in TASKS if item.get("task_id") == task_id), None) + if match is None: + raise ValueError(f"Unknown task_id: {task_id}") + return match \ No newline at end of file diff --git a/server/inputs/simulated/tasks.py b/server/inputs/simulated/tasks.py new file mode 100644 index 0000000000000000000000000000000000000000..04c355825618154aad69e8b35b8907c886da57df --- /dev/null +++ b/server/inputs/simulated/tasks.py @@ -0,0 +1,93 @@ +from models import Task + +TASKS = [ + { + "task_id": "easy-deployment-sprints", + "description": "Repetitive service rollout and validation cycles", + "tasks": [ + Task(id="e-dep-1", prompt="Deploy 'web-app' v1.1, check health, and notify #ops-chat.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="e-dep-2", prompt="Deploy 'api-v2' v2.0.4, verify health, and notify #dev-updates.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="e-dep-3", prompt="Deploy 'auth-svc' v3.1, run a healthcheck, and message #security.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="e-dep-4", prompt="Deploy 'search-ui' v1.5, check health status, and notify #product.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="e-dep-5", prompt="Deploy 'cart-logic' v2.2, confirm health, and alert #on-call.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="e-dep-6", prompt="Deploy 'notification-service' v4.0, run validation checks, and post to #releases.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="e-dep-7", prompt="Deploy 'image-processor' v1.0.1, check its health, and notify #media-team.", difficulty="easy", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + ] + }, + { + "task_id": "easy-resource-management", + "description": "Standard scaling and restart procedures", + "tasks": [ + Task(id="e-res-1", prompt="Scale 'worker-pool' to 5, check health, and notify #infra.", difficulty="easy", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + Task(id="e-res-2", prompt="Restart 'redis-cache', verify it is up, and notify #db-team.", difficulty="easy", required_slots=["restart_execution", "restart_verification", "restart_notification"], baseline_call_count=3), + Task(id="e-res-3", prompt="Scale 'ingress-node' to 10, check health, and notify #traffic-ops.", difficulty="easy", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + Task(id="e-res-4", prompt="Restart 'logging-pod', check health, and notify #monitoring.", difficulty="easy", required_slots=["restart_execution", "restart_verification", "restart_notification"], baseline_call_count=3), + Task(id="e-res-5", prompt="Scale 'pdf-generator' to 2, check health, and notify #backend-devs.", difficulty="easy", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + Task(id="e-res-6", prompt="Restart 'websocket-server', run a healthcheck, and alert #realtime-ops.", difficulty="easy", required_slots=["restart_execution", "restart_verification", "restart_notification"], baseline_call_count=3), + Task(id="e-res-7", prompt="Scale 'metrics-aggregator' to 4, verify health, and post to #platform.", difficulty="easy", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + ] + }, + { + "task_id": "easy-rollback-drills", + "description": "Repetitive rollback patterns for quick reversion practice", + "tasks": [ + Task(id="e-roll-1", prompt="Rollback 'user-profile' service to previous version, verify health, and notify #ops-alerts.", difficulty="easy", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + Task(id="e-roll-2", prompt="Undo the latest deployment for 'checkout-api', check health, and inform #sales-tech.", difficulty="easy", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + Task(id="e-roll-3", prompt="Rollback 'inventory-db-proxy', run verification, and ping #database-admins.", difficulty="easy", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + Task(id="e-roll-4", prompt="Revert 'shipping-calculator' to stable, check system health, and notify #logistics.", difficulty="easy", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + Task(id="e-roll-5", prompt="Rollback 'oauth-provider', verify it is stable, and alert #security-logs.", difficulty="easy", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + Task(id="e-roll-6", prompt="Revert 'marketing-landing-page', check health, and notify #growth-team.", difficulty="easy", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + ] + }, + { + "task_id": "medium-traffic-readiness", + "description": "Preparing services for specific traffic goals", + "tasks": [ + Task(id="m-tr-1", prompt="Prepare for the 9AM traffic spike: Scale 'gateway-api' to 15 replicas and confirm stability.", difficulty="medium", required_slots=["scaling_execution", "scaling_verification"], baseline_call_count=2), + Task(id="m-tr-2", prompt="The 'search-engine' is lagging. Deploy the latest performance patch v4.2 and restart all search-workers.", difficulty="medium", required_slots=["deployment_execution", "restart_execution", "deployment_verification"], baseline_call_count=3), + Task(id="m-tr-3", prompt="Optimize cloud spend: Scale down 'dev-environment' clusters to 1 replica each and notify #finance.", difficulty="medium", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + Task(id="m-tr-4", prompt="Rollout the 'dark-mode' feature to the 'frontend-canary'. Check health; if it fails, rollback immediately.", difficulty="medium", required_slots=["deployment_execution", "deployment_verification", "rollback_execution"], baseline_call_count=3), + Task(id="m-tr-5", prompt="A memory leak was found in 'payment-v3'. Deploy 'v3.1-fix', verify it, and notify #on-call-emergency.", difficulty="medium", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="m-tr-6", prompt="Marketing just launched a surprise campaign. Rapidly scale 'landing-page-ui' to 20, check health, and alert #marketing-ops.", difficulty="medium", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + Task(id="m-tr-7", prompt="Prepare for nightly batch processing by scaling 'data-cruncher' to 10. Once verified, notify #data-engineering.", difficulty="medium", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=3), + ] + }, + { + "task_id": "medium-incident-response", + "description": "Goal-driven mitigation of active system anomalies", + "tasks": [ + Task(id="m-inc-1", prompt="Users are getting 502s from 'api-gateway'. Restart the gateway nodes, check if health improves, and notify #incident-room.", difficulty="medium", required_slots=["restart_execution", "restart_verification", "restart_notification"], baseline_call_count=3), + Task(id="m-inc-2", prompt="The newly deployed 'recommendation-engine' is crashing. Roll it back, restart the dependent 'ui-dashboard', and verify.", difficulty="medium", required_slots=["rollback_execution", "restart_execution", "restart_verification"], baseline_call_count=3), + Task(id="m-inc-3", prompt="'worker-queue' is deadlocked. Scale it to 0 to flush, scale back to 5, verify health, and notify #backend.", difficulty="medium", required_slots=["scaling_execution", "scaling_verification", "scaling_notification"], baseline_call_count=4), + Task(id="m-inc-4", prompt="DDoS mitigation: Deploy the 'strict-rate-limit' config to 'edge-proxy', verify the deployment, and alert #security.", difficulty="medium", required_slots=["deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=3), + Task(id="m-inc-5", prompt="Database connections are maxed out. Restart 'connection-pooler', check health. If it fails, scale down 'background-jobs' to reduce load.", difficulty="medium", required_slots=["restart_execution", "restart_verification", "scaling_execution"], baseline_call_count=3), + Task(id="m-inc-6", prompt="'cache-layer' is serving stale data. Restart the cache service, deploy the cache-buster script, and verify data freshness.", difficulty="medium", required_slots=["restart_execution", "deployment_execution", "deployment_verification"], baseline_call_count=3), + Task(id="m-inc-7", prompt="Payment timeout alerts triggered. Rollback the last update to 'stripe-connector', check health, and update #finance-alerts.", difficulty="medium", required_slots=["rollback_execution", "rollback_verification", "rollback_notification"], baseline_call_count=3), + ] + }, + { + "task_id": "hard-project-legacy-migration", + "description": "Project: Decommissioning Legacy Data Center to Cloud", + "tasks": [ + Task(id="h-mig-1", prompt="Phase 1: Deploy 'cloud-connector-v1' and scale it to 20 replicas to handle initial data sync. Verify the connection health and notify #migration-hq.", difficulty="hard", required_slots=["deployment_execution", "scaling_execution", "deployment_verification", "deployment_notification"], baseline_call_count=4), + Task(id="h-mig-2", prompt="Phase 2: Traffic shift. Scale down 'legacy-monolith' by 50%. Restart the 'global-load-balancer' to route traffic to the cloud nodes. Verify health.", difficulty="hard", required_slots=["scaling_execution", "restart_execution", "restart_verification"], baseline_call_count=3), + Task(id="h-mig-3", prompt="Phase 3: Critical failure detected in sync. Rollback 'cloud-connector' to v0.9, scale 'legacy-monolith' back to 100%, and send an urgent alert to #incident-response.", difficulty="hard", required_slots=["rollback_execution", "scaling_execution", "deployment_notification"], baseline_call_count=3), + Task(id="h-mig-4", prompt="Phase 4: Patching. Deploy the 'hotfix-v1.1' for cloud sync. Restart 'auth-validator' to clear session cache, run a deep healthcheck, and notify the stakeholders.", difficulty="hard", required_slots=["deployment_execution", "restart_execution", "deployment_verification", "deployment_notification"], baseline_call_count=4), + Task(id="h-mig-5", prompt="Phase 5: Final shift. Scale 'legacy-monolith' to 10%. Scale 'cloud-services' to maximum capacity. Verify stability across all regions.", difficulty="hard", required_slots=["scaling_execution", "scaling_verification"], baseline_call_count=3), + Task(id="h-mig-6", prompt="Phase 6: Cutover testing. Deploy 'chaos-monkey' to the legacy network to ensure no cloud components fail. Verify health, then rollback chaos monkey.", difficulty="hard", required_slots=["deployment_execution", "deployment_verification", "rollback_execution"], baseline_call_count=3), + Task(id="h-mig-7", prompt="Phase 7: Cleanup. Decommission legacy by scaling 'legacy-monolith' to 0. Deploy the 'final-proxy-config', verify end-to-end health, and notify #migration-complete.", difficulty="hard", required_slots=["scaling_execution", "deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=4), + ] + }, + { + "task_id": "hard-project-zero-trust", + "description": "Project: Zero-Trust Security Mesh Implementation", + "tasks": [ + Task(id="h-sec-1", prompt="Phase 1: Deploy 'envoy-sidecar-injector' to the cluster. Restart 'namespace-manager' to apply webhooks, verify health, and notify #security-ops.", difficulty="hard", required_slots=["deployment_execution", "restart_execution", "deployment_verification", "deployment_notification"], baseline_call_count=4), + Task(id="h-sec-2", prompt="Phase 2: Scale up 'certificate-authority' to 10 nodes to handle the incoming mTLS request flood. Verify nodes are healthy before proceeding.", difficulty="hard", required_slots=["scaling_execution", "scaling_verification"], baseline_call_count=2), + Task(id="h-sec-3", prompt="Phase 3: Deploy 'strict-mtls-policy'. Immediately run healthchecks on 'billing-api'. If billing fails, rollback the policy and alert #sec-incidents.", difficulty="hard", required_slots=["deployment_execution", "deployment_verification", "rollback_execution", "rollback_notification"], baseline_call_count=4), + Task(id="h-sec-4", prompt="Phase 4: Fix applied. Redeploy 'strict-mtls-policy-v2'. Restart all 'billing-api' pods to refresh their certs, verify health, and notify success.", difficulty="hard", required_slots=["deployment_execution", "restart_execution", "restart_verification", "deployment_notification"], baseline_call_count=4), + Task(id="h-sec-5", prompt="Phase 5: Optimize overhead. Scale down 'legacy-vpn-gateway' from 15 to 2. Deploy updated 'external-ingress' rules, check connectivity, and notify #network.", difficulty="hard", required_slots=["scaling_execution", "deployment_execution", "deployment_verification", "deployment_notification"], baseline_call_count=4), + Task(id="h-sec-6", prompt="Phase 6: Project completion. Restart 'audit-logger' to finalize tracking, run a full system health sweep, and post the final status to #ciso-updates.", difficulty="hard", required_slots=["restart_execution", "restart_verification", "restart_notification"], baseline_call_count=3), + ] + } +] diff --git a/server/llm_eval_prompts.py b/server/llm_eval_prompts.py new file mode 100644 index 0000000000000000000000000000000000000000..c7d7ec832730e66d4af4bbe7c4f572839265322f --- /dev/null +++ b/server/llm_eval_prompts.py @@ -0,0 +1,66 @@ +"""Prompt templates for the Toolforge slot judge LLM. + +This module keeps the judge prompt separate from the evaluation logic so the +prompt can be iterated on without modifying the evaluator implementation. +""" + +from textwrap import dedent + + +SLOT_JUDGE_SYSTEM_PROMPT = dedent( + """ +You are the semantic judge for a DevOps benchmark environment. + +You will receive: +- A task description +- A list of required semantic slots with their definitions +- A list of tool calls proposed by an agent + +Your job is to evaluate whether the proposed plan satisfies the required semantic slots. + +DEFINITIONS: +Semantic Slot: A high-level intent or goal that must be achieved by the plan. Each slot represents a category of action required by the task, defined in the slot definitions provided to you. +Relevant: The tool call directly contributes to satisfying one or more of the required semantic slots for THIS specific task. +Unnecessary: The tool call is valid and not harmful, but does not contribute to any required slot for this task. It is excess work. +Harmful: The tool call contradicts the intent of the task or would cause unintended side effects outside the scope of what the task asks for. Use the task description as the ground truth — if the task explicitly asks for a destructive action, that action is relevant, not harmful. A call is harmful only if it was NOT asked for and would cause damage, data loss, or affect systems unrelated to the task. + +RULES: +- A slot is considered filled if at least one tool call satisfies its definition. Multiple tool calls can fill the same slot. +- Use the slot definitions provided in the user message as ground truth for what counts as filling that slot. +- Unnecessary calls should be listed by tool name. +- Harmful calls should be listed by tool name. +- Return valid JSON only. No markdown, no commentary, no extra keys. + +OUTPUT SCHEMA: +{ + "slots_filled": ["SLOT_NAME"], + "slots_missing": ["SLOT_NAME"], + "unnecessary_calls": ["tool_name"], + "harmful_calls": ["tool_name"] +} + """ +).strip() + + +def build_slot_judge_user_prompt( + task_prompt: str, + required_slots: list[str], + slot_definitions: dict[str, str], + plan: list[dict[str, object]], +) -> str: + """Build the user prompt for the slot judge LLM.""" + return dedent( + f""" + Task prompt: + {task_prompt} + + Required slots: + {required_slots} + + Slot definitions: + {slot_definitions} + + Proposed plan: + {plan} + """ + ).strip() \ No newline at end of file diff --git a/server/plan_evaluator.py b/server/plan_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..b8091cdc3f0cfd418c7e3ef95a0cb8ecb2f72f48 --- /dev/null +++ b/server/plan_evaluator.py @@ -0,0 +1,520 @@ +""" +Plan Evaluator + +Consolidates the core evaluation logic: +1. Structural validation +2. Semantic slot judgment +3. Reward calculation +4. Token-cost calculation +5. Final score combination + +Functions are pure and deterministic where possible. +""" + +import logging +import json +import os +from typing import Any, Dict, List, Optional, Tuple + +from openai import OpenAI + +from models import ( + MacroProposal, + SlotJudgmentResult, + Task, + Tool, + ToolCall, + ToolEvaluation, + ValidationResult, +) +from server.llm_eval_prompts import ( + SLOT_JUDGE_SYSTEM_PROMPT, + build_slot_judge_user_prompt, +) +from server.slots import DEVOPS_SLOTS + +logger = logging.getLogger(__name__) + +# --- Named Constants (New Bounded Reward Design) --- + +# Final reward bounds +FINAL_REWARD_MIN = -0.2 +FINAL_REWARD_MAX = 1.0 + +# Stage 1: Validation +VALIDATION_PENALTY = -0.2 + +# Stage 2: Slot score bounds +SLOT_THRESHOLD = 0.65 +SLOT_SCORE_MIN = -0.15 # slot_ratio == 0.0 +SLOT_SCORE_MAX = 0.25 # slot_ratio == 1.0 + +# Stage 3: Macro bonuses +MACRO_CREATION_MAX = 0.20 +MACRO_CREATION_DECAY_FLOOR = 0.05 +MACRO_CREATION_THRESHOLD = 2 +MACRO_CREATION_FULL_RANGE = {2, 3} # counts that get full reward +MACRO_USAGE_PARTIAL = 0.03 # when 0.65 <= slot_ratio < 1.0 +MACRO_USAGE_FULL = 0.05 # when slot_ratio == 1.0 + +# Stage 4: Tool efficiency bounds +EFFICIENCY_SCORE_BASELINE = 0.2 # exact baseline match +EFFICIENCY_SCORE_MIN = 0.0 +EFFICIENCY_SCORE_MAX = 0.5 +EFFICIENCY_SCALE = 0.3 # multiplier on efficiency_ratio + +# LLM configuration +API_BASE_URL = os.getenv("API_BASE_URL", "https://router.huggingface.co/v1") +MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-72B-Instruct") +HF_TOKEN = os.getenv("HF_TOKEN", "") + +# --- Helper Functions for Stage 2 (Semantic Judge) --- + +def _build_judge_request( + task_prompt: str, + required_slots: List[str], + slot_definitions: Dict[str, str], + available_tools: List[Tool], + plan: List[ToolCall], +) -> Dict[str, Any]: + """Helper to build the expected LLM judge prompt/input.""" + # Placeholder structure for when real call is integrated + return { + "task_prompt": task_prompt, + "required_slots": required_slots, + "slot_definitions": slot_definitions, + "tools": [t.name for t in available_tools], + "plan": [{"tool": c.tool_name} for c in plan] + } + +def _simulate_llm_judgment( + judge_request: Dict[str, Any], + plan: List[ToolCall], + required_slots: List[str] +) -> List[Dict[str, Any]]: + """Helper to simulate the LLM response deterministically. + + Produces classification: 'relevant', 'unnecessary', or 'harmful'. + """ + results = [] + slots_filled_so_far = set() + + # We simulate semantic relevance by simply mapping the sequence + # to the required slots. + for i, call in enumerate(plan): + # Extremely naive heuristic for simulation: + if call.tool_name == "delete" or "drop" in call.tool_name: + # Simulate a harmful destructive call + classification = "harmful" + slot = None + else: + # If we haven't filled all slots and it's not a duplicate, let's pretend it fills a slot + if len(slots_filled_so_far) < len(required_slots): + slot = required_slots[len(slots_filled_so_far)] + classification = "relevant" + slots_filled_so_far.add(slot) + else: + slot = None + classification = "unnecessary" + + results.append({ + "tool_call_index": i, + "tool_name": call.tool_name, + "fills_slot": slot, + "classification": classification, + "reason": f"Simulated classification: {classification}" + }) + + return results + + +def _call_llm_slot_judgment( + task_prompt: str, + required_slots: List[str], + slot_definitions: Dict[str, str], + available_tools: List[Tool], + plan: List[ToolCall], +) -> Dict[str, Any]: + """Call the OpenAI-compatible LLM and return its JSON response.""" + client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN or None) + # Map tool names to descriptions for the prompt + tool_desc_map = {t.name: t.description for t in available_tools} + + plan_with_descs = [] + for call in plan: + desc = tool_desc_map.get(call.tool_name, "No description available.") + plan_with_descs.append({ + "tool_name": call.tool_name, + "tool_description": desc + }) + + user_prompt = build_slot_judge_user_prompt( + task_prompt=task_prompt, + required_slots=required_slots, + slot_definitions=slot_definitions, + plan=plan_with_descs, + ) + + completion = client.chat.completions.create( + model=MODEL_NAME, + messages=[ + {"role": "system", "content": SLOT_JUDGE_SYSTEM_PROMPT}, + {"role": "user", "content": user_prompt}, + ], + temperature=0.0, + response_format={"type": "json_object"}, + ) + + content = completion.choices[0].message.content or "{}" + content = content.strip().replace("```json", "").replace("```", "").strip() + return json.loads(content) + +def _parse_llm_judgment(raw_json: Dict[str, Any], required_slots: List[str]) -> SlotJudgmentResult: + """Helper to convert the flat LLM summary output into a SlotJudgmentResult. + + The expected LLM schema is: + { + "slots_filled": ["SLOT_NAME"], + "slots_missing": ["SLOT_NAME"], + "unnecessary_calls": ["tool_name"], + "harmful_calls": ["tool_name"] + } + """ + slots_filled = raw_json.get("slots_filled", []) + slots_missing = raw_json.get("slots_missing", []) + + # Validation against the requested required_slots + # Ensure slots_filled only contains requested slots + slots_filled = [s for s in slots_filled if s in required_slots] + + # If missing is not explicitly provided, we compute it + if not slots_missing: + slots_missing = [s for s in required_slots if s not in slots_filled] + + harmful_calls = raw_json.get("harmful_calls", []) + harmful_calls_present = len(harmful_calls) > 0 + + task_complete = len(slots_missing) == 0 + + # Create minimal ToolEvaluation entries if we have names, but since we lost the + # tool_call_index in the summary, we maintain an empty list for the model requirement. + # The current reward logic only depends on individual slot filling counts. + evaluations = [] + + return SlotJudgmentResult( + evaluations=evaluations, + slots_filled=slots_filled, + slots_missing=slots_missing, + task_complete=task_complete, + harmful_calls_present=harmful_calls_present, + ) + +def _simulate_llm_judgment( + judge_request: Dict[str, Any], + plan: List[ToolCall], + required_slots: List[str] +) -> Dict[str, Any]: + """Helper to simulate the LLM response in the flat summary format. + + Returns the same schema as defined in SLOT_JUDGE_SYSTEM_PROMPT. + """ + slots_filled = [] + harmful_calls = [] + unnecessary_calls = [] + + slots_filled_so_far = set() + + for call in plan: + # Heuristic for simulation + if "delete" in call.tool_name or "drop" in call.tool_name: + harmful_calls.append(call.tool_name) + elif len(slots_filled_so_far) < len(required_slots): + slot = required_slots[len(slots_filled_so_far)] + slots_filled.append(slot) + slots_filled_so_far.add(slot) + else: + unnecessary_calls.append(call.tool_name) + + return { + "slots_filled": slots_filled, + "slots_missing": [s for s in required_slots if s not in slots_filled], + "unnecessary_calls": unnecessary_calls, + "harmful_calls": harmful_calls + } + +# --- Helper Function for Stage 4 (Dynamic Baseline) --- + +def calculate_dynamic_baseline_tokens(task: Task, available_tools: Dict[str, Tool]) -> int: + """Computes the expected baseline token cost for a task. + + Slot-driven baseline: uses baseline_token_cost when provided, + otherwise falls back to baseline_call_count for compatibility. + """ + if task.baseline_call_count > 0: + return task.baseline_call_count + + return 0 + +# --- Helper Functions for Macro Recognition --- + +def extract_contiguous_windows(tool_names: List[str], window_size: int) -> List[Tuple[str, ...]]: + """Return exact ordered contiguous windows of the given size.""" + if window_size < 2 or window_size > len(tool_names): + return [] + return [tuple(tool_names[i:i + window_size]) for i in range(len(tool_names) - window_size + 1)] + +def count_prior_sequence_occurrences( + proposed_sequence: Tuple[str, ...], + sequence_counts: Dict[str, int], +) -> int: + """Return the prior exact count for a sequence key.""" + key = str(proposed_sequence) + return sequence_counts.get(key, 0) + +def update_sequence_counts( + plan: List[ToolCall], + sequence_counts: Dict[str, int], +) -> Dict[str, int]: + """Update sequence_counts dict from the current plan's contiguous windows. + + Extracts windows of size 2..len(plan) and increments counts. + Returns the updated dict (mutates in place for convenience). + """ + tool_names = [call.tool_name for call in plan] + for window_size in range(2, len(tool_names) + 1): + for window in extract_contiguous_windows(tool_names, window_size): + key = str(window) + sequence_counts[key] = sequence_counts.get(key, 0) + 1 + return sequence_counts + +# --- New Bounded Stage Scoring Functions --- + +def compute_slot_score(slot_ratio: float) -> float: + """Stage 2: Piecewise linear slot score bounded to [-0.15, 0.25]. + + - slot_ratio < 0.65: maps [-0.15, 0.0] + - slot_ratio >= 0.65: maps [0.0, 0.25] + """ + if slot_ratio < SLOT_THRESHOLD: + # linear from -0.15 (at 0.0) to 0.0 (at 0.65) + return SLOT_SCORE_MIN * (1.0 - slot_ratio / SLOT_THRESHOLD) + else: + # linear from 0.0 (at 0.65) to 0.25 (at 1.0) + return SLOT_SCORE_MAX * ((slot_ratio - SLOT_THRESHOLD) / (1.0 - SLOT_THRESHOLD)) + + +def compute_macro_creation_bonus( + macro_proposal: Optional[Tool], + sequence_counts: Optional[Dict[str, int]], + slot_ratio: float, +) -> float: + """Stage 3a: Macro creation bonus bounded to [0.0, 0.20]. + + Gate: slot_ratio >= 0.65 + - prior_count < 2: 0.0 + - prior_count in {2, 3}: 0.20 + - prior_count > 3: decays with floor 0.05 + """ + if slot_ratio < SLOT_THRESHOLD: + return 0.0 + if macro_proposal is None or sequence_counts is None: + return 0.0 + if macro_proposal.steps is None or len(macro_proposal.steps) < 2: + return 0.0 + + proposed_sequence = tuple(call.tool_name for call in macro_proposal.steps) + prior_count = count_prior_sequence_occurrences(proposed_sequence, sequence_counts) + + if prior_count < MACRO_CREATION_THRESHOLD: + return 0.0 + if prior_count in MACRO_CREATION_FULL_RANGE: + return MACRO_CREATION_MAX + # Decay for late creation + return max(MACRO_CREATION_DECAY_FLOOR, MACRO_CREATION_MAX * (3.0 / prior_count)) + + +def compute_macro_usage_bonus( + plan: List[ToolCall], + accepted_macros: List[Tool], + slot_ratio: float, +) -> float: + """Stage 3b: Macro usage bonus bounded to [0.0, 0.05]. + + Gate: slot_ratio >= 0.65 + """ + if slot_ratio < SLOT_THRESHOLD: + return 0.0 + macro_names = {m.name for m in accepted_macros} + macro_used = any(call.tool_name in macro_names for call in plan) + if not macro_used: + return 0.0 + + if slot_ratio >= 1.0: + return MACRO_USAGE_FULL + return MACRO_USAGE_PARTIAL + + +def compute_efficiency_score( + plan: List[ToolCall], + task: Task, + available_tools: Dict[str, Tool], +) -> float: + """Stage 4: Count-based efficiency score bounded to [0.0, 0.5]. + + Only called when slot_ratio == 1.0. + - baseline match -> 0.2 + - better than baseline -> above 0.2 + - worse than baseline -> below 0.2 + """ + baseline = calculate_dynamic_baseline_tokens(task, available_tools) + actual = len(plan) + + if baseline <= 0: + return EFFICIENCY_SCORE_BASELINE + + efficiency_ratio = (baseline - actual) / baseline + score = EFFICIENCY_SCORE_BASELINE + EFFICIENCY_SCALE * efficiency_ratio + return max(EFFICIENCY_SCORE_MIN, min(EFFICIENCY_SCORE_MAX, score)) + + +# --- Public APIs --- + +def get_relevant_slots(required_slots: List[str]) -> Dict[str, str]: + """Return the subset of DEVOPS_SLOTS matching required_slots.""" + return { + name: DEVOPS_SLOTS[name] + for name in required_slots + if name in DEVOPS_SLOTS + } + +def run_sanity_validation( + plan: List[ToolCall], + available_tools: Dict[str, Tool], +) -> ValidationResult: + """Stage 1: Structural validation of the plan. + + Validation order: + 1. Empty plan → EMPTY_PLAN (penalty -0.2) + 2. Unknown tool name → INVALID_TOOL (penalty -0.2) + 3. All pass → VALID (penalty 0.0) + """ + if plan is None or len(plan) == 0: + return ValidationResult( + valid=False, + reason="EMPTY_PLAN", + penalty=VALIDATION_PENALTY, + detail="Plan contains no tool calls.", + ) + + for call in plan: + if call.tool_name not in available_tools: + return ValidationResult( + valid=False, + reason="INVALID_TOOL", + penalty=VALIDATION_PENALTY, + detail=f"Tool '{call.tool_name}' does not exist in toolbox.", + ) + + return ValidationResult(valid=True, reason="VALID", penalty=0.0) + +def _expand_macros_in_plan(plan: List[ToolCall], available_tools: List[Tool]) -> List[ToolCall]: + """Recursively expand macro calls into their atomic components for semantic evaluation.""" + tool_map = {t.name: t for t in available_tools} + expanded_plan = [] + + for call in plan: + tool = tool_map.get(call.tool_name) + if tool and tool.is_macro and tool.steps: + # Macros are typically 1-level, but we expand recursively for robustness + expanded_plan.extend(_expand_macros_in_plan(tool.steps, available_tools)) + else: + expanded_plan.append(call) + + return expanded_plan + +def run_slot_judgment( + task_prompt: str, + required_slots: List[str], + slot_definitions: Dict[str, str], + available_tools: List[Tool], + plan: List[ToolCall], +) -> SlotJudgmentResult: + """Stage 2: Evaluate a validated plan against the task's semantic slots.""" + + # Expand macros into atomic steps so the LLM evaluator can use tool descriptions + # expanded_plan = _expand_macros_in_plan(plan, available_tools) + # logger.debug(f"Stage 2 expansion: original_len={len(plan)}, expanded_len={len(expanded_plan)}") + + req = _build_judge_request(task_prompt, required_slots, slot_definitions, available_tools, plan) + try: + raw_json = _call_llm_slot_judgment( + task_prompt=task_prompt, + required_slots=required_slots, + slot_definitions=slot_definitions, + available_tools=available_tools, + plan=plan, + ) + if not raw_json or "slots_filled" not in raw_json: + raise ValueError("LLM returned an invalid or empty response") + except Exception as exc: + logger.warning("LLM slot judge failed, falling back to simulated judgment: %s", exc) + raw_json = _simulate_llm_judgment(req, plan, required_slots) + + result = _parse_llm_judgment(raw_json, required_slots) + if result.harmful_calls_present: + logger.warning("Slot judge detected harmful calls in plan.") + + return result + + +def compute_step_reward( + slot_judgment: SlotJudgmentResult, + task: Task, + plan: List[ToolCall], + available_tools: Dict[str, Tool], + accepted_macros: List[Tool], + macro_proposal: Optional[Tool] = None, + sequence_counts: Optional[Dict[str, int]] = None, +) -> Dict[str, float]: + """Compute the full step reward using bounded additive stages. + + Returns a dict with per-stage contributions and the final clamped reward. + """ + # Compute slot ratio + n_required = len(task.required_slots) + n_filled = len(slot_judgment.slots_filled) + slot_ratio = n_filled / n_required if n_required > 0 else 1.0 + + # Stage 2: slot score + slot_score = compute_slot_score(slot_ratio) + + # Stage 3: macro bonuses (gated by slot_ratio) + macro_creation = compute_macro_creation_bonus(macro_proposal, sequence_counts, slot_ratio) + macro_usage = compute_macro_usage_bonus(plan, accepted_macros, slot_ratio) + + # Stage 4: efficiency (only when fully complete) + efficiency_score = 0.0 + + if slot_ratio < SLOT_THRESHOLD: + # Only slot score, no macro, no efficiency + final_raw = slot_score + elif slot_ratio < 1.0: + # Slot score + macro bonuses only + final_raw = slot_score + macro_creation + macro_usage + else: + # Full: slot + macro + efficiency + efficiency_score = compute_efficiency_score(plan, task, available_tools) + final_raw = slot_score + macro_creation + macro_usage + efficiency_score + + final_reward = max(FINAL_REWARD_MIN, min(FINAL_REWARD_MAX, final_raw)) + + logger.info("Final Reward: %.3f", final_reward) + + return { + "slot_ratio": slot_ratio, + "slot_score": slot_score, + "macro_creation": macro_creation, + "macro_usage": macro_usage, + "efficiency_score": efficiency_score, + "final_reward": final_reward, + } diff --git a/server/requirements.txt b/server/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..a458250888125476be6407f1ffb26632235a9d15 --- /dev/null +++ b/server/requirements.txt @@ -0,0 +1,6 @@ +openenv[core]>=0.2.0 +fastapi>=0.115.0 +uvicorn>=0.24.0 + + + diff --git a/server/slots.py b/server/slots.py new file mode 100644 index 0000000000000000000000000000000000000000..3dcab138c8fe1ceb174162cc7ebd4ddcc0db925c --- /dev/null +++ b/server/slots.py @@ -0,0 +1,20 @@ +"""Semantic slot definitions for the ToolForge judge. + +Each slot represents a granular action phase (execution, verification, notification) +within a DevOps workflow. Mapped by the Stage-2 semantic judge. +""" + +DEVOPS_SLOTS = { + "deployment_execution": "Execute a deployment or release of a new version to a target environment.", + "deployment_verification": "Check health, ping, or verify a newly deployed service is healthy.", + "deployment_notification": "Notify or alert a channel/person that a deployment has finished.", + "rollback_execution": "Revert or restore a service to a previous stable state.", + "rollback_verification": "Verify the health or stability of a rolled-back service.", + "rollback_notification": "Send an alert or message indicating a rollback event occurred.", + "scaling_execution": "Increase or decrease the replica count or scale a service.", + "scaling_verification": "Verify that the service is healthy and stabilized after scaling.", + "scaling_notification": "Notify stakeholders that a service scaling event occurred.", + "restart_execution": "Restart, bounce, or cycle a service instance.", + "restart_verification": "Verify the service is running properly after being restarted.", + "restart_notification": "Notify stakeholders that a service has been restarted.", +} diff --git a/server/toolforge_env_environment.py b/server/toolforge_env_environment.py new file mode 100644 index 0000000000000000000000000000000000000000..c8bc90c1ee0f1e4a9b374d62d8fd71cd7c8d8a2c --- /dev/null +++ b/server/toolforge_env_environment.py @@ -0,0 +1,565 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +""" +Toolforge Env Environment Implementation. + +A simple test environment that echoes back messages sent to it. +Perfect for testing HTTP server infrastructure. +""" + +import logging +from uuid import uuid4 + +from openenv.core.env_server.interfaces import Environment +from openenv.core.env_server.types import EnvironmentMetadata, State +from typing import Any, Dict, List, Optional + +try: + from .inputs.base import InputProvider + from .inputs.simulated.task_selector import TaskSelector + from .inputs.factory import create_input_provider +except ImportError: + from server.inputs.base import InputProvider + from server.inputs.simulated.task_selector import TaskSelector + from server.inputs.factory import create_input_provider + +try: + from ..models import ( + Tool, + ToolCall, + ToolforgeAction, + ToolforgeObservation, + ToolForgeState, + Task, + ) +except ImportError: + from models import ( + Tool, + ToolCall, + ToolforgeAction, + ToolforgeObservation, + ToolForgeState, + Task, + ) + +try: + from server.tools import build_atomic_tools + from server.evaluation_pipeline import run_evaluation_pipeline + from server.plan_evaluator import update_sequence_counts +except ImportError: + from .tools import build_atomic_tools + from .evaluation_pipeline import run_evaluation_pipeline + from .plan_evaluator import update_sequence_counts + + +logger = logging.getLogger(__name__) + + +class ToolforgeEnvironment(Environment): + """ + A simple echo environment that echoes back messages. + + This environment is designed for testing the HTTP server infrastructure. + It maintains minimal state and simply echoes back whatever message it receives. + + Example: + >>> env = ToolforgeEnvironment() + >>> obs = env.reset() + >>> print(obs.echoed_message) # "Toolforge Env environment ready!" + >>> + >>> obs = env.step(ToolforgeAction(message="Hello")) + >>> print(obs.echoed_message) # "Hello" + >>> print(obs.message_length) # 5 + """ + + # Enable concurrent WebSocket sessions. + # Set to True if your environment isolates state between instances. + # When True, multiple WebSocket clients can connect simultaneously, each + # getting their own environment instance (when using factory mode in app.py). + SUPPORTS_CONCURRENT_SESSIONS: bool = True + + # Hard guardrail to ensure episodes terminate deterministically. + MAX_EPISODE_STEPS: int = 100 + + def __init__(self): + """Initialize the toolforge_env environment.""" + super().__init__(transform=None, rubric=None) + self._state = self._create_default_state() + self._reset_count = 0 + + self._task_selector = TaskSelector() + self._input_provider_factory = create_input_provider + self._input_provider: Optional[InputProvider] = None + self._last_approval: Optional[bool] = None + + # persistent config + self.mode = None + self.difficulty: str = "easy" + self.initialized = False + + def _create_default_state(self) -> ToolForgeState: + """ + Create a default ToolForgeState with basic parameters. + + Returns: + ToolForgeState with default values + """ + default_task = Task( + id="default-task", + prompt="Default task", + difficulty="easy", + required_slots=[], + baseline_token_cost=0, + ) + + return ToolForgeState( + episode_id=str(uuid4()), + step_count=0, + current_task=default_task, + task_queue=[], + completed_tasks=[], + available_tools=[], + accepted_macros=[], + rejected_macro_count=0, + call_history=[], + tokens_used=0, + done=False, + ) + + def _create_default_observation(self) -> ToolforgeObservation: + """ + Create a default ToolforgeObservation with basic parameters. + + Returns: + ToolforgeObservation with default values + """ + return ToolforgeObservation( + current_task=self._state.current_task, + available_tools=self._available_tools_to_prompt_specs(self._state.available_tools), + ) + + def _tool_to_prompt_spec(self, tool: Tool) -> Dict[str, Any]: + """Convert a Tool model into a plain prompt-friendly dictionary.""" + + return { + "name": tool.name, + "description": tool.description, + "is_macro": tool.is_macro, + "steps": tool.steps or [], + } + + def _available_tools_to_prompt_specs(self, tools: List[Tool]) -> List[Dict[str, Any]]: + """Convert available tools to plain dictionaries ready for prompt injection. + Macros are listed first, followed by atomic tools. + """ + sorted_tools = sorted(tools, key=lambda t: not t.is_macro) + return [self._tool_to_prompt_spec(tool) for tool in sorted_tools] + + def reset( + self, + seed: Optional[int] = None, + episode_id: Optional[str] = None, + task_id: Optional[str] = None, + **kwargs + ) -> ToolforgeObservation: + """ + Reset the environment. + + Returns: + ToolforgeObservation with a ready message + """ + ep_id = episode_id if episode_id is not None else str(uuid4()) + + # old state preservation + prev_accepted_macros = self._state.accepted_macros if hasattr(self, '_state') else [] + prev_macro_defs = self._state.macro_definitions if hasattr(self, '_state') else {} + prev_rejected_count = self._state.rejected_macro_count if hasattr(self, '_state') else 0 + + self._state = self._create_default_state() + self._state.episode_id = ep_id + self._reset_count += 1 + self.task_id = kwargs.get("task_id", "easy-deployment-sprints") + + # subsequent resets ignore incoming values + task_list = self._task_selector.next_task_list(self.task_id) + + self._input_provider = self._input_provider_factory(task_list) + first_task = self._get_next_task_from_generator() + self._state.current_task = first_task + self._sync_task_queue_from_generator() + self._state.completed_tasks = [] + self._state.available_tools = build_atomic_tools() + prev_accepted_macros + self._state.accepted_macros = prev_accepted_macros + self._state.rejected_macro_count = prev_rejected_count + self._state.call_history = [] + self._state.tokens_used = 0 + self._state.done = False + # Reset episode-level macro tracking state + self._state.sequence_counts = {} + self._state.macro_usage_counts = {} + self._state.macro_definitions = prev_macro_defs + self._last_approval = None + + + obs = self._create_default_observation() + obs.done = False + obs.reward = 0.0 + + return obs + + def step(self, action: ToolforgeAction) -> ToolforgeObservation: # type: ignore[override] + """ + Execute a step in the environment by echoing the message. + + Args: + action: ToolforgeAction containing the message to echo + + Returns: + ToolforgeObservation with the echoed message and its length + """ + if self._is_done(): + obs_terminal = self._create_default_observation() + obs_terminal.done = True + obs_terminal.reward = 0.0 + obs_terminal.metadata = { + "summary": "Episode already completed.", + "terminal": True, + } + return obs_terminal + + if not isinstance(action, ToolforgeAction): + logger.warning( + "Malformed action rejected. Expected ToolforgeAction, got %s", + type(action).__name__, + ) + self._state.step_count += 1 + self._last_approval = False + + progression = "advanced_to_next_task_malformed_action" + if self._state.step_count >= self.MAX_EPISODE_STEPS: + self._state.done = True + progression = "episode_terminated_max_steps" + else: + advanced = self._advance_to_next_task() + progression = "advanced_to_next_task" if advanced else "episode_completed" + + obs_malformed = self._create_default_observation() + obs_malformed.done = self._is_done() + obs_malformed.reward = 0.0 + obs_malformed.metadata = { + "summary": "Malformed action treated as failed attempt.", + "malformed_action": True, + "plan_accepted": False, + "task_prompt": self._state.current_task.prompt, + "task_level": self._state.current_task.difficulty, + "progression": progression, + } + return obs_malformed + + self._state.step_count += 1 + + plan_accounting = self._analyze_plan(action.plan) + step_call_count = plan_accounting["step_call_count"] + unknown_tool_calls = plan_accounting["unknown_tool_calls"] + + self._state.call_history.extend(action.plan) + self._state.tokens_used += step_call_count + + available_tools_by_name = { + tool.name: tool for tool in self._state.available_tools + } + pipeline_result = run_evaluation_pipeline( + plan=action.plan, + task=self._state.current_task, + available_tools=available_tools_by_name, + accepted_macros=self._state.accepted_macros, + baseline_token_cost=self._state.current_task.baseline_token_cost, + sequence_counts=self._state.sequence_counts, + macro_definitions=self._state.macro_definitions, + macro_proposal=action.macro_proposal, + ) + self._last_approval = bool(pipeline_result.passed_validation) + + # Update sequence counts AFTER pipeline evaluation so recognition uses prior counts only + update_sequence_counts(action.plan, self._state.sequence_counts) + + # Update macro usage counts for any macro tools used in this plan + macro_names = {m.name for m in self._state.accepted_macros} + for call in action.plan: + if call.tool_name in macro_names: + self._state.macro_usage_counts[call.tool_name] = ( + self._state.macro_usage_counts.get(call.tool_name, 0) + 1 + ) + + progression = "advanced_to_next_task" + if self._state.step_count >= self.MAX_EPISODE_STEPS: + self._state.done = True + progression = "episode_terminated_max_steps" + else: + advanced = self._advance_to_next_task() + progression = "advanced_to_next_task" if advanced else "episode_completed" + + macro_result = self._process_macro_proposal( + action=action, + can_accept=bool(pipeline_result.passed_validation), + reject_reason="plan_not_accepted", + ) + + if macro_result["decision"] == "approved" and action.macro_proposal is not None: + self._state.available_tools.append(action.macro_proposal) + + # Fetch the scalar reward from the evaluation pipeline + reward = float(pipeline_result.reward) + print(self._state.current_task.prompt, reward, progression, macro_result) + return ToolforgeObservation( + current_task=self._state.current_task, + available_tools=self._available_tools_to_prompt_specs(self._state.available_tools), + done=self._is_done(), + reward=reward + ) + + def _advance_to_next_task(self) -> bool: + """Advance from current task to the next queued task.""" + + completed_task_id = self._state.current_task.id + self._state.completed_tasks.append(self._state.current_task) + + if self._input_provider is None or self._input_provider.is_done(): + self._state.done = True + self._state.task_queue = [] + logger.info( + "Episode complete. Final task '%s' finished; no tasks remain.", + completed_task_id, + ) + return False + + next_task = self._get_next_task_from_generator() + self._state.current_task = next_task + print("Prompt change") + self._sync_task_queue_from_generator() + logger.info( + "Task advanced from '%s' to '%s'. Remaining tasks=%d", + completed_task_id, + next_task.id, + len(self._state.task_queue), + ) + logger.debug("Next task prompt: %s", next_task.prompt) + return True + + def _analyze_plan(self, plan: List[ToolCall]) -> Dict[str, Any]: + """Compute deterministic call accounting from server-side tool registry.""" + + available_tools_by_name = { + tool.name: tool for tool in self._state.available_tools + } + unknown_tool_calls: List[str] = [] + + for call in plan: + tool_def = available_tools_by_name.get(call.tool_name) + if tool_def is None: + unknown_tool_calls.append(call.tool_name) + + return { + "step_call_count": len(plan), + "unknown_tool_calls": unknown_tool_calls, + } + + def _process_macro_proposal( + self, + action: ToolforgeAction, + can_accept: bool, + reject_reason: str, + ) -> Dict[str, Any]: + """Evaluate and apply macro proposal lifecycle for this step.""" + + result: Dict[str, Any] = { + "attempted": False, + "decision": "none", + "name": None, + "reason": "no_macro_proposal", + } + + has_macro_intent = ( + action.action_type == "propose_plan_with_macro" + or action.macro_proposal is not None + ) + if not has_macro_intent: + return result + + result["attempted"] = True + + if action.action_type != "propose_plan_with_macro": + return self._reject_macro( + result=result, + name=action.macro_proposal.name if action.macro_proposal else None, + reason="macro_proposal_requires_propose_plan_with_macro_action_type", + ) + + if action.macro_proposal is None: + return self._reject_macro( + result=result, + name=None, + reason="missing_macro_proposal_payload", + ) + + proposal = action.macro_proposal + macro_name = proposal.name.strip() + + if not can_accept: + return self._reject_macro( + result=result, + name=macro_name, + reason=reject_reason, + ) + + if not macro_name: + return self._reject_macro( + result=result, + name=None, + reason="macro_name_cannot_be_empty", + ) + + if not proposal.steps: + return self._reject_macro( + result=result, + name=None, + reason="macro_steps_cannot_be_empty", + ) + + + existing_names = {tool.name for tool in self._state.available_tools} + if macro_name in existing_names: + return self._reject_macro( + result=result, + name=macro_name, + reason="macro_name_already_exists", + ) + + if len(proposal.steps) < 2: + return self._reject_macro( + result=result, + name=macro_name, + reason="macro_requires_at_least_two_steps", + ) + + available_tools_by_name = { + tool.name: tool for tool in self._state.available_tools + } + + missing_steps = [ + call.tool_name + for call in proposal.steps + if call.tool_name not in available_tools_by_name + ] + if missing_steps: + return self._reject_macro( + result=result, + name=macro_name, + reason=f"macro_contains_unknown_tools:{','.join(missing_steps)}", + ) + + if any( + available_tools_by_name[call.tool_name].is_macro + for call in proposal.steps + ): + return self._reject_macro( + result=result, + name=macro_name, + reason="nested_macro_steps_not_supported", + ) + + composed_of: List[str] = [call.tool_name for call in proposal.steps] + + macro_tool = Tool( + name=macro_name, + description=proposal.description.strip() or f"Macro: {' -> '.join(composed_of)}", + is_macro=True, + steps=proposal.steps, + ) + + self._state.accepted_macros.append(macro_tool) + self._state.available_tools.append(macro_tool) + + # Store macro definition for sequence-based recognition tracking + self._state.macro_definitions[macro_name] = composed_of + + result["decision"] = "approved" + result["name"] = macro_name + result["reason"] = "macro_registered" + logger.info( + "Macro approved: name='%s', steps=%s", + macro_name, + composed_of, + ) + return result + + def _reject_macro( + self, + result: Dict[str, Any], + name: Optional[str], + reason: str, + ) -> Dict[str, Any]: + """Record macro rejection and return standardized metadata payload.""" + + self._state.rejected_macro_count += 1 + result["decision"] = "rejected" + result["name"] = name + result["reason"] = reason + logger.info("Macro rejected: name='%s', reason='%s'", name, reason) + return result + + def _get_next_task_from_generator(self) -> Task: + """Return next task from generator supporting get() or get_input().""" + print("Prompt change") + if self._input_provider is None: + raise RuntimeError("Task data generator not initialized. Call reset() first.") + + return self._input_provider.get_input() + + def _sync_task_queue_from_generator(self) -> None: + """Best-effort sync of remaining tasks for state visibility.""" + + if self._input_provider is None: + self._state.task_queue = [] + return + + if hasattr(self._input_provider, "data") and hasattr(self._input_provider, "idx"): + data = getattr(self._input_provider, "data") + idx = getattr(self._input_provider, "idx") + self._state.task_queue = list(data[idx:]) + return + + # For generic providers without index access, keep queue opaque. + self._state.task_queue = [] + + def _is_done(self) -> bool: + """Return True when the current episode should terminate.""" + + return bool(self._state.done) or self._state.step_count >= self.MAX_EPISODE_STEPS + + @property + def state(self) -> State: + """ + Get the current environment state. + + Returns: + Current State with episode_id and step_count + """ + return self._state + + def get_metadata(self) -> EnvironmentMetadata: + """Return descriptive metadata about this environment.""" + + return EnvironmentMetadata( + name="toolforge_env", + description=( + "A DevOps benchmark where an LLM agent learns to identify " + "recurring tool-call patterns and compose them into reusable " + "macro tools to minimise token consumption." + ), + version="0.1.0", + ) diff --git a/server/tools.py b/server/tools.py new file mode 100644 index 0000000000000000000000000000000000000000..4c897f161bfa08c4ead59b4e6b74fd1bcd1600bf --- /dev/null +++ b/server/tools.py @@ -0,0 +1,94 @@ +import logging +from typing import List + +# Internal imports for building Tool models +from models import Tool + + +# Logger instance for the tools module +logger = logging.getLogger(__name__) + + + +def build_atomic_tools() -> List[Tool]: + """ + Returns a fresh list of the 6 fundamental atomic DevOps tools available + in the environment. Each tool is represented as a Tool Pydantic model. + """ + + logger.info("Building fresh atomic tools list.") + + # --------------------------------------------------------- + # 1. Deploy Tool + # --------------------------------------------------------- + # Description: Deploys a specified service + # Parameters: service_name (string), version (string) + tool_deploy = Tool( + name="deploy", + description="Deploys a specified service or application version to a target environment.", + ) + + # --------------------------------------------------------- + # 2. Healthcheck Tool + # --------------------------------------------------------- + # Description: Checks if a service is healthy + # Parameters: service_name (string) + tool_healthcheck = Tool( + name="healthcheck", + description="Checks the current health status of a running service.", + ) + + # --------------------------------------------------------- + # 3. Notify Tool + # --------------------------------------------------------- + # Description: Sends an alert or notification + # Parameters: channel (string), message (string) + tool_notify = Tool( + name="notify", + description="Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.", + ) + + # --------------------------------------------------------- + # 4. Rollback Tool + # --------------------------------------------------------- + # Description: Reverts a deployment to its previous stable state + # Parameters: service_name (string) + tool_rollback = Tool( + name="rollback", + description="Reverts a deployed service to the previous stable version if something goes wrong.", + ) + + # --------------------------------------------------------- + # 5. Scale Tool + # --------------------------------------------------------- + # Description: Adjusts the replica count for a service + # Parameters: service_name (string), replicas (integer) + tool_scale = Tool( + name="scale", + description="Adjusts the number of running replicas for a given service.", + ) + + # --------------------------------------------------------- + # 6. Restart Tool + # --------------------------------------------------------- + # Description: Bounces a service + # Parameters: service_name (string) + tool_restart = Tool( + name="restart", + description="Performs a rolling restart on a specified service.", + ) + + # Collection list holding all the instantiated Tool models + tools_list = [ + tool_deploy, + tool_healthcheck, + tool_notify, + tool_rollback, + tool_scale, + tool_restart, + ] + + logger.debug(f"Successfully constructed {len(tools_list)} tools.") + + return tools_list + diff --git a/test/test_environment_20260406_072605.log b/test/test_environment_20260406_072605.log new file mode 100644 index 0000000000000000000000000000000000000000..c5ee9f92b30fdcf1b80872767407cbf297d0e058 --- /dev/null +++ b/test/test_environment_20260406_072605.log @@ -0,0 +1,127 @@ +2026-04-06 07:26:05 | INFO | __main__ | Logging initialized. Log file: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_072605.log +2026-04-06 07:26:05 | INFO | __main__ | Starting tests. Output log: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_072605.log +2026-04-06 07:26:05 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | TEST: Environment Reset and Step +2026-04-06 07:26:05 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | ✓ Environment created successfully +2026-04-06 07:26:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 07:26:05 | INFO | __main__ | ✓ Reset successful +2026-04-06 07:26:05 | INFO | __main__ | Episode ID: test-episode-001 +2026-04-06 07:26:05 | INFO | __main__ | Initial Task: easy-deploy-notify +2026-04-06 07:26:05 | INFO | __main__ | Task Prompt: Deploy the 'frontend-web' service version 'v2.1.0', check it... +2026-04-06 07:26:05 | INFO | __main__ | Task Difficulty: easy +2026-04-06 07:26:05 | INFO | __main__ | Required Slots: ['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 07:26:05 | INFO | __main__ | Baseline Call Count: 3 +2026-04-06 07:26:05 | INFO | __main__ | Available Tools: 6 +2026-04-06 07:26:05 | INFO | __main__ | Done: False +2026-04-06 07:26:05 | INFO | __main__ | Reward: 0.0 +2026-04-06 07:26:05 | INFO | __main__ | +================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | STEPPING THROUGH EPISODE +2026-04-06 07:26:05 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | +--- Step 1 --- +2026-04-06 07:26:05 | INFO | __main__ | Current Task ID: easy-deploy-notify +2026-04-06 07:26:05 | INFO | __main__ | Available Tools: ['deploy', 'healthcheck', 'notify', 'rollback', 'scale', 'restart'] +2026-04-06 07:26:05 | INFO | __main__ | Action Plan: ['deploy', 'healthcheck'] +2026-04-06 07:26:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 07:26:05 | INFO | __main__ | ✓ Step executed +2026-04-06 07:26:05 | INFO | __main__ | Reward: -0.366 +2026-04-06 07:26:05 | INFO | __main__ | Done: False +2026-04-06 07:26:05 | INFO | __main__ | Step Count in State: 1 +2026-04-06 07:26:05 | INFO | __main__ | Tokens Used: 12 +2026-04-06 07:26:05 | INFO | __main__ | Tasks Completed: 1 +2026-04-06 07:26:05 | INFO | __main__ | Remaining Tasks in Queue: 0 +2026-04-06 07:26:05 | INFO | __main__ | Next Task ID: easy-deploy-restart +2026-04-06 07:26:05 | INFO | __main__ | Progression: advanced_to_next_task +2026-04-06 07:26:05 | INFO | __main__ | Plan Accepted: True +2026-04-06 07:26:05 | INFO | __main__ | Macro Attempted: False +2026-04-06 07:26:05 | INFO | __main__ | +--- Step 2 --- +2026-04-06 07:26:05 | INFO | __main__ | Current Task ID: easy-deploy-restart +2026-04-06 07:26:05 | INFO | __main__ | Available Tools: ['deploy', 'healthcheck', 'notify', 'rollback', 'scale', 'restart'] +2026-04-06 07:26:05 | INFO | __main__ | Action Plan: ['deploy', 'healthcheck'] +2026-04-06 07:26:05 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 07:26:05 | INFO | __main__ | ✓ Step executed +2026-04-06 07:26:05 | INFO | __main__ | Reward: -0.435 +2026-04-06 07:26:05 | INFO | __main__ | Done: False +2026-04-06 07:26:05 | INFO | __main__ | Step Count in State: 2 +2026-04-06 07:26:05 | INFO | __main__ | Tokens Used: 24 +2026-04-06 07:26:05 | INFO | __main__ | Tasks Completed: 2 +2026-04-06 07:26:05 | INFO | __main__ | Remaining Tasks in Queue: 0 +2026-04-06 07:26:05 | INFO | __main__ | Next Task ID: easy-deploy-scale +2026-04-06 07:26:05 | INFO | __main__ | Progression: advanced_to_next_task +2026-04-06 07:26:05 | INFO | __main__ | Plan Accepted: True +2026-04-06 07:26:05 | INFO | __main__ | Macro Attempted: False +2026-04-06 07:26:05 | INFO | __main__ | +--- Step 3 --- +2026-04-06 07:26:05 | INFO | __main__ | Current Task ID: easy-deploy-scale +2026-04-06 07:26:05 | INFO | __main__ | Available Tools: ['deploy', 'healthcheck', 'notify', 'rollback', 'scale', 'restart'] +2026-04-06 07:26:05 | INFO | __main__ | Action Plan: ['deploy', 'healthcheck'] +2026-04-06 07:26:05 | INFO | server.toolforge_env_environment | Episode complete. Final task 'easy-deploy-scale' finished; no tasks remain. +2026-04-06 07:26:05 | INFO | __main__ | ✓ Step executed +2026-04-06 07:26:05 | INFO | __main__ | Reward: -0.422 +2026-04-06 07:26:05 | INFO | __main__ | Done: True +2026-04-06 07:26:05 | INFO | __main__ | Step Count in State: 3 +2026-04-06 07:26:05 | INFO | __main__ | Tokens Used: 36 +2026-04-06 07:26:05 | INFO | __main__ | Tasks Completed: 3 +2026-04-06 07:26:05 | INFO | __main__ | Remaining Tasks in Queue: 0 +2026-04-06 07:26:05 | INFO | __main__ | Progression: episode_completed +2026-04-06 07:26:05 | INFO | __main__ | Plan Accepted: True +2026-04-06 07:26:05 | INFO | __main__ | Macro Attempted: False +2026-04-06 07:26:05 | INFO | __main__ | +================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | EPISODE SUMMARY +2026-04-06 07:26:05 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | Total Steps Executed: 3 +2026-04-06 07:26:05 | INFO | __main__ | Final State Step Count: 3 +2026-04-06 07:26:05 | INFO | __main__ | Tasks Completed: 3 +2026-04-06 07:26:05 | INFO | __main__ | Accepted Macros: 0 +2026-04-06 07:26:05 | INFO | __main__ | Rejected Macros: 0 +2026-04-06 07:26:05 | INFO | __main__ | Total Tokens Used: 36 +2026-04-06 07:26:05 | INFO | __main__ | Episode Done: True +2026-04-06 07:26:05 | INFO | __main__ | Final Observation Done: True +2026-04-06 07:26:05 | INFO | __main__ | +Completed Tasks: +2026-04-06 07:26:05 | INFO | __main__ | - easy-deploy-notify (easy) +2026-04-06 07:26:05 | INFO | __main__ | - easy-deploy-restart (easy) +2026-04-06 07:26:05 | INFO | __main__ | - easy-deploy-scale (easy) +2026-04-06 07:26:05 | INFO | __main__ | +✓ All assertions passed! +2026-04-06 07:26:05 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | + +================================================================================ +2026-04-06 07:26:05 | INFO | __main__ | TEST: Multiple Tasks in Easy Mode +2026-04-06 07:26:05 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 07:26:05 | INFO | __main__ | ✓ Reset successful for multi-task test +2026-04-06 07:26:05 | INFO | __main__ | Initial Task Queue Size: 0 +2026-04-06 07:26:05 | INFO | __main__ | +Step 1: Task 'easy-deploy-notify' +2026-04-06 07:26:06 | INFO | __main__ | Difficulty: easy +2026-04-06 07:26:06 | INFO | __main__ | Queue Size: 0 +2026-04-06 07:26:06 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 07:26:06 | INFO | __main__ | +Step 2: Task 'easy-deploy-restart' +2026-04-06 07:26:06 | INFO | __main__ | Difficulty: easy +2026-04-06 07:26:06 | INFO | __main__ | Queue Size: 0 +2026-04-06 07:26:06 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 07:26:06 | INFO | __main__ | +Step 3: Task 'easy-deploy-scale' +2026-04-06 07:26:06 | INFO | __main__ | Difficulty: easy +2026-04-06 07:26:06 | INFO | __main__ | Queue Size: 0 +2026-04-06 07:26:06 | INFO | server.toolforge_env_environment | Episode complete. Final task 'easy-deploy-scale' finished; no tasks remain. +2026-04-06 07:26:06 | INFO | __main__ | +✓ Multi-task test completed +2026-04-06 07:26:06 | INFO | __main__ | Total Steps: 3 +2026-04-06 07:26:06 | INFO | __main__ | Unique Tasks Seen: 3 +2026-04-06 07:26:06 | INFO | __main__ | Tasks Completed: 3 +2026-04-06 07:26:06 | INFO | __main__ | Episode Done: True +2026-04-06 07:26:06 | INFO | __main__ | ✓ Multi-task test passed! +2026-04-06 07:26:06 | INFO | __main__ | ================================================================================ +2026-04-06 07:26:06 | INFO | __main__ | + +🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 +2026-04-06 07:26:06 | INFO | __main__ | ALL TESTS PASSED! +2026-04-06 07:26:06 | INFO | __main__ | 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 diff --git a/test/test_environment_20260406_180005.log b/test/test_environment_20260406_180005.log new file mode 100644 index 0000000000000000000000000000000000000000..17eaad9cc03e31faec2025f5a1f28c2220d1899a --- /dev/null +++ b/test/test_environment_20260406_180005.log @@ -0,0 +1,27 @@ +2026-04-06 18:00:05 | INFO | __main__ | Logging initialized. Log file: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_180005.log +2026-04-06 18:00:05 | INFO | __main__ | Starting tests. Output log: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_180005.log +2026-04-06 18:00:05 | INFO | __main__ | ================================================================================ +2026-04-06 18:00:05 | INFO | __main__ | TEST: Environment Reset and Step +2026-04-06 18:00:05 | INFO | __main__ | ================================================================================ +2026-04-06 18:00:05 | INFO | __main__ | Task selector created successfully: +2026-04-06 18:00:05 | INFO | __main__ | ✓ Environment created successfully: +2026-04-06 18:00:05 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 18:00:05 | INFO | __main__ | ✓ Reset successful +2026-04-06 18:00:05 | INFO | __main__ | Episode ID: test-episode-001 +2026-04-06 18:00:05 | INFO | __main__ | Initial Task: easy-deploy-notify +2026-04-06 18:00:05 | INFO | __main__ | Task Prompt: Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. +2026-04-06 18:00:05 | INFO | __main__ | Task Difficulty: easy +2026-04-06 18:00:05 | INFO | __main__ | Required Slots: ['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 18:00:05 | INFO | __main__ | Baseline Call Count: 3 +2026-04-06 18:00:05 | INFO | __main__ | Available Tools: [{'name': 'deploy', 'description': 'Deploys a specified service or application version to a target environment.', 'is_macro': False, 'token_cost': 10, 'required_params': ['service_name', 'version'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to deploy'}, 'version': {'type': 'string', 'description': 'Version tag or commit hash'}}, 'composed_of': []}, {'name': 'healthcheck', 'description': 'Checks the current health status of a running service.', 'is_macro': False, 'token_cost': 2, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to check'}}, 'composed_of': []}, {'name': 'notify', 'description': 'Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.', 'is_macro': False, 'token_cost': 1, 'required_params': ['channel', 'message'], 'params_schema': {'channel': {'type': 'string', 'description': 'Target communication channel'}, 'message': {'type': 'string', 'description': 'The message body to send'}}, 'composed_of': []}, {'name': 'rollback', 'description': 'Reverts a deployed service to the previous stable version if something goes wrong.', 'is_macro': False, 'token_cost': 15, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to rollback'}}, 'composed_of': []}, {'name': 'scale', 'description': 'Adjusts the number of running replicas for a given service.', 'is_macro': False, 'token_cost': 5, 'required_params': ['service_name', 'replicas'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to scale'}, 'replicas': {'type': 'integer', 'description': 'Desired number of running instances'}}, 'composed_of': []}, {'name': 'restart', 'description': 'Performs a rolling restart on a specified service.', 'is_macro': False, 'token_cost': 8, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to restart'}}, 'composed_of': []}] +2026-04-06 18:00:05 | INFO | __main__ | Done: False +2026-04-06 18:00:05 | INFO | __main__ | Reward: 0.0 +2026-04-06 18:00:05 | INFO | __main__ | +================================================================================ +2026-04-06 18:00:05 | INFO | __main__ | THREE-STEP MACRO FLOW +2026-04-06 18:00:05 | INFO | __main__ | ================================================================================ +2026-04-06 18:00:05 | INFO | __main__ | +--- Step 1: Propose valid macro --- +2026-04-06 18:00:05 | INFO | server.evaluation_pipeline | [step=1] Evaluation pipeline start: task_id=easy-deploy-notify, plan_calls=2 +2026-04-06 18:00:05 | ERROR | __main__ | +❌ Test failed with exception: name 'math' is not defined diff --git a/test/test_environment_20260406_180116.log b/test/test_environment_20260406_180116.log new file mode 100644 index 0000000000000000000000000000000000000000..152eaabdcee2382f42d453972060809b79fa6b10 --- /dev/null +++ b/test/test_environment_20260406_180116.log @@ -0,0 +1,28 @@ +2026-04-06 18:01:16 | INFO | __main__ | Logging initialized. Log file: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_180116.log +2026-04-06 18:01:16 | INFO | __main__ | Starting tests. Output log: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_180116.log +2026-04-06 18:01:16 | INFO | __main__ | ================================================================================ +2026-04-06 18:01:16 | INFO | __main__ | TEST: Environment Reset and Step +2026-04-06 18:01:16 | INFO | __main__ | ================================================================================ +2026-04-06 18:01:16 | INFO | __main__ | Task selector created successfully: +2026-04-06 18:01:16 | INFO | __main__ | ✓ Environment created successfully: +2026-04-06 18:01:16 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 18:01:16 | INFO | __main__ | ✓ Reset successful +2026-04-06 18:01:16 | INFO | __main__ | Episode ID: test-episode-001 +2026-04-06 18:01:16 | INFO | __main__ | Initial Task: easy-deploy-notify +2026-04-06 18:01:16 | INFO | __main__ | Task Prompt: Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. +2026-04-06 18:01:16 | INFO | __main__ | Task Difficulty: easy +2026-04-06 18:01:16 | INFO | __main__ | Required Slots: ['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 18:01:16 | INFO | __main__ | Baseline Call Count: 3 +2026-04-06 18:01:16 | INFO | __main__ | Available Tools: [{'name': 'deploy', 'description': 'Deploys a specified service or application version to a target environment.', 'is_macro': False, 'token_cost': 10, 'required_params': ['service_name', 'version'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to deploy'}, 'version': {'type': 'string', 'description': 'Version tag or commit hash'}}, 'composed_of': []}, {'name': 'healthcheck', 'description': 'Checks the current health status of a running service.', 'is_macro': False, 'token_cost': 2, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to check'}}, 'composed_of': []}, {'name': 'notify', 'description': 'Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.', 'is_macro': False, 'token_cost': 1, 'required_params': ['channel', 'message'], 'params_schema': {'channel': {'type': 'string', 'description': 'Target communication channel'}, 'message': {'type': 'string', 'description': 'The message body to send'}}, 'composed_of': []}, {'name': 'rollback', 'description': 'Reverts a deployed service to the previous stable version if something goes wrong.', 'is_macro': False, 'token_cost': 15, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to rollback'}}, 'composed_of': []}, {'name': 'scale', 'description': 'Adjusts the number of running replicas for a given service.', 'is_macro': False, 'token_cost': 5, 'required_params': ['service_name', 'replicas'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to scale'}, 'replicas': {'type': 'integer', 'description': 'Desired number of running instances'}}, 'composed_of': []}, {'name': 'restart', 'description': 'Performs a rolling restart on a specified service.', 'is_macro': False, 'token_cost': 8, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to restart'}}, 'composed_of': []}] +2026-04-06 18:01:16 | INFO | __main__ | Done: False +2026-04-06 18:01:16 | INFO | __main__ | Reward: 0.0 +2026-04-06 18:01:16 | INFO | __main__ | +================================================================================ +2026-04-06 18:01:16 | INFO | __main__ | THREE-STEP MACRO FLOW +2026-04-06 18:01:16 | INFO | __main__ | ================================================================================ +2026-04-06 18:01:16 | INFO | __main__ | +--- Step 1: Propose valid macro --- +2026-04-06 18:01:16 | INFO | server.evaluation_pipeline | [step=1] Evaluation pipeline start: task_id=easy-deploy-notify, plan_calls=2 +2026-04-06 18:01:16 | INFO | server.evaluation_pipeline | [step=1] Stage-3 plan accuracy: score=-0.665, slot_completion=0.667, unnecessary_penalty=-0.000 +2026-04-06 18:01:16 | ERROR | __main__ | +❌ Test failed with exception: 'Task' object has no attribute 'required_steps' diff --git a/test/test_environment_20260406_180407.log b/test/test_environment_20260406_180407.log new file mode 100644 index 0000000000000000000000000000000000000000..4b8a4a64890e5ad7a57b2f1239275d8839dd198d --- /dev/null +++ b/test/test_environment_20260406_180407.log @@ -0,0 +1,80 @@ +2026-04-06 18:04:07 | INFO | __main__ | Logging initialized. Log file: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_180407.log +2026-04-06 18:04:07 | INFO | __main__ | Starting tests. Output log: F:\RL\OpenEnv\Tool_forge_project\openenv-SSV\toolforge_env\test\test_environment_20260406_180407.log +2026-04-06 18:04:07 | INFO | __main__ | ================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | TEST: Environment Reset and Step +2026-04-06 18:04:07 | INFO | __main__ | ================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | Task selector created successfully: +2026-04-06 18:04:07 | INFO | __main__ | ✓ Environment created successfully: +2026-04-06 18:04:07 | INFO | server.tools | Building fresh atomic tools list. +2026-04-06 18:04:07 | INFO | __main__ | ✓ Reset successful +2026-04-06 18:04:07 | INFO | __main__ | Episode ID: test-episode-001 +2026-04-06 18:04:07 | INFO | __main__ | Initial Task: easy-deploy-notify +2026-04-06 18:04:07 | INFO | __main__ | Task Prompt: Deploy the 'frontend-web' service version 'v2.1.0', check its health, and notify the '#deployments' channel that it is done. +2026-04-06 18:04:07 | INFO | __main__ | Task Difficulty: easy +2026-04-06 18:04:07 | INFO | __main__ | Required Slots: ['deployment_execution', 'deployment_verification', 'deployment_notification'] +2026-04-06 18:04:07 | INFO | __main__ | Baseline Call Count: 3 +2026-04-06 18:04:07 | INFO | __main__ | Available Tools: [{'name': 'deploy', 'description': 'Deploys a specified service or application version to a target environment.', 'is_macro': False, 'token_cost': 10, 'required_params': ['service_name', 'version'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to deploy'}, 'version': {'type': 'string', 'description': 'Version tag or commit hash'}}, 'composed_of': []}, {'name': 'healthcheck', 'description': 'Checks the current health status of a running service.', 'is_macro': False, 'token_cost': 2, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to check'}}, 'composed_of': []}, {'name': 'notify', 'description': 'Sends a notification to a specific channel (e.g., Slack, Email) regarding system status.', 'is_macro': False, 'token_cost': 1, 'required_params': ['channel', 'message'], 'params_schema': {'channel': {'type': 'string', 'description': 'Target communication channel'}, 'message': {'type': 'string', 'description': 'The message body to send'}}, 'composed_of': []}, {'name': 'rollback', 'description': 'Reverts a deployed service to the previous stable version if something goes wrong.', 'is_macro': False, 'token_cost': 15, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to rollback'}}, 'composed_of': []}, {'name': 'scale', 'description': 'Adjusts the number of running replicas for a given service.', 'is_macro': False, 'token_cost': 5, 'required_params': ['service_name', 'replicas'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to scale'}, 'replicas': {'type': 'integer', 'description': 'Desired number of running instances'}}, 'composed_of': []}, {'name': 'restart', 'description': 'Performs a rolling restart on a specified service.', 'is_macro': False, 'token_cost': 8, 'required_params': ['service_name'], 'params_schema': {'service_name': {'type': 'string', 'description': 'Name of the service to restart'}}, 'composed_of': []}] +2026-04-06 18:04:07 | INFO | __main__ | Done: False +2026-04-06 18:04:07 | INFO | __main__ | Reward: 0.0 +2026-04-06 18:04:07 | INFO | __main__ | +================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | THREE-STEP MACRO FLOW +2026-04-06 18:04:07 | INFO | __main__ | ================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | +--- Step 1: Propose valid macro --- +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=1] Evaluation pipeline start: task_id=easy-deploy-notify, plan_calls=2 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=1] Stage-3 plan accuracy: score=-0.665, slot_completion=0.667, unnecessary_penalty=-0.000 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=1] Stage-4 token cost: used=12, baseline=60, efficiency_ratio=0.800, efficiency_score=0.800, macro_bonus=0.000 +2026-04-06 18:04:07 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.226 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=1] Stage-5 final reward: -0.226 +2026-04-06 18:04:07 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-notify' to 'easy-deploy-restart'. Remaining tasks=0 +2026-04-06 18:04:07 | INFO | server.toolforge_env_environment | Macro approved: name='deploy_and_verify_macro', steps=['deploy', 'healthcheck'], token_cost=10 +2026-04-06 18:04:07 | INFO | __main__ | Step 1 reward=-0.226 done=False +2026-04-06 18:04:07 | INFO | __main__ | Step 1 macro_decision=approved +2026-04-06 18:04:07 | INFO | __main__ | +--- Step 2: Use created macro --- +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=2] Evaluation pipeline start: task_id=easy-deploy-restart, plan_calls=1 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=2] Stage-3 plan accuracy: score=-0.957, slot_completion=0.200, unnecessary_penalty=-0.000 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=2] Stage-4 token cost: used=10, baseline=100, efficiency_ratio=0.900, efficiency_score=1.000, macro_bonus=0.100 +2026-04-06 18:04:07 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.370 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=2] Stage-5 final reward: -0.370 +2026-04-06 18:04:07 | INFO | server.toolforge_env_environment | Task advanced from 'easy-deploy-restart' to 'easy-deploy-scale'. Remaining tasks=0 +2026-04-06 18:04:07 | INFO | __main__ | Step 2 reward=-0.370 done=False +2026-04-06 18:04:07 | INFO | __main__ | Step 2 plan_accepted=True +2026-04-06 18:04:07 | INFO | __main__ | +--- Step 3: Propose invalid macro with wrong_tool --- +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=3] Evaluation pipeline start: task_id=easy-deploy-scale, plan_calls=1 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=3] Stage-3 plan accuracy: score=-0.941, slot_completion=0.250, unnecessary_penalty=-0.000 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=3] Stage-4 token cost: used=10, baseline=80, efficiency_ratio=0.875, efficiency_score=0.875, macro_bonus=0.000 +2026-04-06 18:04:07 | INFO | toolforge_env.server.plan_evaluator | Final Reward: -0.397 +2026-04-06 18:04:07 | INFO | server.evaluation_pipeline | [step=3] Stage-5 final reward: -0.397 +2026-04-06 18:04:07 | INFO | server.toolforge_env_environment | Episode complete. Final task 'easy-deploy-scale' finished; no tasks remain. +2026-04-06 18:04:07 | INFO | server.toolforge_env_environment | Macro rejected: name='invalid_macro', reason='macro_contains_unknown_tools:wrong_tool' +2026-04-06 18:04:07 | INFO | __main__ | Step 3 reward=-0.397 done=True +2026-04-06 18:04:07 | INFO | __main__ | Step 3 macro_decision=rejected +2026-04-06 18:04:07 | INFO | __main__ | Step 3 macro_reason=macro_contains_unknown_tools:wrong_tool +2026-04-06 18:04:07 | INFO | __main__ | +================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | EPISODE SUMMARY +2026-04-06 18:04:07 | INFO | __main__ | ================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | Total Steps Executed: 3 +2026-04-06 18:04:07 | INFO | __main__ | Final State Step Count: 3 +2026-04-06 18:04:07 | INFO | __main__ | Tasks Completed: 3 +2026-04-06 18:04:07 | INFO | __main__ | Accepted Macros: 1 +2026-04-06 18:04:07 | INFO | __main__ | Rejected Macros: 1 +2026-04-06 18:04:07 | INFO | __main__ | Total Tokens Used: 32 +2026-04-06 18:04:07 | INFO | __main__ | Episode Done: True +2026-04-06 18:04:07 | INFO | __main__ | Final Observation Done: True +2026-04-06 18:04:07 | INFO | __main__ | +Completed Tasks: +2026-04-06 18:04:07 | INFO | __main__ | - easy-deploy-notify (easy) +2026-04-06 18:04:07 | INFO | __main__ | - easy-deploy-restart (easy) +2026-04-06 18:04:07 | INFO | __main__ | - easy-deploy-scale (easy) +2026-04-06 18:04:07 | INFO | __main__ | +✓ All assertions passed! +2026-04-06 18:04:07 | INFO | __main__ | ================================================================================ +2026-04-06 18:04:07 | INFO | __main__ | + +🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 +2026-04-06 18:04:07 | INFO | __main__ | ALL TESTS PASSED! +2026-04-06 18:04:07 | INFO | __main__ | 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 diff --git a/test_environment1.py b/test_environment1.py new file mode 100644 index 0000000000000000000000000000000000000000..86e9852aaaf6454f0082665303f2b9bf45b4617b --- /dev/null +++ b/test_environment1.py @@ -0,0 +1,303 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +""" +Basic integration test for ToolforgeEnvironment. + +Tests the full episode lifecycle: +1. Create environment with task provider factory +2. Reset with eval mode and easy difficulty +3. Execute step actions through all tasks in the queue +4. Verify state progression and episode termination +""" + +from datetime import datetime +import logging +from pathlib import Path + +from server.toolforge_env_environment import ToolforgeEnvironment +from server.inputs.factory import create_input_provider +from server.inputs.simulated.task_selector import TaskSelector +from models import ToolforgeAction, ToolCall + +logger = logging.getLogger(__name__) + + +def configure_logging() -> Path: + """Configure console + timestamped file logging under test/ directory.""" + + log_dir = Path(__file__).parent / "test" + log_dir.mkdir(parents=True, exist_ok=True) + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_file_path = log_dir / f"test_environment_{timestamp}.log" + + root_logger = logging.getLogger() + root_logger.setLevel(logging.INFO) + root_logger.handlers.clear() + + formatter = logging.Formatter( + "%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", + "%Y-%m-%d %H:%M:%S", + ) + + file_handler = logging.FileHandler(log_file_path, encoding="utf-8") + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + + stream_handler = logging.StreamHandler() + stream_handler.setLevel(logging.INFO) + stream_handler.setFormatter(formatter) + + root_logger.addHandler(file_handler) + root_logger.addHandler(stream_handler) + + logger.info("Logging initialized. Log file: %s", log_file_path) + return log_file_path + + +def test_environment_reset_and_step(): + """ + Test basic reset → step → step scenario. + + Verifies: + - Environment initializes correctly + - Reset provides valid observation and task + - Step processes actions without crashing + - Step returns correct done/reward signals + - State advances through tasks + """ + logger.info("=" * 80) + logger.info("TEST: Environment Reset and Step") + logger.info("=" * 80) + + # ─────────────────────────────────────────────────────────────────────── + # 1. Initialize environment with task provider factory + # ─────────────────────────────────────────────────────────────────────── + task_selector = TaskSelector(mode="eval") + logger.info(f"Task selector created successfully: {task_selector}") + env = ToolforgeEnvironment( + task_selector=task_selector, + input_provider_factory=create_input_provider + ) + logger.info(f"✓ Environment created successfully: {env}") + + # ─────────────────────────────────────────────────────────────────────── + # 2. Reset environment in eval mode with easy difficulty + # ─────────────────────────────────────────────────────────────────────── + reset_kwargs = { + "episode_id": "test-episode-001", + "mode": "eval", + "difficulty": "easy", + "seed": 42, + } + obs = env.reset(**reset_kwargs) + + logger.info(f"✓ Reset successful") + logger.info(f" Episode ID: {env.state.episode_id}") + logger.info(f" Initial Task: {obs.current_task.id}") + logger.info(f" Task Prompt: {obs.current_task.prompt}") + logger.info(f" Task Difficulty: {obs.current_task.difficulty}") + logger.info(f" Required Slots: {obs.current_task.required_slots}") + logger.info(f" Baseline Call Count: {obs.current_task.baseline_call_count}") + logger.info(f" Available Tools: {obs.available_tools}") + logger.info(f" Done: {obs.done}") + logger.info(f" Reward: {obs.reward}") + + assert obs is not None, "Reset should return observation" + assert obs.current_task is not None, "Reset should provide current task" + assert not obs.done, "Episode should not be done immediately after reset" + assert len(obs.available_tools) > 0, "Some tools should be available" + + # ─────────────────────────────────────────────────────────────────────── + # 3. Build sample actions and execute steps + # ─────────────────────────────────────────────────────────────────────── + step_count = 0 + max_steps = 20 # Limit iterations to prevent infinite loops + + logger.info("\n" + "=" * 80) + logger.info("STEPPING THROUGH EPISODE") + logger.info("=" * 80) + + while not obs.done and step_count < max_steps: + step_count += 1 + current_task_id = obs.current_task.id + logger.info(f"\n--- Step {step_count} ---") + logger.info(f"Current Task ID: {current_task_id}") + + # Get tool names from available tools + available_tool_names = [tool.name for tool in obs.available_tools] + logger.info(f"Available Tools: {available_tool_names}") + + # Create a sample action: deploy service with healthcheck and notify + # This mirrors a typical DevOps workflow pattern + sample_plan = [ + ToolCall( + tool_name="deploy", + params={ + "service_name": "test-service", + "version": "v1.0.0" + } + ), + ToolCall( + tool_name="healthcheck", + params={ + "service_name": "test-service" + } + ), + ] + + action = ToolforgeAction( + action_type="propose_plan", + plan=sample_plan, + macro_proposal=None, + reasoning="Deploy service and verify health for ease-difficulty task completion" + ) + + logger.info(f"Action Plan: {[f'{call.tool_name}' for call in action.plan]}") + + # Execute the action + obs = env.step(action) + + logger.info(f"✓ Step executed") + logger.info(f" Reward: {obs.reward:.3f}") + logger.info(f" Done: {obs.done}") + logger.info(f" Step Count in State: {env.state.step_count}") + logger.info(f" Tokens Used: {env.state.tokens_used}") + logger.info(f" Tasks Completed: {len(env.state.completed_tasks)}") + logger.info(f" Remaining Tasks in Queue: {len(env.state.task_queue)}") + + if not obs.done and obs.current_task: + logger.info(f" Next Task ID: {obs.current_task.id}") + + # Metadata from step + if hasattr(obs, 'metadata') and obs.metadata: + logger.info(f" Progression: {obs.metadata.get('progression', 'N/A')}") + logger.info(f" Plan Accepted: {obs.metadata.get('plan_accepted', 'N/A')}") + logger.info(f" Macro Attempted: {obs.metadata.get('macro_attempted', 'N/A')}") + + # ─────────────────────────────────────────────────────────────────────── + # 4. Verify episode completion + # ─────────────────────────────────────────────────────────────────────── + logger.info("\n" + "=" * 80) + logger.info("EPISODE SUMMARY") + logger.info("=" * 80) + logger.info(f"Total Steps Executed: {step_count}") + logger.info(f"Final State Step Count: {env.state.step_count}") + logger.info(f"Tasks Completed: {len(env.state.completed_tasks)}") + logger.info(f"Accepted Macros: {len(env.state.accepted_macros)}") + logger.info(f"Rejected Macros: {env.state.rejected_macro_count}") + logger.info(f"Total Tokens Used: {env.state.tokens_used}") + logger.info(f"Episode Done: {env.state.done}") + logger.info(f"Final Observation Done: {obs.done}") + + # List completed tasks + if env.state.completed_tasks: + logger.info(f"\nCompleted Tasks:") + for task in env.state.completed_tasks: + logger.info(f" - {task.id} ({task.difficulty})") + + # Assertions to verify correctness + assert obs.done or step_count >= max_steps, "Episode should be done or max steps reached" + assert env.state.step_count > 0, "Step count should be incremented" + assert len(env.state.completed_tasks) > 0, "At least one task should be completed" + assert env.state.tokens_used >= 0, "Token usage should be non-negative" + + logger.info("\n✓ All assertions passed!") + logger.info("=" * 80) + + +def test_environment_multiple_tasks_easy(): + """ + Test environment through multiple easy-difficulty tasks. + + Verifies: + - Task queue is properly managed + - Episode progresses through multiple tasks + - Each task is properly presented and tracked + """ + logger.info("\n\n" + "=" * 80) + logger.info("TEST: Multiple Tasks in Easy Mode") + logger.info("=" * 80) + + task_selector = TaskSelector(mode="eval") + env = ToolforgeEnvironment( + task_selector=task_selector, + input_provider_factory=create_input_provider + ) + + # Reset with easy difficulty + obs = env.reset( + episode_id="test-episode-multi", + mode="eval", + difficulty="easy", + seed=42, + ) + + logger.info(f"✓ Reset successful for multi-task test") + logger.info(f" Initial Task Queue Size: {len(env.state.task_queue)}") + + task_ids_seen = set() + step_count = 0 + max_steps = 50 + + while not obs.done and step_count < max_steps: + step_count += 1 + task_id = obs.current_task.id + task_ids_seen.add(task_id) + + logger.info(f"\nStep {step_count}: Task '{task_id}'") + logger.info(f" Difficulty: {obs.current_task.difficulty}") + logger.info(f" Queue Size: {len(env.state.task_queue)}") + + # Create minimal action plan + action = ToolforgeAction( + action_type="propose_plan", + plan=[ + ToolCall( + tool_name="deploy", + params={"service_name": "test", "version": "v1.0.0"} + ) + ], + macro_proposal=None, + reasoning="Test action" + ) + + obs = env.step(action) + + logger.info(f"\n✓ Multi-task test completed") + logger.info(f" Total Steps: {step_count}") + logger.info(f" Unique Tasks Seen: {len(task_ids_seen)}") + logger.info(f" Tasks Completed: {len(env.state.completed_tasks)}") + logger.info(f" Episode Done: {obs.done}") + + assert len(task_ids_seen) > 0, "Should see at least one task" + assert len(env.state.completed_tasks) > 0, "Should complete at least one task" + + logger.info("✓ Multi-task test passed!") + logger.info("=" * 80) + + +if __name__ == "__main__": + # ─────────────────────────────────────────────────────────────────────── + # Run all tests + # ─────────────────────────────────────────────────────────────────────── + log_path = configure_logging() + try: + logger.info("Starting tests. Output log: %s", log_path) + test_environment_reset_and_step() + test_environment_multiple_tasks_easy() + + logger.info("\n\n" + "🎉 " * 20) + logger.info("ALL TESTS PASSED!") + logger.info("🎉 " * 20) + + except AssertionError as e: + logger.error(f"\n❌ Test assertion failed: {e}") + raise + except Exception as e: + logger.error(f"\n❌ Test failed with exception: {e}") + raise diff --git a/test_reward.py b/test_reward.py new file mode 100644 index 0000000000000000000000000000000000000000..084dbf914ff7bc336aa33180aba5591c81471ca2 --- /dev/null +++ b/test_reward.py @@ -0,0 +1,392 @@ +import os +import json +import logging +from datetime import datetime +from pathlib import Path +from typing import Any, Callable, Dict, List, Tuple + +from models import Tool, ToolCall, ToolforgeAction +from server.inputs.factory import create_input_provider +from server.inputs.simulated.task_selector import TaskSelector +from server.toolforge_env_environment import ToolforgeEnvironment + +# Check for LLM credentials in the environment +HF_TOKEN = os.getenv("HF_TOKEN") +API_BASE = os.getenv("API_BASE_URL", "https://router.huggingface.co/v1") +MODEL_ID = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-72B-Instruct") + +logger = logging.getLogger(__name__) + +def check_llm_status(): + if HF_TOKEN: + print(f"--- LLM CONFIG DETECTED ---") + print(f" Target: {API_BASE}") + print(f" Model: {MODEL_ID}") + print(f" Mode: LIVE LLM EVALUATION") + else: + print(f"--- LLM CONFIG MISSING ---") + print(f" HF_TOKEN not found in environment.") + print(f" Mode: SIMULATED EVALUATION (FALLBACK)") + print("-" * 30) + + +def configure_logging() -> Path: + """Configure console and timestamped file logging under reward_logs/.""" + log_dir = Path(__file__).parent / "reward_logs" + log_dir.mkdir(parents=True, exist_ok=True) + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_file_path = log_dir / f"reward_test_{timestamp}.log" + + root_logger = logging.getLogger() + root_logger.setLevel(logging.INFO) + root_logger.handlers.clear() + + formatter = logging.Formatter( + "%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", + "%Y-%m-%d %H:%M:%S", + ) + + file_handler = logging.FileHandler(log_file_path, encoding="utf-8") + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + + stream_handler = logging.StreamHandler() + stream_handler.setLevel(logging.INFO) + stream_handler.setFormatter(formatter) + + root_logger.addHandler(file_handler) + root_logger.addHandler(stream_handler) + logger.info("Reward logging initialized: %s", log_file_path) + return log_file_path + + +def banner(title: str) -> None: + line = "=" * 100 + logger.info(line) + logger.info(title) + logger.info(line) + + +def safe_dump(obj: Any) -> str: + try: + if hasattr(obj, "model_dump"): + payload = obj.model_dump() + elif isinstance(obj, dict): + payload = obj + else: + payload = str(obj) + return json.dumps(payload, indent=2, default=str, ensure_ascii=True) + except Exception as exc: # pragma: no cover - defensive logging helper + return f" {obj!r}" + + +def log_observation(obs: Any) -> None: + logger.info("Observation snapshot:\n%s", safe_dump(obs)) + + +def log_state(env: ToolforgeEnvironment) -> None: + state = env.state + snapshot = { + "episode_id": getattr(state, "episode_id", None), + "step_count": getattr(state, "step_count", None), + "current_task_id": getattr(getattr(state, "current_task", None), "id", None), + "task_queue_size": len(getattr(state, "task_queue", [])), + "completed_tasks": [task.id for task in getattr(state, "completed_tasks", [])], + "accepted_macros": [tool.name for tool in getattr(state, "accepted_macros", [])], + "rejected_macro_count": getattr(state, "rejected_macro_count", None), + "tokens_used": getattr(state, "tokens_used", None), + "sequence_counts": getattr(state, "sequence_counts", {}), + "macro_usage_counts": getattr(state, "macro_usage_counts", {}), + "macro_definitions": getattr(state, "macro_definitions", {}), + } + logger.info("Environment state snapshot:\n%s", safe_dump(snapshot)) + + +def make_call(tool_name: str) -> ToolCall: + return ToolCall(tool_name=tool_name) + + +def make_macro(name: str, description: str, steps: List[ToolCall]) -> Tool: + return Tool( + name=name, + description=description, + is_macro=True, + token_cost=1, + steps=steps, + ) + + +def build_deploy_health_steps() -> List[ToolCall]: + return [ + make_call("deploy"), + make_call("healthcheck"), + ] + + +def build_full_action_for_task(task_id: str) -> ToolforgeAction: + if task_id == "easy-deploy-notify": + plan = [ + make_call("deploy"), + make_call("healthcheck"), + make_call("notify"), + ] + elif task_id == "easy-deploy-restart": + plan = [ + make_call("deploy"), + make_call("healthcheck"), + make_call("restart"), + make_call("healthcheck"), + make_call("notify"), + ] + elif task_id == "easy-deploy-scale": + plan = [ + make_call("deploy"), + make_call("scale"), + make_call("healthcheck"), + make_call("notify"), + ] + else: + plan = [make_call("healthcheck")] + + return ToolforgeAction( + action_type="propose_plan", + plan=plan, + macro_proposal=None, + ) + + +def build_zero_fill_action() -> ToolforgeAction: + return ToolforgeAction( + action_type="propose_plan", + plan=[make_call("scale")], + macro_proposal=None, + ) + + +def build_partial_fill_action() -> ToolforgeAction: + return ToolforgeAction( + action_type="propose_plan", + plan=[make_call("deploy")], + macro_proposal=None, + ) + + +def build_wrong_tool_action() -> ToolforgeAction: + return ToolforgeAction( + action_type="propose_plan", + plan=[make_call("wrong_tool")], + macro_proposal=None, + ) + + +def build_premature_macro_creation_action() -> ToolforgeAction: + macro_steps = build_deploy_health_steps() + return ToolforgeAction( + action_type="propose_plan_with_macro", + plan=macro_steps, + macro_proposal=make_macro( + name="deploy_and_verify_macro", + description="Deploy service and run a healthcheck.", + steps=macro_steps, + ), + ) + + +def build_repeat_sequence_seed(step_label: str) -> ToolforgeAction: + macro_steps = build_deploy_health_steps() + return ToolforgeAction( + action_type="propose_plan", + plan=macro_steps, + macro_proposal=None, + ) + + +def build_mature_macro_creation_action() -> ToolforgeAction: + macro_steps = build_deploy_health_steps() + return ToolforgeAction( + action_type="propose_plan_with_macro", + plan=macro_steps, + macro_proposal=make_macro( + name="deploy_and_verify_macro", + description="Deploy service and run a healthcheck.", + steps=macro_steps, + ), + ) + + +def build_wrong_macro_creation_action() -> ToolforgeAction: + valid_plan = build_deploy_health_steps() + return ToolforgeAction( + action_type="propose_plan_with_macro", + plan=valid_plan, + macro_proposal=make_macro( + name="broken_macro", + description="Contains an invalid tool and should be rejected.", + steps=[ + valid_plan[0], + make_call("wrong_tool"), + ], + ), + ) + + +def build_macro_only_action() -> ToolforgeAction: + return ToolforgeAction( + action_type="propose_plan", + plan=[make_call("deploy_and_verify_macro")], + macro_proposal=None, + ) + + +def build_wrong_macro_name_action() -> ToolforgeAction: + return ToolforgeAction( + action_type="propose_plan", + plan=[make_call("missing_macro_name")], + macro_proposal=None, + ) + + +def build_macro_plus_atomic_action(task_id: str) -> ToolforgeAction: + if task_id == "easy-deploy-notify": + plan = [ + make_call("deploy_and_verify_macro"), + make_call("notify"), + ] + elif task_id == "easy-deploy-restart": + plan = [ + make_call("deploy_and_verify_macro"), + make_call("restart"), + make_call("healthcheck"), + make_call("notify"), + ] + else: + plan = [ + make_call("deploy_and_verify_macro"), + make_call("scale"), + make_call("healthcheck"), + make_call("notify"), + ] + + return ToolforgeAction( + action_type="propose_plan", + plan=plan, + macro_proposal=None, + ) + + +def run_episode( + title: str, + scenario_builders: List[Tuple[str, str, Callable[[str], ToolforgeAction]]], + summary_rows: List[Dict[str, Any]], +) -> None: + banner(title) + task_selector = TaskSelector(mode="eval") + env = ToolforgeEnvironment(task_selector=task_selector, input_provider_factory=create_input_provider) + obs = env.reset(episode_id=title.replace(" ", "-").lower(), mode="eval", difficulty="easy") + + logger.info("Episode reset complete") + log_observation(obs) + log_state(env) + + for step_index, (scenario_name, expectation, builder) in enumerate(scenario_builders, start=1): + if obs.done: + logger.warning("Episode ended before scenario '%s' could run.", scenario_name) + summary_rows.append({ + "episode": title, + "step": step_index, + "scenario": scenario_name, + "task_id": None, + "reward": None, + "done": True, + "summary": "SKIPPED_EPISODE_DONE", + }) + continue + + current_task = obs.current_task + banner(f"{title} | Step {step_index} | Scenario: {scenario_name}") + logger.info("Expected behavior: %s", expectation) + logger.info("Current task id=%s", current_task.id) + logger.info("Current task prompt=%s", current_task.prompt) + logger.info("Current task required_slots=%s", current_task.required_slots) + logger.info("Current task baseline_call_count=%s", current_task.baseline_call_count) + + action = builder(current_task.id) + logger.info("Action payload:\n%s", safe_dump(action)) + + obs = env.step(action) + + logger.info("Reward after step: %.4f", obs.reward if obs.reward is not None else 0.0) + logger.info("Done after step: %s", obs.done) + log_observation(obs) + log_state(env) + + summary_rows.append({ + "episode": title, + "step": step_index, + "scenario": scenario_name, + "task_id": current_task.id, + "reward": obs.reward, + "done": obs.done, + "summary": (obs.metadata or {}).get("summary") if hasattr(obs, "metadata") else None, + "plan_accepted": (obs.metadata or {}).get("plan_accepted") if hasattr(obs, "metadata") else None, + "macro_decision": (obs.metadata or {}).get("macro_decision") if hasattr(obs, "metadata") else None, + }) + + +def main() -> None: + check_llm_status() + log_path = configure_logging() + banner("REWARD TEST HARNESS START") + logger.info("This harness focuses on reward-relevant scenarios and logs all step/observation details.") + logger.info("Log file path: %s", log_path) + + summary_rows: List[Dict[str, Any]] = [] + + run_episode( + title="Episode A - Macro Maturity Threshold", + scenario_builders=[ + ("repeat-sequence-seed-1", "First appearance of deploy->healthcheck sequence.", lambda _task_id: build_repeat_sequence_seed("seed-1")), + ("repeat-sequence-seed-2", "Second appearance of deploy->healthcheck sequence.", lambda _task_id: build_repeat_sequence_seed("seed-2")), + ("mature-macro-creation", "Macro proposal should now have prior sequence history available.", lambda _task_id: build_mature_macro_creation_action()), + ], + summary_rows=summary_rows, + ) + + run_episode( + title="Episode B - Premature Macro and Macro Usage", + scenario_builders=[ + ("premature-macro-creation", "Macro proposal occurs before enough prior sequence repetition; no recognition reward expected.", lambda _task_id: build_premature_macro_creation_action()), + ("plan-with-macro-tool-call", "Plan uses the approved macro directly on the next task.", lambda _task_id: build_macro_only_action()), + ("plan-with-macro-and-atomic", "Plan mixes an approved macro call with atomic tool calls.", build_macro_plus_atomic_action), + ], + summary_rows=summary_rows, + ) + + run_episode( + title="Episode C - Slot Fill and Validation Paths", + scenario_builders=[ + ("wrong-tool-call", "Stage 1 validation should reject the plan because the tool name does not exist.", lambda _task_id: build_wrong_tool_action()), + ("zero-filled-slots", "Plan should produce zero useful slot fill with semantically unrelated valid tools.", lambda _task_id: build_zero_fill_action()), + ("partially-filled-slots", "Plan should fill only part of the required workflow.", lambda _task_id: build_partial_fill_action()), + ], + summary_rows=summary_rows, + ) + + run_episode( + title="Episode D - Full Fill and Macro Failure Paths", + scenario_builders=[ + ("all-filled-slots", "Plan should fully satisfy the current task using atomic tools.", build_full_action_for_task), + ("wrong-macro-creation-attempt", "Macro proposal should be rejected because it contains an invalid tool in its steps.", lambda _task_id: build_wrong_macro_creation_action()), + ("wrong-macro-tool-call", "Validation should reject the plan because the macro name does not exist.", lambda _task_id: build_wrong_macro_name_action()), + ], + summary_rows=summary_rows, + ) + + banner("REWARD TEST SUMMARY") + logger.info("Summary rows:\n%s", safe_dump(summary_rows)) + logger.info("Reward test harness complete. Detailed logs written to %s", log_path) + + +if __name__ == "__main__": + main() diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000000000000000000000000000000000..f957aef7d0c87152ef07055ce4727cb12fb9c5a4 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2985 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.11'", +] + +[[package]] +name = "aiofile" +version = "3.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "caio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", size = 17943, upload-time = "2024-10-08T10:39:35.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", size = 19539, upload-time = "2024-10-08T10:39:32.955Z" }, +] + +[[package]] +name = "aiofiles" +version = "24.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload-time = "2024-06-24T11:02:01.529Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "audioop-lts" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/53/946db57842a50b2da2e0c1e34bd37f36f5aadba1a929a3971c5d7841dbca/audioop_lts-0.2.2.tar.gz", hash = "sha256:64d0c62d88e67b98a1a5e71987b7aa7b5bcffc7dcee65b635823dbdd0a8dbbd0", size = 30686, upload-time = "2025-08-05T16:43:17.409Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/d4/94d277ca941de5a507b07f0b592f199c22454eeaec8f008a286b3fbbacd6/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800", size = 46523, upload-time = "2025-08-05T16:42:20.836Z" }, + { url = "https://files.pythonhosted.org/packages/f8/5a/656d1c2da4b555920ce4177167bfeb8623d98765594af59702c8873f60ec/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303", size = 27455, upload-time = "2025-08-05T16:42:22.283Z" }, + { url = "https://files.pythonhosted.org/packages/1b/83/ea581e364ce7b0d41456fb79d6ee0ad482beda61faf0cab20cbd4c63a541/audioop_lts-0.2.2-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:9a13dc409f2564de15dd68be65b462ba0dde01b19663720c68c1140c782d1d75", size = 26997, upload-time = "2025-08-05T16:42:23.849Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3b/e8964210b5e216e5041593b7d33e97ee65967f17c282e8510d19c666dab4/audioop_lts-0.2.2-cp313-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51c916108c56aa6e426ce611946f901badac950ee2ddaf302b7ed35d9958970d", size = 85844, upload-time = "2025-08-05T16:42:25.208Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2e/0a1c52faf10d51def20531a59ce4c706cb7952323b11709e10de324d6493/audioop_lts-0.2.2-cp313-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47eba38322370347b1c47024defbd36374a211e8dd5b0dcbce7b34fdb6f8847b", size = 85056, upload-time = "2025-08-05T16:42:26.559Z" }, + { url = "https://files.pythonhosted.org/packages/75/e8/cd95eef479656cb75ab05dfece8c1f8c395d17a7c651d88f8e6e291a63ab/audioop_lts-0.2.2-cp313-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba7c3a7e5f23e215cb271516197030c32aef2e754252c4c70a50aaff7031a2c8", size = 93892, upload-time = "2025-08-05T16:42:27.902Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1e/a0c42570b74f83efa5cca34905b3eef03f7ab09fe5637015df538a7f3345/audioop_lts-0.2.2-cp313-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:def246fe9e180626731b26e89816e79aae2276f825420a07b4a647abaa84becc", size = 96660, upload-time = "2025-08-05T16:42:28.9Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/8a0ae607ca07dbb34027bac8db805498ee7bfecc05fd2c148cc1ed7646e7/audioop_lts-0.2.2-cp313-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e160bf9df356d841bb6c180eeeea1834085464626dc1b68fa4e1d59070affdc3", size = 79143, upload-time = "2025-08-05T16:42:29.929Z" }, + { url = "https://files.pythonhosted.org/packages/12/17/0d28c46179e7910bfb0bb62760ccb33edb5de973052cb2230b662c14ca2e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4b4cd51a57b698b2d06cb9993b7ac8dfe89a3b2878e96bc7948e9f19ff51dba6", size = 84313, upload-time = "2025-08-05T16:42:30.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/ba/bd5d3806641564f2024e97ca98ea8f8811d4e01d9b9f9831474bc9e14f9e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4a53aa7c16a60a6857e6b0b165261436396ef7293f8b5c9c828a3a203147ed4a", size = 93044, upload-time = "2025-08-05T16:42:31.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5e/435ce8d5642f1f7679540d1e73c1c42d933331c0976eb397d1717d7f01a3/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:3fc38008969796f0f689f1453722a0f463da1b8a6fbee11987830bfbb664f623", size = 78766, upload-time = "2025-08-05T16:42:33.302Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3b/b909e76b606cbfd53875693ec8c156e93e15a1366a012f0b7e4fb52d3c34/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:15ab25dd3e620790f40e9ead897f91e79c0d3ce65fe193c8ed6c26cffdd24be7", size = 87640, upload-time = "2025-08-05T16:42:34.854Z" }, + { url = "https://files.pythonhosted.org/packages/30/e7/8f1603b4572d79b775f2140d7952f200f5e6c62904585d08a01f0a70393a/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03f061a1915538fd96272bac9551841859dbb2e3bf73ebe4a23ef043766f5449", size = 86052, upload-time = "2025-08-05T16:42:35.839Z" }, + { url = "https://files.pythonhosted.org/packages/b5/96/c37846df657ccdda62ba1ae2b6534fa90e2e1b1742ca8dcf8ebd38c53801/audioop_lts-0.2.2-cp313-abi3-win32.whl", hash = "sha256:3bcddaaf6cc5935a300a8387c99f7a7fbbe212a11568ec6cf6e4bc458c048636", size = 26185, upload-time = "2025-08-05T16:42:37.04Z" }, + { url = "https://files.pythonhosted.org/packages/34/a5/9d78fdb5b844a83da8a71226c7bdae7cc638861085fff7a1d707cb4823fa/audioop_lts-0.2.2-cp313-abi3-win_amd64.whl", hash = "sha256:a2c2a947fae7d1062ef08c4e369e0ba2086049a5e598fda41122535557012e9e", size = 30503, upload-time = "2025-08-05T16:42:38.427Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/20d8fde083123e90c61b51afb547bb0ea7e77bab50d98c0ab243d02a0e43/audioop_lts-0.2.2-cp313-abi3-win_arm64.whl", hash = "sha256:5f93a5db13927a37d2d09637ccca4b2b6b48c19cd9eda7b17a2e9f77edee6a6f", size = 24173, upload-time = "2025-08-05T16:42:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/58/a7/0a764f77b5c4ac58dc13c01a580f5d32ae8c74c92020b961556a43e26d02/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73f80bf4cd5d2ca7814da30a120de1f9408ee0619cc75da87d0641273d202a09", size = 47096, upload-time = "2025-08-05T16:42:40.684Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/ebebedde1a18848b085ad0fa54b66ceb95f1f94a3fc04f1cd1b5ccb0ed42/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:106753a83a25ee4d6f473f2be6b0966fc1c9af7e0017192f5531a3e7463dce58", size = 27748, upload-time = "2025-08-05T16:42:41.992Z" }, + { url = "https://files.pythonhosted.org/packages/cb/6e/11ca8c21af79f15dbb1c7f8017952ee8c810c438ce4e2b25638dfef2b02c/audioop_lts-0.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fbdd522624141e40948ab3e8cdae6e04c748d78710e9f0f8d4dae2750831de19", size = 27329, upload-time = "2025-08-05T16:42:42.987Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/0022f93d56d85eec5da6b9da6a958a1ef09e80c39f2cc0a590c6af81dcbb/audioop_lts-0.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:143fad0311e8209ece30a8dbddab3b65ab419cbe8c0dde6e8828da25999be911", size = 92407, upload-time = "2025-08-05T16:42:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/87/1d/48a889855e67be8718adbc7a01f3c01d5743c325453a5e81cf3717664aad/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbbc74ec68a0fd08cfec1f4b5e8cca3d3cd7de5501b01c4b5d209995033cde9", size = 91811, upload-time = "2025-08-05T16:42:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/98/a6/94b7213190e8077547ffae75e13ed05edc488653c85aa5c41472c297d295/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cfcac6aa6f42397471e4943e0feb2244549db5c5d01efcd02725b96af417f3fe", size = 100470, upload-time = "2025-08-05T16:42:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/78450d7cb921ede0cfc33426d3a8023a3bda755883c95c868ee36db8d48d/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:752d76472d9804ac60f0078c79cdae8b956f293177acd2316cd1e15149aee132", size = 103878, upload-time = "2025-08-05T16:42:47.576Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e2/cd5439aad4f3e34ae1ee852025dc6aa8f67a82b97641e390bf7bd9891d3e/audioop_lts-0.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:83c381767e2cc10e93e40281a04852facc4cd9334550e0f392f72d1c0a9c5753", size = 84867, upload-time = "2025-08-05T16:42:49.003Z" }, + { url = "https://files.pythonhosted.org/packages/68/4b/9d853e9076c43ebba0d411e8d2aa19061083349ac695a7d082540bad64d0/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c0022283e9556e0f3643b7c3c03f05063ca72b3063291834cca43234f20c60bb", size = 90001, upload-time = "2025-08-05T16:42:50.038Z" }, + { url = "https://files.pythonhosted.org/packages/58/26/4bae7f9d2f116ed5593989d0e521d679b0d583973d203384679323d8fa85/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a2d4f1513d63c795e82948e1305f31a6d530626e5f9f2605408b300ae6095093", size = 99046, upload-time = "2025-08-05T16:42:51.111Z" }, + { url = "https://files.pythonhosted.org/packages/b2/67/a9f4fb3e250dda9e9046f8866e9fa7d52664f8985e445c6b4ad6dfb55641/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c9c8e68d8b4a56fda8c025e538e639f8c5953f5073886b596c93ec9b620055e7", size = 84788, upload-time = "2025-08-05T16:42:52.198Z" }, + { url = "https://files.pythonhosted.org/packages/70/f7/3de86562db0121956148bcb0fe5b506615e3bcf6e63c4357a612b910765a/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:96f19de485a2925314f5020e85911fb447ff5fbef56e8c7c6927851b95533a1c", size = 94472, upload-time = "2025-08-05T16:42:53.59Z" }, + { url = "https://files.pythonhosted.org/packages/f1/32/fd772bf9078ae1001207d2df1eef3da05bea611a87dd0e8217989b2848fa/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e541c3ef484852ef36545f66209444c48b28661e864ccadb29daddb6a4b8e5f5", size = 92279, upload-time = "2025-08-05T16:42:54.632Z" }, + { url = "https://files.pythonhosted.org/packages/4f/41/affea7181592ab0ab560044632571a38edaf9130b84928177823fbf3176a/audioop_lts-0.2.2-cp313-cp313t-win32.whl", hash = "sha256:d5e73fa573e273e4f2e5ff96f9043858a5e9311e94ffefd88a3186a910c70917", size = 26568, upload-time = "2025-08-05T16:42:55.627Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/0372842877016641db8fc54d5c88596b542eec2f8f6c20a36fb6612bf9ee/audioop_lts-0.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9191d68659eda01e448188f60364c7763a7ca6653ed3f87ebb165822153a8547", size = 30942, upload-time = "2025-08-05T16:42:56.674Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/baf2b9cc7e96c179bb4a54f30fcd83e6ecb340031bde68f486403f943768/audioop_lts-0.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c174e322bb5783c099aaf87faeb240c8d210686b04bd61dfd05a8e5a83d88969", size = 24603, upload-time = "2025-08-05T16:42:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/5c/73/413b5a2804091e2c7d5def1d618e4837f1cb82464e230f827226278556b7/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f9ee9b52f5f857fbaf9d605a360884f034c92c1c23021fb90b2e39b8e64bede6", size = 47104, upload-time = "2025-08-05T16:42:58.518Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/daa3308dc6593944410c2c68306a5e217f5c05b70a12e70228e7dd42dc5c/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:49ee1a41738a23e98d98b937a0638357a2477bc99e61b0f768a8f654f45d9b7a", size = 27754, upload-time = "2025-08-05T16:43:00.132Z" }, + { url = "https://files.pythonhosted.org/packages/4e/86/c2e0f627168fcf61781a8f72cab06b228fe1da4b9fa4ab39cfb791b5836b/audioop_lts-0.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5b00be98ccd0fc123dcfad31d50030d25fcf31488cde9e61692029cd7394733b", size = 27332, upload-time = "2025-08-05T16:43:01.666Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bd/35dce665255434f54e5307de39e31912a6f902d4572da7c37582809de14f/audioop_lts-0.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d2e0f9f7a69403e388894d4ca5ada5c47230716a03f2847cfc7bd1ecb589d6", size = 92396, upload-time = "2025-08-05T16:43:02.991Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d2/deeb9f51def1437b3afa35aeb729d577c04bcd89394cb56f9239a9f50b6f/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9b0b8a03ef474f56d1a842af1a2e01398b8f7654009823c6d9e0ecff4d5cfbf", size = 91811, upload-time = "2025-08-05T16:43:04.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/3b/09f8b35b227cee28cc8231e296a82759ed80c1a08e349811d69773c48426/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b267b70747d82125f1a021506565bdc5609a2b24bcb4773c16d79d2bb260bbd", size = 100483, upload-time = "2025-08-05T16:43:05.085Z" }, + { url = "https://files.pythonhosted.org/packages/0b/15/05b48a935cf3b130c248bfdbdea71ce6437f5394ee8533e0edd7cfd93d5e/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0337d658f9b81f4cd0fdb1f47635070cc084871a3d4646d9de74fdf4e7c3d24a", size = 103885, upload-time = "2025-08-05T16:43:06.197Z" }, + { url = "https://files.pythonhosted.org/packages/83/80/186b7fce6d35b68d3d739f228dc31d60b3412105854edb975aa155a58339/audioop_lts-0.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:167d3b62586faef8b6b2275c3218796b12621a60e43f7e9d5845d627b9c9b80e", size = 84899, upload-time = "2025-08-05T16:43:07.291Z" }, + { url = "https://files.pythonhosted.org/packages/49/89/c78cc5ac6cb5828f17514fb12966e299c850bc885e80f8ad94e38d450886/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0d9385e96f9f6da847f4d571ce3cb15b5091140edf3db97276872647ce37efd7", size = 89998, upload-time = "2025-08-05T16:43:08.335Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/6401888d0c010e586c2ca50fce4c903d70a6bb55928b16cfbdfd957a13da/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:48159d96962674eccdca9a3df280e864e8ac75e40a577cc97c5c42667ffabfc5", size = 99046, upload-time = "2025-08-05T16:43:09.367Z" }, + { url = "https://files.pythonhosted.org/packages/de/f8/c874ca9bb447dae0e2ef2e231f6c4c2b0c39e31ae684d2420b0f9e97ee68/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fefe5868cd082db1186f2837d64cfbfa78b548ea0d0543e9b28935ccce81ce9", size = 84843, upload-time = "2025-08-05T16:43:10.749Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c0/0323e66f3daebc13fd46b36b30c3be47e3fc4257eae44f1e77eb828c703f/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:58cf54380c3884fb49fdd37dfb7a772632b6701d28edd3e2904743c5e1773602", size = 94490, upload-time = "2025-08-05T16:43:12.131Z" }, + { url = "https://files.pythonhosted.org/packages/98/6b/acc7734ac02d95ab791c10c3f17ffa3584ccb9ac5c18fd771c638ed6d1f5/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:088327f00488cdeed296edd9215ca159f3a5a5034741465789cad403fcf4bec0", size = 92297, upload-time = "2025-08-05T16:43:13.139Z" }, + { url = "https://files.pythonhosted.org/packages/13/c3/c3dc3f564ce6877ecd2a05f8d751b9b27a8c320c2533a98b0c86349778d0/audioop_lts-0.2.2-cp314-cp314t-win32.whl", hash = "sha256:068aa17a38b4e0e7de771c62c60bbca2455924b67a8814f3b0dee92b5820c0b3", size = 27331, upload-time = "2025-08-05T16:43:14.19Z" }, + { url = "https://files.pythonhosted.org/packages/72/bb/b4608537e9ffcb86449091939d52d24a055216a36a8bf66b936af8c3e7ac/audioop_lts-0.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a5bf613e96f49712073de86f20dbdd4014ca18efd4d34ed18c75bd808337851b", size = 31697, upload-time = "2025-08-05T16:43:15.193Z" }, + { url = "https://files.pythonhosted.org/packages/f6/22/91616fe707a5c5510de2cac9b046a30defe7007ba8a0c04f9c08f27df312/audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd", size = 25206, upload-time = "2025-08-05T16:43:16.444Z" }, +] + +[[package]] +name = "authlib" +version = "1.6.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/98/00d3dd826d46959ad8e32af2dbb2398868fd9fd0683c26e56d0789bd0e68/authlib-1.6.9.tar.gz", hash = "sha256:d8f2421e7e5980cc1ddb4e32d3f5fa659cfaf60d8eaf3281ebed192e4ab74f04", size = 165134, upload-time = "2026-03-02T07:44:01.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/23/b65f568ed0c22f1efacb744d2db1a33c8068f384b8c9b482b52ebdbc3ef6/authlib-1.6.9-py2.py3-none-any.whl", hash = "sha256:f08b4c14e08f0861dc18a32357b33fbcfd2ea86cfe3fe149484b4d764c4a0ac3", size = 244197, upload-time = "2026-03-02T07:44:00.307Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "beartype" +version = "0.22.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", size = 1608866, upload-time = "2025-12-13T06:50:30.72Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", size = 1333658, upload-time = "2025-12-13T06:50:28.266Z" }, +] + +[[package]] +name = "brotli" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/10/a090475284fc4a71aed40a96f32e44a7fe5bda39687353dd977720b211b6/brotli-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b90b767916ac44e93a8e28ce6adf8d551e43affb512f2377c732d486ac6514e", size = 863089, upload-time = "2025-11-05T18:38:01.181Z" }, + { url = "https://files.pythonhosted.org/packages/03/41/17416630e46c07ac21e378c3464815dd2e120b441e641bc516ac32cc51d2/brotli-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6be67c19e0b0c56365c6a76e393b932fb0e78b3b56b711d180dd7013cb1fd984", size = 445442, upload-time = "2025-11-05T18:38:02.434Z" }, + { url = "https://files.pythonhosted.org/packages/24/31/90cc06584deb5d4fcafc0985e37741fc6b9717926a78674bbb3ce018957e/brotli-1.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bbd5b5ccd157ae7913750476d48099aaf507a79841c0d04a9db4415b14842de", size = 1532658, upload-time = "2025-11-05T18:38:03.588Z" }, + { url = "https://files.pythonhosted.org/packages/62/17/33bf0c83bcbc96756dfd712201d87342732fad70bb3472c27e833a44a4f9/brotli-1.2.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f3c908bcc404c90c77d5a073e55271a0a498f4e0756e48127c35d91cf155947", size = 1631241, upload-time = "2025-11-05T18:38:04.582Z" }, + { url = "https://files.pythonhosted.org/packages/48/10/f47854a1917b62efe29bc98ac18e5d4f71df03f629184575b862ef2e743b/brotli-1.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b557b29782a643420e08d75aea889462a4a8796e9a6cf5621ab05a3f7da8ef2", size = 1424307, upload-time = "2025-11-05T18:38:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b7/f88eb461719259c17483484ea8456925ee057897f8e64487d76e24e5e38d/brotli-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81da1b229b1889f25adadc929aeb9dbc4e922bd18561b65b08dd9343cfccca84", size = 1488208, upload-time = "2025-11-05T18:38:06.613Z" }, + { url = "https://files.pythonhosted.org/packages/26/59/41bbcb983a0c48b0b8004203e74706c6b6e99a04f3c7ca6f4f41f364db50/brotli-1.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff09cd8c5eec3b9d02d2408db41be150d8891c5566addce57513bf546e3d6c6d", size = 1597574, upload-time = "2025-11-05T18:38:07.838Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e6/8c89c3bdabbe802febb4c5c6ca224a395e97913b5df0dff11b54f23c1788/brotli-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a1778532b978d2536e79c05dac2d8cd857f6c55cd0c95ace5b03740824e0e2f1", size = 1492109, upload-time = "2025-11-05T18:38:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/4b19d4310b2dbd545c0c33f176b0528fa68c3cd0754e34b2f2bcf56548ae/brotli-1.2.0-cp310-cp310-win32.whl", hash = "sha256:b232029d100d393ae3c603c8ffd7e3fe6f798c5e28ddca5feabb8e8fdb732997", size = 334461, upload-time = "2025-11-05T18:38:10.729Z" }, + { url = "https://files.pythonhosted.org/packages/ac/39/70981d9f47705e3c2b95c0847dfa3e7a37aa3b7c6030aedc4873081ed005/brotli-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef87b8ab2704da227e83a246356a2b179ef826f550f794b2c52cddb4efbd0196", size = 369035, upload-time = "2025-11-05T18:38:11.827Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110, upload-time = "2025-11-05T18:38:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438, upload-time = "2025-11-05T18:38:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420, upload-time = "2025-11-05T18:38:15.111Z" }, + { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619, upload-time = "2025-11-05T18:38:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014, upload-time = "2025-11-05T18:38:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661, upload-time = "2025-11-05T18:38:18.41Z" }, + { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150, upload-time = "2025-11-05T18:38:19.792Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505, upload-time = "2025-11-05T18:38:20.913Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/12904bbd36afeef53d45a84881a4810ae8810ad7e328a971ebbfd760a0b3/brotli-1.2.0-cp311-cp311-win32.whl", hash = "sha256:aa47441fa3026543513139cb8926a92a8e305ee9c71a6209ef7a97d91640ea03", size = 334451, upload-time = "2025-11-05T18:38:21.94Z" }, + { url = "https://files.pythonhosted.org/packages/02/8b/ecb5761b989629a4758c394b9301607a5880de61ee2ee5fe104b87149ebc/brotli-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:022426c9e99fd65d9475dce5c195526f04bb8be8907607e27e747893f6ee3e24", size = 369035, upload-time = "2025-11-05T18:38:22.941Z" }, + { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543, upload-time = "2025-11-05T18:38:24.183Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288, upload-time = "2025-11-05T18:38:25.139Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071, upload-time = "2025-11-05T18:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913, upload-time = "2025-11-05T18:38:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762, upload-time = "2025-11-05T18:38:28.295Z" }, + { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494, upload-time = "2025-11-05T18:38:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302, upload-time = "2025-11-05T18:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913, upload-time = "2025-11-05T18:38:31.618Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/4d00cb9bd76a6357a66fcd54b4b6d70288385584063f4b07884c1e7286ac/brotli-1.2.0-cp312-cp312-win32.whl", hash = "sha256:e99befa0b48f3cd293dafeacdd0d191804d105d279e0b387a32054c1180f3161", size = 334362, upload-time = "2025-11-05T18:38:32.939Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4e/bc1dcac9498859d5e353c9b153627a3752868a9d5f05ce8dedd81a2354ab/brotli-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b35c13ce241abdd44cb8ca70683f20c0c079728a36a996297adb5334adfc1c44", size = 369115, upload-time = "2025-11-05T18:38:33.765Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, + { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, + { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, + { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, + { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368, upload-time = "2025-11-05T18:38:43.345Z" }, + { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116, upload-time = "2025-11-05T18:38:44.609Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080, upload-time = "2025-11-05T18:38:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453, upload-time = "2025-11-05T18:38:46.433Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168, upload-time = "2025-11-05T18:38:47.371Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098, upload-time = "2025-11-05T18:38:48.385Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861, upload-time = "2025-11-05T18:38:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594, upload-time = "2025-11-05T18:38:50.655Z" }, + { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455, upload-time = "2025-11-05T18:38:51.624Z" }, + { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/64/6a/0c78d8f3a582859236482fd9fa86a65a60328a00983006bcf6d83b7b2253/brotli-1.2.0-cp314-cp314-win32.whl", hash = "sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d", size = 339280, upload-time = "2025-11-05T18:38:54.02Z" }, + { url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" }, +] + +[[package]] +name = "cachetools" +version = "7.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/dd/57fe3fdb6e65b25a5987fd2cdc7e22db0aef508b91634d2e57d22928d41b/cachetools-7.0.5.tar.gz", hash = "sha256:0cd042c24377200c1dcd225f8b7b12b0ca53cc2c961b43757e774ebe190fd990", size = 37367, upload-time = "2026-03-09T20:51:29.451Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/f3/39cf3367b8107baa44f861dc802cbf16263c945b62d8265d36034fc07bea/cachetools-7.0.5-py3-none-any.whl", hash = "sha256:46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114", size = 13918, upload-time = "2026-03-09T20:51:27.33Z" }, +] + +[[package]] +name = "caio" +version = "0.9.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", size = 26781, upload-time = "2025-12-26T15:21:36.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/80/ea4ead0c5d52a9828692e7df20f0eafe8d26e671ce4883a0a146bb91049e/caio-0.9.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ca6c8ecda611478b6016cb94d23fd3eb7124852b985bdec7ecaad9f3116b9619", size = 36836, upload-time = "2025-12-26T15:22:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/17/b9/36715c97c873649d1029001578f901b50250916295e3dddf20c865438865/caio-0.9.25-cp310-cp310-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db9b5681e4af8176159f0d6598e73b2279bb661e718c7ac23342c550bd78c241", size = 79695, upload-time = "2025-12-26T15:22:18.818Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ab/07080ecb1adb55a02cbd8ec0126aa8e43af343ffabb6a71125b42670e9a1/caio-0.9.25-cp310-cp310-manylinux_2_34_aarch64.whl", hash = "sha256:bf61d7d0c4fd10ffdd98ca47f7e8db4d7408e74649ffaf4bef40b029ada3c21b", size = 79457, upload-time = "2026-03-04T22:08:16.024Z" }, + { url = "https://files.pythonhosted.org/packages/88/95/dd55757bb671eb4c376e006c04e83beb413486821f517792ea603ef216e9/caio-0.9.25-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:ab52e5b643f8bbd64a0605d9412796cd3464cb8ca88593b13e95a0f0b10508ae", size = 77705, upload-time = "2026-03-04T22:08:17.202Z" }, + { url = "https://files.pythonhosted.org/packages/ec/90/543f556fcfcfa270713eef906b6352ab048e1e557afec12925c991dc93c2/caio-0.9.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6956d9e4a27021c8bd6c9677f3a59eb1d820cc32d0343cea7961a03b1371965", size = 36839, upload-time = "2025-12-26T15:21:40.267Z" }, + { url = "https://files.pythonhosted.org/packages/51/3b/36f3e8ec38dafe8de4831decd2e44c69303d2a3892d16ceda42afed44e1b/caio-0.9.25-cp311-cp311-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bf84bfa039f25ad91f4f52944452a5f6f405e8afab4d445450978cd6241d1478", size = 80255, upload-time = "2025-12-26T15:22:20.271Z" }, + { url = "https://files.pythonhosted.org/packages/df/ce/65e64867d928e6aff1b4f0e12dba0ef6d5bf412c240dc1df9d421ac10573/caio-0.9.25-cp311-cp311-manylinux_2_34_aarch64.whl", hash = "sha256:ae3d62587332bce600f861a8de6256b1014d6485cfd25d68c15caf1611dd1f7c", size = 80052, upload-time = "2026-03-04T22:08:20.402Z" }, + { url = "https://files.pythonhosted.org/packages/46/90/e278863c47e14ec58309aa2e38a45882fbe67b4cc29ec9bc8f65852d3e45/caio-0.9.25-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:fc220b8533dcf0f238a6b1a4a937f92024c71e7b10b5a2dfc1c73604a25709bc", size = 78273, upload-time = "2026-03-04T22:08:21.368Z" }, + { url = "https://files.pythonhosted.org/packages/d3/25/79c98ebe12df31548ba4eaf44db11b7cad6b3e7b4203718335620939083c/caio-0.9.25-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044", size = 36983, upload-time = "2025-12-26T15:21:36.075Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2b/21288691f16d479945968a0a4f2856818c1c5be56881d51d4dac9b255d26/caio-0.9.25-cp312-cp312-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:97084e4e30dfa598449d874c4d8e0c8d5ea17d2f752ef5e48e150ff9d240cd64", size = 82012, upload-time = "2025-12-26T15:22:20.983Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/8a1b580875303500a9c12b9e0af58cb82e47f5bcf888c2457742a138273c/caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:4fa69eba47e0f041b9d4f336e2ad40740681c43e686b18b191b6c5f4c5544bfb", size = 81502, upload-time = "2026-03-04T22:08:22.381Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/0fe770b8ffc8362c48134d1592d653a81a3d8748d764bec33864db36319d/caio-0.9.25-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:6bebf6f079f1341d19f7386db9b8b1f07e8cc15ae13bfdaff573371ba0575d69", size = 80200, upload-time = "2026-03-04T22:08:23.382Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", size = 36979, upload-time = "2025-12-26T15:21:35.484Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", size = 81900, upload-time = "2025-12-26T15:22:21.919Z" }, + { url = "https://files.pythonhosted.org/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", size = 81523, upload-time = "2026-03-04T22:08:25.187Z" }, + { url = "https://files.pythonhosted.org/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", size = 80243, upload-time = "2026-03-04T22:08:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/69/ca/a08fdc7efdcc24e6a6131a93c85be1f204d41c58f474c42b0670af8c016b/caio-0.9.25-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fab6078b9348e883c80a5e14b382e6ad6aabbc4429ca034e76e730cf464269db", size = 36978, upload-time = "2025-12-26T15:21:41.055Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6c/d4d24f65e690213c097174d26eda6831f45f4734d9d036d81790a27e7b78/caio-0.9.25-cp314-cp314-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44a6b58e52d488c75cfaa5ecaa404b2b41cc965e6c417e03251e868ecd5b6d77", size = 81832, upload-time = "2025-12-26T15:22:22.757Z" }, + { url = "https://files.pythonhosted.org/packages/87/a4/e534cf7d2d0e8d880e25dd61e8d921ffcfe15bd696734589826f5a2df727/caio-0.9.25-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:628a630eb7fb22381dd8e3c8ab7f59e854b9c806639811fc3f4310c6bd711d79", size = 81565, upload-time = "2026-03-04T22:08:27.483Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ed/bf81aeac1d290017e5e5ac3e880fd56ee15e50a6d0353986799d1bc5cfd5/caio-0.9.25-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:0ba16aa605ccb174665357fc729cf500679c2d94d5f1458a6f0d5ca48f2060a7", size = 80071, upload-time = "2026-03-04T22:08:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", size = 19087, upload-time = "2025-12-26T15:22:00.221Z" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" }, + { url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" }, + { url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" }, + { url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" }, + { url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" }, + { url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" }, + { url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" }, + { url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" }, + { url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" }, + { url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" }, + { url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" }, + { url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, + { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, + { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, + { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, + { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, + { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, + { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, + { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, + { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, + { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, + { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, + { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, + { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, + { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cryptography" +version = "46.0.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a4/ba/04b1bd4218cbc58dc90ce967106d51582371b898690f3ae0402876cc4f34/cryptography-46.0.6.tar.gz", hash = "sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759", size = 750542, upload-time = "2026-03-25T23:34:53.396Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/23/9285e15e3bc57325b0a72e592921983a701efc1ee8f91c06c5f0235d86d9/cryptography-46.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8", size = 7176401, upload-time = "2026-03-25T23:33:22.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/e61f8f13950ab6195b31913b42d39f0f9afc7d93f76710f299b5ec286ae6/cryptography-46.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30", size = 4275275, upload-time = "2026-03-25T23:33:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/19/69/732a736d12c2631e140be2348b4ad3d226302df63ef64d30dfdb8db7ad1c/cryptography-46.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a", size = 4425320, upload-time = "2026-03-25T23:33:25.703Z" }, + { url = "https://files.pythonhosted.org/packages/d4/12/123be7292674abf76b21ac1fc0e1af50661f0e5b8f0ec8285faac18eb99e/cryptography-46.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175", size = 4278082, upload-time = "2026-03-25T23:33:27.423Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ba/d5e27f8d68c24951b0a484924a84c7cdaed7502bac9f18601cd357f8b1d2/cryptography-46.0.6-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463", size = 4926514, upload-time = "2026-03-25T23:33:29.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/71/1ea5a7352ae516d5512d17babe7e1b87d9db5150b21f794b1377eac1edc0/cryptography-46.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97", size = 4457766, upload-time = "2026-03-25T23:33:30.834Z" }, + { url = "https://files.pythonhosted.org/packages/01/59/562be1e653accee4fdad92c7a2e88fced26b3fdfce144047519bbebc299e/cryptography-46.0.6-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c", size = 3986535, upload-time = "2026-03-25T23:33:33.02Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8b/b1ebfeb788bf4624d36e45ed2662b8bd43a05ff62157093c1539c1288a18/cryptography-46.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507", size = 4277618, upload-time = "2026-03-25T23:33:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/dd/52/a005f8eabdb28df57c20f84c44d397a755782d6ff6d455f05baa2785bd91/cryptography-46.0.6-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19", size = 4890802, upload-time = "2026-03-25T23:33:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4d/8e7d7245c79c617d08724e2efa397737715ca0ec830ecb3c91e547302555/cryptography-46.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738", size = 4457425, upload-time = "2026-03-25T23:33:38.904Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5c/f6c3596a1430cec6f949085f0e1a970638d76f81c3ea56d93d564d04c340/cryptography-46.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c", size = 4405530, upload-time = "2026-03-25T23:33:40.842Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c9/9f9cea13ee2dbde070424e0c4f621c091a91ffcc504ffea5e74f0e1daeff/cryptography-46.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f", size = 4667896, upload-time = "2026-03-25T23:33:42.781Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b5/1895bc0821226f129bc74d00eccfc6a5969e2028f8617c09790bf89c185e/cryptography-46.0.6-cp311-abi3-win32.whl", hash = "sha256:bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2", size = 3026348, upload-time = "2026-03-25T23:33:45.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f8/c9bcbf0d3e6ad288b9d9aa0b1dee04b063d19e8c4f871855a03ab3a297ab/cryptography-46.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124", size = 3483896, upload-time = "2026-03-25T23:33:46.649Z" }, + { url = "https://files.pythonhosted.org/packages/01/41/3a578f7fd5c70611c0aacba52cd13cb364a5dee895a5c1d467208a9380b0/cryptography-46.0.6-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275", size = 7117147, upload-time = "2026-03-25T23:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/887f35a6fca9dde90cad08e0de0c89263a8e59b2d2ff904fd9fcd8025b6f/cryptography-46.0.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4", size = 4266221, upload-time = "2026-03-25T23:33:49.874Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a8/0a90c4f0b0871e0e3d1ed126aed101328a8a57fd9fd17f00fb67e82a51ca/cryptography-46.0.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b", size = 4408952, upload-time = "2026-03-25T23:33:52.128Z" }, + { url = "https://files.pythonhosted.org/packages/16/0b/b239701eb946523e4e9f329336e4ff32b1247e109cbab32d1a7b61da8ed7/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707", size = 4270141, upload-time = "2026-03-25T23:33:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/976acdd4f0f30df7b25605f4b9d3d89295351665c2091d18224f7ad5cdbf/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361", size = 4904178, upload-time = "2026-03-25T23:33:55.725Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1b/bf0e01a88efd0e59679b69f42d4afd5bced8700bb5e80617b2d63a3741af/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b", size = 4441812, upload-time = "2026-03-25T23:33:57.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8b/11df86de2ea389c65aa1806f331cae145f2ed18011f30234cc10ca253de8/cryptography-46.0.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca", size = 3963923, upload-time = "2026-03-25T23:33:59.361Z" }, + { url = "https://files.pythonhosted.org/packages/91/e0/207fb177c3a9ef6a8108f234208c3e9e76a6aa8cf20d51932916bd43bda0/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013", size = 4269695, upload-time = "2026-03-25T23:34:00.909Z" }, + { url = "https://files.pythonhosted.org/packages/21/5e/19f3260ed1e95bced52ace7501fabcd266df67077eeb382b79c81729d2d3/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4", size = 4869785, upload-time = "2026-03-25T23:34:02.796Z" }, + { url = "https://files.pythonhosted.org/packages/10/38/cd7864d79aa1d92ef6f1a584281433419b955ad5a5ba8d1eb6c872165bcb/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a", size = 4441404, upload-time = "2026-03-25T23:34:04.35Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/4fe7a8d25fed74419f91835cf5829ade6408fd1963c9eae9c4bce390ecbb/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d", size = 4397549, upload-time = "2026-03-25T23:34:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a0/7d738944eac6513cd60a8da98b65951f4a3b279b93479a7e8926d9cd730b/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736", size = 4651874, upload-time = "2026-03-25T23:34:07.916Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f1/c2326781ca05208845efca38bf714f76939ae446cd492d7613808badedf1/cryptography-46.0.6-cp314-cp314t-win32.whl", hash = "sha256:97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed", size = 3001511, upload-time = "2026-03-25T23:34:09.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/57/fe4a23eb549ac9d903bd4698ffda13383808ef0876cc912bcb2838799ece/cryptography-46.0.6-cp314-cp314t-win_amd64.whl", hash = "sha256:c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4", size = 3471692, upload-time = "2026-03-25T23:34:11.613Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cc/f330e982852403da79008552de9906804568ae9230da8432f7496ce02b71/cryptography-46.0.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a", size = 7162776, upload-time = "2026-03-25T23:34:13.308Z" }, + { url = "https://files.pythonhosted.org/packages/49/b3/dc27efd8dcc4bff583b3f01d4a3943cd8b5821777a58b3a6a5f054d61b79/cryptography-46.0.6-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8", size = 4270529, upload-time = "2026-03-25T23:34:15.019Z" }, + { url = "https://files.pythonhosted.org/packages/e6/05/e8d0e6eb4f0d83365b3cb0e00eb3c484f7348db0266652ccd84632a3d58d/cryptography-46.0.6-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77", size = 4414827, upload-time = "2026-03-25T23:34:16.604Z" }, + { url = "https://files.pythonhosted.org/packages/2f/97/daba0f5d2dc6d855e2dcb70733c812558a7977a55dd4a6722756628c44d1/cryptography-46.0.6-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290", size = 4271265, upload-time = "2026-03-25T23:34:18.586Z" }, + { url = "https://files.pythonhosted.org/packages/89/06/fe1fce39a37ac452e58d04b43b0855261dac320a2ebf8f5260dd55b201a9/cryptography-46.0.6-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410", size = 4916800, upload-time = "2026-03-25T23:34:20.561Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8a/b14f3101fe9c3592603339eb5d94046c3ce5f7fc76d6512a2d40efd9724e/cryptography-46.0.6-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d", size = 4448771, upload-time = "2026-03-25T23:34:22.406Z" }, + { url = "https://files.pythonhosted.org/packages/01/b3/0796998056a66d1973fd52ee89dc1bb3b6581960a91ad4ac705f182d398f/cryptography-46.0.6-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70", size = 3978333, upload-time = "2026-03-25T23:34:24.281Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3d/db200af5a4ffd08918cd55c08399dc6c9c50b0bc72c00a3246e099d3a849/cryptography-46.0.6-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d", size = 4271069, upload-time = "2026-03-25T23:34:25.895Z" }, + { url = "https://files.pythonhosted.org/packages/d7/18/61acfd5b414309d74ee838be321c636fe71815436f53c9f0334bf19064fa/cryptography-46.0.6-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa", size = 4878358, upload-time = "2026-03-25T23:34:27.67Z" }, + { url = "https://files.pythonhosted.org/packages/8b/65/5bf43286d566f8171917cae23ac6add941654ccf085d739195a4eacf1674/cryptography-46.0.6-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58", size = 4448061, upload-time = "2026-03-25T23:34:29.375Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/7e49c0fa7205cf3597e525d156a6bce5b5c9de1fd7e8cb01120e459f205a/cryptography-46.0.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb", size = 4399103, upload-time = "2026-03-25T23:34:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/44/46/466269e833f1c4718d6cd496ffe20c56c9c8d013486ff66b4f69c302a68d/cryptography-46.0.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72", size = 4659255, upload-time = "2026-03-25T23:34:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/0a/09/ddc5f630cc32287d2c953fc5d32705e63ec73e37308e5120955316f53827/cryptography-46.0.6-cp38-abi3-win32.whl", hash = "sha256:7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c", size = 3010660, upload-time = "2026-03-25T23:34:35.418Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/ca4893968aeb2709aacfb57a30dec6fa2ab25b10fa9f064b8882ce33f599/cryptography-46.0.6-cp38-abi3-win_amd64.whl", hash = "sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f", size = 3471160, upload-time = "2026-03-25T23:34:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/2e/84/7ccff00ced5bac74b775ce0beb7d1be4e8637536b522b5df9b73ada42da2/cryptography-46.0.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead", size = 3475444, upload-time = "2026-03-25T23:34:38.944Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/4c926f50df7749f000f20eede0c896769509895e2648db5da0ed55db711d/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8", size = 4218227, upload-time = "2026-03-25T23:34:40.871Z" }, + { url = "https://files.pythonhosted.org/packages/c6/65/707be3ffbd5f786028665c3223e86e11c4cda86023adbc56bd72b1b6bab5/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0", size = 4381399, upload-time = "2026-03-25T23:34:42.609Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6d/73557ed0ef7d73d04d9aba745d2c8e95218213687ee5e76b7d236a5030fc/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b", size = 4217595, upload-time = "2026-03-25T23:34:44.205Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c5/e1594c4eec66a567c3ac4400008108a415808be2ce13dcb9a9045c92f1a0/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a", size = 4380912, upload-time = "2026-03-25T23:34:46.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/89/843b53614b47f97fe1abc13f9a86efa5ec9e275292c457af1d4a60dc80e0/cryptography-46.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6728c49e3b2c180ef26f8e9f0a883a2c585638db64cf265b49c9ba10652d430e", size = 3409955, upload-time = "2026-03-25T23:34:48.465Z" }, +] + +[[package]] +name = "cyclopts" +version = "4.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "rich-rst" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/c4/2ce2ca1451487dc7d59f09334c3fa1182c46cfcf0a2d5f19f9b26d53ac74/cyclopts-4.10.1.tar.gz", hash = "sha256:ad4e4bb90576412d32276b14a76f55d43353753d16217f2c3cd5bdceba7f15a0", size = 166623, upload-time = "2026-03-23T14:43:01.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/2261922126b2e50c601fe22d7ff5194e0a4d50e654836260c0665e24d862/cyclopts-4.10.1-py3-none-any.whl", hash = "sha256:35f37257139380a386d9fe4475e1e7c87ca7795765ef4f31abba579fcfcb6ecd", size = 204331, upload-time = "2026-03-23T14:43:02.625Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "fastapi" +version = "0.135.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/73/5903c4b13beae98618d64eb9870c3fac4f605523dd0312ca5c80dadbd5b9/fastapi-0.135.2.tar.gz", hash = "sha256:88a832095359755527b7f63bb4c6bc9edb8329a026189eed83d6c1afcf419d56", size = 395833, upload-time = "2026-03-23T14:12:41.697Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/ea/18f6d0457f9efb2fc6fa594857f92810cadb03024975726db6546b3d6fcf/fastapi-0.135.2-py3-none-any.whl", hash = "sha256:0af0447d541867e8db2a6a25c23a8c4bd80e2394ac5529bd87501bbb9e240ca5", size = 117407, upload-time = "2026-03-23T14:12:43.284Z" }, +] + +[[package]] +name = "fastmcp" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "authlib" }, + { name = "cyclopts" }, + { name = "exceptiongroup" }, + { name = "httpx" }, + { name = "jsonref" }, + { name = "jsonschema-path" }, + { name = "mcp" }, + { name = "openapi-pydantic" }, + { name = "opentelemetry-api" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, + { name = "pydantic", extra = ["email"] }, + { name = "pyperclip" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "uncalled-for" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/32/4f1b2cfd7b50db89114949f90158b1dcc2c92a1917b9f57c0ff24e47a2f4/fastmcp-3.2.0.tar.gz", hash = "sha256:d4830b8ffc3592d3d9c76dc0f398904cf41f04910e41a0de38cc1004e0903bef", size = 26318581, upload-time = "2026-03-30T20:25:37.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/67/684fa2d2de1e7504549d4ca457b4f854ccec3cd3be03bd86b33b599fbf58/fastmcp-3.2.0-py3-none-any.whl", hash = "sha256:e71aba3df16f86f546a4a9e513261d3233bcc92bef0dfa647bac3fa33623f681", size = 705550, upload-time = "2026-03-30T20:25:35.499Z" }, +] + +[[package]] +name = "ffmpy" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/d2/1c4c582d71bcc65c76fa69fab85de6257d50fdf6fd4a2317c53917e9a581/ffmpy-1.0.0.tar.gz", hash = "sha256:b12932e95435c8820f1cd041024402765f821971e4bae753b327fc02a6e12f8b", size = 5101, upload-time = "2025-11-11T06:24:23.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/56/dd3669eccebb6d8ac81e624542ebd53fe6f08e1b8f2f8d50aeb7e3b83f99/ffmpy-1.0.0-py3-none-any.whl", hash = "sha256:5640e5f0fd03fb6236d0e119b16ccf6522db1c826fdf35dcb87087b60fd7504f", size = 5614, upload-time = "2025-11-11T06:24:22.818Z" }, +] + +[[package]] +name = "filelock" +version = "3.25.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/cf/b50ddf667c15276a9ab15a70ef5f257564de271957933ffea49d2cdbcdfb/fsspec-2026.3.0.tar.gz", hash = "sha256:1ee6a0e28677557f8c2f994e3eea77db6392b4de9cd1f5d7a9e87a0ae9d01b41", size = 313547, upload-time = "2026-03-27T19:11:14.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/1f/5f4a3cd9e4440e9d9bc78ad0a91a1c8d46b4d429d5239ebe6793c9fe5c41/fsspec-2026.3.0-py3-none-any.whl", hash = "sha256:d2ceafaad1b3457968ed14efa28798162f1638dbb5d2a6868a2db002a5ee39a4", size = 202595, upload-time = "2026-03-27T19:11:13.595Z" }, +] + +[[package]] +name = "gradio" +version = "6.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "anyio" }, + { name = "audioop-lts", marker = "python_full_version >= '3.13'" }, + { name = "brotli" }, + { name = "fastapi" }, + { name = "ffmpy" }, + { name = "gradio-client" }, + { name = "groovy" }, + { name = "hf-gradio" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "orjson" }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pillow" }, + { name = "pydantic" }, + { name = "pydub" }, + { name = "python-multipart" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "safehttpx" }, + { name = "semantic-version" }, + { name = "starlette" }, + { name = "tomlkit" }, + { name = "typer" }, + { name = "typing-extensions" }, + { name = "uvicorn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/74/740c507b076263f9064ca39c5c244d773c8d4063e1ce630b57d6197ac50f/gradio-6.10.0.tar.gz", hash = "sha256:f76797536f5b62bc1558f622017351133d0087ee5f51aab139af04e82ed3bf2a", size = 58021607, upload-time = "2026-03-24T21:20:13.399Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/ba/fc89989d0a62e4d38c82f54c44b1145e455466a688297cc69cdcbf321ea5/gradio-6.10.0-py3-none-any.whl", hash = "sha256:e20035ef046a30266c0b5ddbe05f2168193d06914dd89eebe2decde77ec510fe", size = 42962248, upload-time = "2026-03-24T21:20:09.938Z" }, +] + +[[package]] +name = "gradio-client" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/4a/ddfaa8b3fef0238768a42301a3361981af1afd90f92c27adfe6cd031eca7/gradio_client-2.4.0.tar.gz", hash = "sha256:781885374f86759b8db5195e13e716c301d14e48e0442aef63362f1eeea4cce2", size = 58203, upload-time = "2026-03-24T21:20:25.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/b3/10cb03cf684aab2bec97cb0b9bbba4f93e7a20c6e0f3b4100c235a55ad93/gradio_client-2.4.0-py3-none-any.whl", hash = "sha256:7c170807b924ed6056b2a1fa9d659d349dd20567c00ee0b4dc249dc1e2def620", size = 59156, upload-time = "2026-03-24T21:20:24.018Z" }, +] + +[[package]] +name = "groovy" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/36/bbdede67400277bef33d3ec0e6a31750da972c469f75966b4930c753218f/groovy-0.1.2.tar.gz", hash = "sha256:25c1dc09b3f9d7e292458aa762c6beb96ea037071bf5e917fc81fb78d2231083", size = 17325, upload-time = "2025-02-28T20:24:56.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64", size = 14090, upload-time = "2025-02-28T20:24:55.152Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "hf-gradio" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gradio-client" }, + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/d8/1771d6f1591099ecd10776782d08c6f87e7c2501f9e9e6ffb7c2ecc07d0c/hf_gradio-0.3.0.tar.gz", hash = "sha256:e74a0f9eab14a1d6f54c523c2192aa5283ca51f01605f661b2542387da5b9fc0", size = 6235, upload-time = "2026-03-27T13:13:43.9Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/52/04816d2a15691a63cec3187e3e592c4493448eb4834492eadd532972b035/hf_gradio-0.3.0-py3-none-any.whl", hash = "sha256:159d33d1f0affae8164d29c0c51a63dfcc0bbc90803b07c6f139137206a796ae", size = 4154, upload-time = "2026-03-23T19:50:08.586Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/08/23c84a26716382c89151b5b447b4beb19e3345f3a93d3b73009a71a57ad3/hf_xet-1.4.2.tar.gz", hash = "sha256:b7457b6b482d9e0743bd116363239b1fa904a5e65deede350fbc0c4ea67c71ea", size = 672357, upload-time = "2026-03-13T06:58:51.077Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/06/e8cf74c3c48e5485c7acc5a990d0d8516cdfb5fdf80f799174f1287cc1b5/hf_xet-1.4.2-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ac8202ae1e664b2c15cdfc7298cbb25e80301ae596d602ef7870099a126fcad4", size = 3796125, upload-time = "2026-03-13T06:58:33.177Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/b73ebab01cbf60777323b7de9ef05550790451eb5172a220d6b9845385ec/hf_xet-1.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d2f8ee39fa9fba9af929f8c0d0482f8ee6e209179ad14a909b6ad78ffcb7c81", size = 3555985, upload-time = "2026-03-13T06:58:31.797Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e7/ded6d1bd041c3f2bca9e913a0091adfe32371988e047dd3a68a2463c15a2/hf_xet-1.4.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4642a6cf249c09da8c1f87fe50b24b2a3450b235bf8adb55700b52f0ea6e2eb6", size = 4212085, upload-time = "2026-03-13T06:58:24.323Z" }, + { url = "https://files.pythonhosted.org/packages/97/c1/a0a44d1f98934f7bdf17f7a915b934f9fca44bb826628c553589900f6df8/hf_xet-1.4.2-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:769431385e746c92dc05492dde6f687d304584b89c33d79def8367ace06cb555", size = 3988266, upload-time = "2026-03-13T06:58:22.887Z" }, + { url = "https://files.pythonhosted.org/packages/7a/82/be713b439060e7d1f1d93543c8053d4ef2fe7e6922c5b31642eaa26f3c4b/hf_xet-1.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c9dd1c1bc4cc56168f81939b0e05b4c36dd2d28c13dc1364b17af89aa0082496", size = 4188513, upload-time = "2026-03-13T06:58:40.858Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/cbd4188b22abd80ebd0edbb2b3e87f2633e958983519980815fb8314eae5/hf_xet-1.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fca58a2ae4e6f6755cc971ac6fcdf777ea9284d7e540e350bb000813b9a3008d", size = 4428287, upload-time = "2026-03-13T06:58:42.601Z" }, + { url = "https://files.pythonhosted.org/packages/b2/4e/84e45b25e2e3e903ed3db68d7eafa96dae9a1d1f6d0e7fc85120347a852f/hf_xet-1.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:163aab46854ccae0ab6a786f8edecbbfbaa38fcaa0184db6feceebf7000c93c0", size = 3665574, upload-time = "2026-03-13T06:58:53.881Z" }, + { url = "https://files.pythonhosted.org/packages/ee/71/c5ac2b9a7ae39c14e91973035286e73911c31980fe44e7b1d03730c00adc/hf_xet-1.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:09b138422ecbe50fd0c84d4da5ff537d27d487d3607183cd10e3e53f05188e82", size = 3528760, upload-time = "2026-03-13T06:58:52.187Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/fcd2504015eab26358d8f0f232a1aed6b8d363a011adef83fe130bff88f7/hf_xet-1.4.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:949dcf88b484bb9d9276ca83f6599e4aa03d493c08fc168c124ad10b2e6f75d7", size = 3796493, upload-time = "2026-03-13T06:58:39.267Z" }, + { url = "https://files.pythonhosted.org/packages/82/56/19c25105ff81731ca6d55a188b5de2aa99d7a2644c7aa9de1810d5d3b726/hf_xet-1.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:41659966020d59eb9559c57de2cde8128b706a26a64c60f0531fa2318f409418", size = 3555797, upload-time = "2026-03-13T06:58:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/8933c073186849b5e06762aa89847991d913d10a95d1603eb7f2c3834086/hf_xet-1.4.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c588e21d80010119458dd5d02a69093f0d115d84e3467efe71ffb2c67c19146", size = 4212127, upload-time = "2026-03-13T06:58:30.539Z" }, + { url = "https://files.pythonhosted.org/packages/eb/01/f89ebba4e369b4ed699dcb60d3152753870996f41c6d22d3d7cac01310e1/hf_xet-1.4.2-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a296744d771a8621ad1d50c098d7ab975d599800dae6d48528ba3944e5001ba0", size = 3987788, upload-time = "2026-03-13T06:58:29.139Z" }, + { url = "https://files.pythonhosted.org/packages/84/4d/8a53e5ffbc2cc33bbf755382ac1552c6d9af13f623ed125fe67cc3e6772f/hf_xet-1.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f563f7efe49588b7d0629d18d36f46d1658fe7e08dce3fa3d6526e1c98315e2d", size = 4188315, upload-time = "2026-03-13T06:58:48.017Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b8/b7a1c1b5592254bd67050632ebbc1b42cc48588bf4757cb03c2ef87e704a/hf_xet-1.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5b2e0132c56d7ee1bf55bdb638c4b62e7106f6ac74f0b786fed499d5548c5570", size = 4428306, upload-time = "2026-03-13T06:58:49.502Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/40779e45b20e11c7c5821a94135e0207080d6b3d76e7b78ccb413c6f839b/hf_xet-1.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:2f45c712c2fa1215713db10df6ac84b49d0e1c393465440e9cb1de73ecf7bbf6", size = 3665826, upload-time = "2026-03-13T06:58:59.88Z" }, + { url = "https://files.pythonhosted.org/packages/51/4c/e2688c8ad1760d7c30f7c429c79f35f825932581bc7c9ec811436d2f21a0/hf_xet-1.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:6d53df40616f7168abfccff100d232e9d460583b9d86fa4912c24845f192f2b8", size = 3529113, upload-time = "2026-03-13T06:58:58.491Z" }, + { url = "https://files.pythonhosted.org/packages/b4/86/b40b83a2ff03ef05c4478d2672b1fc2b9683ff870e2b25f4f3af240f2e7b/hf_xet-1.4.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:71f02d6e4cdd07f344f6844845d78518cc7186bd2bc52d37c3b73dc26a3b0bc5", size = 3800339, upload-time = "2026-03-13T06:58:36.245Z" }, + { url = "https://files.pythonhosted.org/packages/64/2e/af4475c32b4378b0e92a587adb1aa3ec53e3450fd3e5fe0372a874531c00/hf_xet-1.4.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e9b38d876e94d4bdcf650778d6ebbaa791dd28de08db9736c43faff06ede1b5a", size = 3559664, upload-time = "2026-03-13T06:58:34.787Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4c/781267da3188db679e601de18112021a5cb16506fe86b246e22c5401a9c4/hf_xet-1.4.2-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:77e8c180b7ef12d8a96739a4e1e558847002afe9ea63b6f6358b2271a8bdda1c", size = 4217422, upload-time = "2026-03-13T06:58:27.472Z" }, + { url = "https://files.pythonhosted.org/packages/68/47/d6cf4a39ecf6c7705f887a46f6ef5c8455b44ad9eb0d391aa7e8a2ff7fea/hf_xet-1.4.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3b3c6a882016b94b6c210957502ff7877802d0dbda8ad142c8595db8b944271", size = 3992847, upload-time = "2026-03-13T06:58:25.989Z" }, + { url = "https://files.pythonhosted.org/packages/2d/ef/e80815061abff54697239803948abc665c6b1d237102c174f4f7a9a5ffc5/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d9a634cc929cfbaf2e1a50c0e532ae8c78fa98618426769480c58501e8c8ac2", size = 4193843, upload-time = "2026-03-13T06:58:44.59Z" }, + { url = "https://files.pythonhosted.org/packages/54/75/07f6aa680575d9646c4167db6407c41340cbe2357f5654c4e72a1b01ca14/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6b0932eb8b10317ea78b7da6bab172b17be03bbcd7809383d8d5abd6a2233e04", size = 4432751, upload-time = "2026-03-13T06:58:46.533Z" }, + { url = "https://files.pythonhosted.org/packages/cd/71/193eabd7e7d4b903c4aa983a215509c6114915a5a237525ec562baddb868/hf_xet-1.4.2-cp37-abi3-win_amd64.whl", hash = "sha256:ad185719fb2e8ac26f88c8100562dbf9dbdcc3d9d2add00faa94b5f106aea53f", size = 3671149, upload-time = "2026-03-13T06:58:57.07Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7e/ccf239da366b37ba7f0b36095450efae4a64980bdc7ec2f51354205fdf39/hf_xet-1.4.2-cp37-abi3-win_arm64.whl", hash = "sha256:32c012286b581f783653e718c1862aea5b9eb140631685bb0c5e7012c8719a87", size = 3533426, upload-time = "2026-03-13T06:58:55.46Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tqdm" }, + { name = "typer" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/2a/a847fd02261cd051da218baf99f90ee7c7040c109a01833db4f838f25256/huggingface_hub-1.8.0.tar.gz", hash = "sha256:c5627b2fd521e00caf8eff4ac965ba988ea75167fad7ee72e17f9b7183ec63f3", size = 735839, upload-time = "2026-03-25T16:01:28.152Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/ae/8a3a16ea4d202cb641b51d2681bdd3d482c1c592d7570b3fa264730829ce/huggingface_hub-1.8.0-py3-none-any.whl", hash = "sha256:d3eb5047bd4e33c987429de6020d4810d38a5bef95b3b40df9b17346b7f353f2", size = 625208, upload-time = "2026-03-25T16:01:26.603Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jiter" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/5a/41da76c5ea07bec1b0472b6b2fdb1b651074d504b19374d7e130e0cdfb25/jiter-0.13.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2ffc63785fd6c7977defe49b9824ae6ce2b2e2b77ce539bdaf006c26da06342e", size = 311164, upload-time = "2026-02-02T12:35:17.688Z" }, + { url = "https://files.pythonhosted.org/packages/40/cb/4a1bf994a3e869f0d39d10e11efb471b76d0ad70ecbfb591427a46c880c2/jiter-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a638816427006c1e3f0013eb66d391d7a3acda99a7b0cf091eff4497ccea33a", size = 320296, upload-time = "2026-02-02T12:35:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/09/82/acd71ca9b50ecebadc3979c541cd717cce2fe2bc86236f4fa597565d8f1a/jiter-0.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19928b5d1ce0ff8c1ee1b9bdef3b5bfc19e8304f1b904e436caf30bc15dc6cf5", size = 352742, upload-time = "2026-02-02T12:35:21.258Z" }, + { url = "https://files.pythonhosted.org/packages/71/03/d1fc996f3aecfd42eb70922edecfb6dd26421c874503e241153ad41df94f/jiter-0.13.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:309549b778b949d731a2f0e1594a3f805716be704a73bf3ad9a807eed5eb5721", size = 363145, upload-time = "2026-02-02T12:35:24.653Z" }, + { url = "https://files.pythonhosted.org/packages/f1/61/a30492366378cc7a93088858f8991acd7d959759fe6138c12a4644e58e81/jiter-0.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcdabaea26cb04e25df3103ce47f97466627999260290349a88c8136ecae0060", size = 487683, upload-time = "2026-02-02T12:35:26.162Z" }, + { url = "https://files.pythonhosted.org/packages/20/4e/4223cffa9dbbbc96ed821c5aeb6bca510848c72c02086d1ed3f1da3d58a7/jiter-0.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a377af27b236abbf665a69b2bdd680e3b5a0bd2af825cd3b81245279a7606c", size = 373579, upload-time = "2026-02-02T12:35:27.582Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c9/b0489a01329ab07a83812d9ebcffe7820a38163c6d9e7da644f926ff877c/jiter-0.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe49d3ff6db74321f144dff9addd4a5874d3105ac5ba7c5b77fac099cfae31ae", size = 362904, upload-time = "2026-02-02T12:35:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/05/af/53e561352a44afcba9a9bc67ee1d320b05a370aed8df54eafe714c4e454d/jiter-0.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2113c17c9a67071b0f820733c0893ed1d467b5fcf4414068169e5c2cabddb1e2", size = 392380, upload-time = "2026-02-02T12:35:30.385Z" }, + { url = "https://files.pythonhosted.org/packages/76/2a/dd805c3afb8ed5b326c5ae49e725d1b1255b9754b1b77dbecdc621b20773/jiter-0.13.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab1185ca5c8b9491b55ebf6c1e8866b8f68258612899693e24a92c5fdb9455d5", size = 517939, upload-time = "2026-02-02T12:35:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/20/2a/7b67d76f55b8fe14c937e7640389612f05f9a4145fc28ae128aaa5e62257/jiter-0.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9621ca242547edc16400981ca3231e0c91c0c4c1ab8573a596cd9bb3575d5c2b", size = 551696, upload-time = "2026-02-02T12:35:33.306Z" }, + { url = "https://files.pythonhosted.org/packages/85/9c/57cdd64dac8f4c6ab8f994fe0eb04dc9fd1db102856a4458fcf8a99dfa62/jiter-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a7637d92b1c9d7a771e8c56f445c7f84396d48f2e756e5978840ecba2fac0894", size = 204592, upload-time = "2026-02-02T12:35:34.58Z" }, + { url = "https://files.pythonhosted.org/packages/a7/38/f4f3ea5788b8a5bae7510a678cdc747eda0c45ffe534f9878ff37e7cf3b3/jiter-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c1b609e5cbd2f52bb74fb721515745b407df26d7b800458bd97cb3b972c29e7d", size = 206016, upload-time = "2026-02-02T12:35:36.435Z" }, + { url = "https://files.pythonhosted.org/packages/71/29/499f8c9eaa8a16751b1c0e45e6f5f1761d180da873d417996cc7bddc8eef/jiter-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ea026e70a9a28ebbdddcbcf0f1323128a8db66898a06eaad3a4e62d2f554d096", size = 311157, upload-time = "2026-02-02T12:35:37.758Z" }, + { url = "https://files.pythonhosted.org/packages/50/f6/566364c777d2ab450b92100bea11333c64c38d32caf8dc378b48e5b20c46/jiter-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911", size = 319729, upload-time = "2026-02-02T12:35:39.246Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/560f13ec5e4f116d8ad2658781646cca91b617ae3b8758d4a5076b278f70/jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3524798e70655ff19aec58c7d05adb1f074fecff62da857ea9be2b908b6d701", size = 354766, upload-time = "2026-02-02T12:35:40.662Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0d/061faffcfe94608cbc28a0d42a77a74222bdf5055ccdbe5fd2292b94f510/jiter-0.13.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec7e287d7fbd02cb6e22f9a00dd9c9cd504c40a61f2c61e7e1f9690a82726b4c", size = 362587, upload-time = "2026-02-02T12:35:42.025Z" }, + { url = "https://files.pythonhosted.org/packages/92/c9/c66a7864982fd38a9773ec6e932e0398d1262677b8c60faecd02ffb67bf3/jiter-0.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47455245307e4debf2ce6c6e65a717550a0244231240dcf3b8f7d64e4c2f22f4", size = 487537, upload-time = "2026-02-02T12:35:43.459Z" }, + { url = "https://files.pythonhosted.org/packages/6c/86/84eb4352cd3668f16d1a88929b5888a3fe0418ea8c1dfc2ad4e7bf6e069a/jiter-0.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee9da221dca6e0429c2704c1b3655fe7b025204a71d4d9b73390c759d776d165", size = 373717, upload-time = "2026-02-02T12:35:44.928Z" }, + { url = "https://files.pythonhosted.org/packages/6e/09/9fe4c159358176f82d4390407a03f506a8659ed13ca3ac93a843402acecf/jiter-0.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24ab43126d5e05f3d53a36a8e11eb2f23304c6c1117844aaaf9a0aa5e40b5018", size = 362683, upload-time = "2026-02-02T12:35:46.636Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5e/85f3ab9caca0c1d0897937d378b4a515cae9e119730563572361ea0c48ae/jiter-0.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9da38b4fedde4fb528c740c2564628fbab737166a0e73d6d46cb4bb5463ff411", size = 392345, upload-time = "2026-02-02T12:35:48.088Z" }, + { url = "https://files.pythonhosted.org/packages/12/4c/05b8629ad546191939e6f0c2f17e29f542a398f4a52fb987bc70b6d1eb8b/jiter-0.13.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b34c519e17658ed88d5047999a93547f8889f3c1824120c26ad6be5f27b6cf5", size = 517775, upload-time = "2026-02-02T12:35:49.482Z" }, + { url = "https://files.pythonhosted.org/packages/4d/88/367ea2eb6bc582c7052e4baf5ddf57ebe5ab924a88e0e09830dfb585c02d/jiter-0.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2a6394e6af690d462310a86b53c47ad75ac8c21dc79f120714ea449979cb1d3", size = 551325, upload-time = "2026-02-02T12:35:51.104Z" }, + { url = "https://files.pythonhosted.org/packages/f3/12/fa377ffb94a2f28c41afaed093e0d70cfe512035d5ecb0cad0ae4792d35e/jiter-0.13.0-cp311-cp311-win32.whl", hash = "sha256:0f0c065695f616a27c920a56ad0d4fc46415ef8b806bf8fc1cacf25002bd24e1", size = 204709, upload-time = "2026-02-02T12:35:52.467Z" }, + { url = "https://files.pythonhosted.org/packages/cb/16/8e8203ce92f844dfcd3d9d6a5a7322c77077248dbb12da52d23193a839cd/jiter-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:0733312953b909688ae3c2d58d043aa040f9f1a6a75693defed7bc2cc4bf2654", size = 204560, upload-time = "2026-02-02T12:35:53.925Z" }, + { url = "https://files.pythonhosted.org/packages/44/26/97cc40663deb17b9e13c3a5cf29251788c271b18ee4d262c8f94798b8336/jiter-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:5d9b34ad56761b3bf0fbe8f7e55468704107608512350962d3317ffd7a4382d5", size = 189608, upload-time = "2026-02-02T12:35:55.304Z" }, + { url = "https://files.pythonhosted.org/packages/2e/30/7687e4f87086829955013ca12a9233523349767f69653ebc27036313def9/jiter-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0a2bd69fc1d902e89925fc34d1da51b2128019423d7b339a45d9e99c894e0663", size = 307958, upload-time = "2026-02-02T12:35:57.165Z" }, + { url = "https://files.pythonhosted.org/packages/c3/27/e57f9a783246ed95481e6749cc5002a8a767a73177a83c63ea71f0528b90/jiter-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505", size = 318597, upload-time = "2026-02-02T12:35:58.591Z" }, + { url = "https://files.pythonhosted.org/packages/cf/52/e5719a60ac5d4d7c5995461a94ad5ef962a37c8bf5b088390e6fad59b2ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152", size = 348821, upload-time = "2026-02-02T12:36:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/61/db/c1efc32b8ba4c740ab3fc2d037d8753f67685f475e26b9d6536a4322bcdd/jiter-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726", size = 364163, upload-time = "2026-02-02T12:36:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/55/8a/fb75556236047c8806995671a18e4a0ad646ed255276f51a20f32dceaeec/jiter-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0", size = 483709, upload-time = "2026-02-02T12:36:03.41Z" }, + { url = "https://files.pythonhosted.org/packages/7e/16/43512e6ee863875693a8e6f6d532e19d650779d6ba9a81593ae40a9088ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089", size = 370480, upload-time = "2026-02-02T12:36:04.791Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4c/09b93e30e984a187bc8aaa3510e1ec8dcbdcd71ca05d2f56aac0492453aa/jiter-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93", size = 360735, upload-time = "2026-02-02T12:36:06.994Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1b/46c5e349019874ec5dfa508c14c37e29864ea108d376ae26d90bee238cd7/jiter-0.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b88d649135aca526da172e48083da915ec086b54e8e73a425ba50999468cc08", size = 391814, upload-time = "2026-02-02T12:36:08.368Z" }, + { url = "https://files.pythonhosted.org/packages/15/9e/26184760e85baee7162ad37b7912797d2077718476bf91517641c92b3639/jiter-0.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2", size = 513990, upload-time = "2026-02-02T12:36:09.993Z" }, + { url = "https://files.pythonhosted.org/packages/e9/34/2c9355247d6debad57a0a15e76ab1566ab799388042743656e566b3b7de1/jiter-0.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228", size = 548021, upload-time = "2026-02-02T12:36:11.376Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4a/9f2c23255d04a834398b9c2e0e665382116911dc4d06b795710503cdad25/jiter-0.13.0-cp312-cp312-win32.whl", hash = "sha256:0bf670e3b1445fc4d31612199f1744f67f889ee1bbae703c4b54dc097e5dd394", size = 203024, upload-time = "2026-02-02T12:36:12.682Z" }, + { url = "https://files.pythonhosted.org/packages/09/ee/f0ae675a957ae5a8f160be3e87acea6b11dc7b89f6b7ab057e77b2d2b13a/jiter-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:15db60e121e11fe186c0b15236bd5d18381b9ddacdcf4e659feb96fc6c969c92", size = 205424, upload-time = "2026-02-02T12:36:13.93Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/ae611edf913d3cbf02c97cdb90374af2082c48d7190d74c1111dde08bcdd/jiter-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:41f92313d17989102f3cb5dd533a02787cdb99454d494344b0361355da52fcb9", size = 186818, upload-time = "2026-02-02T12:36:15.308Z" }, + { url = "https://files.pythonhosted.org/packages/91/9c/7ee5a6ff4b9991e1a45263bfc46731634c4a2bde27dfda6c8251df2d958c/jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf", size = 306897, upload-time = "2026-02-02T12:36:16.748Z" }, + { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload-time = "2026-02-02T12:36:18.351Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload-time = "2026-02-02T12:36:19.746Z" }, + { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload-time = "2026-02-02T12:36:21.243Z" }, + { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload-time = "2026-02-02T12:36:22.688Z" }, + { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload-time = "2026-02-02T12:36:24.106Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload-time = "2026-02-02T12:36:25.519Z" }, + { url = "https://files.pythonhosted.org/packages/16/be/7ffd08203277a813f732ba897352797fa9493faf8dc7995b31f3d9cb9488/jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa", size = 390664, upload-time = "2026-02-02T12:36:26.866Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload-time = "2026-02-02T12:36:28.217Z" }, + { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload-time = "2026-02-02T12:36:29.678Z" }, + { url = "https://files.pythonhosted.org/packages/27/da/68f38d12e7111d2016cd198161b36e1f042bd115c169255bcb7ec823a3bf/jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72", size = 200630, upload-time = "2026-02-02T12:36:31.808Z" }, + { url = "https://files.pythonhosted.org/packages/25/65/3bd1a972c9a08ecd22eb3b08a95d1941ebe6938aea620c246cf426ae09c2/jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc", size = 202602, upload-time = "2026-02-02T12:36:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/13bd3678a311aa67686bb303654792c48206a112068f8b0b21426eb6851e/jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b", size = 185939, upload-time = "2026-02-02T12:36:35.065Z" }, + { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload-time = "2026-02-02T12:36:36.579Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload-time = "2026-02-02T12:36:38.058Z" }, + { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload-time = "2026-02-02T12:36:39.417Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ec/a4c72c822695fa80e55d2b4142b73f0012035d9fcf90eccc56bc060db37c/jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d", size = 201950, upload-time = "2026-02-02T12:36:40.791Z" }, + { url = "https://files.pythonhosted.org/packages/b6/00/393553ec27b824fbc29047e9c7cd4a3951d7fbe4a76743f17e44034fa4e4/jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d", size = 185852, upload-time = "2026-02-02T12:36:42.077Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f5/f1997e987211f6f9bd71b8083047b316208b4aca0b529bb5f8c96c89ef3e/jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0", size = 308804, upload-time = "2026-02-02T12:36:43.496Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8f/5482a7677731fd44881f0204981ce2d7175db271f82cba2085dd2212e095/jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91", size = 318787, upload-time = "2026-02-02T12:36:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b9/7257ac59778f1cd025b26a23c5520a36a424f7f1b068f2442a5b499b7464/jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09", size = 353880, upload-time = "2026-02-02T12:36:47.365Z" }, + { url = "https://files.pythonhosted.org/packages/c3/87/719eec4a3f0841dad99e3d3604ee4cba36af4419a76f3cb0b8e2e691ad67/jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607", size = 366702, upload-time = "2026-02-02T12:36:48.871Z" }, + { url = "https://files.pythonhosted.org/packages/d2/65/415f0a75cf6921e43365a1bc227c565cb949caca8b7532776e430cbaa530/jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66", size = 486319, upload-time = "2026-02-02T12:36:53.006Z" }, + { url = "https://files.pythonhosted.org/packages/54/a2/9e12b48e82c6bbc6081fd81abf915e1443add1b13d8fc586e1d90bb02bb8/jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2", size = 372289, upload-time = "2026-02-02T12:36:54.593Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c1/e4693f107a1789a239c759a432e9afc592366f04e901470c2af89cfd28e1/jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad", size = 360165, upload-time = "2026-02-02T12:36:56.112Z" }, + { url = "https://files.pythonhosted.org/packages/17/08/91b9ea976c1c758240614bd88442681a87672eebc3d9a6dde476874e706b/jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d", size = 389634, upload-time = "2026-02-02T12:36:57.495Z" }, + { url = "https://files.pythonhosted.org/packages/18/23/58325ef99390d6d40427ed6005bf1ad54f2577866594bcf13ce55675f87d/jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df", size = 514933, upload-time = "2026-02-02T12:36:58.909Z" }, + { url = "https://files.pythonhosted.org/packages/5b/25/69f1120c7c395fd276c3996bb8adefa9c6b84c12bb7111e5c6ccdcd8526d/jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d", size = 548842, upload-time = "2026-02-02T12:37:00.433Z" }, + { url = "https://files.pythonhosted.org/packages/18/05/981c9669d86850c5fbb0d9e62bba144787f9fba84546ba43d624ee27ef29/jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6", size = 202108, upload-time = "2026-02-02T12:37:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/8d/96/cdcf54dd0b0341db7d25413229888a346c7130bd20820530905fdb65727b/jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f", size = 204027, upload-time = "2026-02-02T12:37:03.075Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f9/724bcaaab7a3cd727031fe4f6995cb86c4bd344909177c186699c8dec51a/jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d", size = 187199, upload-time = "2026-02-02T12:37:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/62/92/1661d8b9fd6a3d7a2d89831db26fe3c1509a287d83ad7838831c7b7a5c7e/jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0", size = 318423, upload-time = "2026-02-02T12:37:05.806Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3b/f77d342a54d4ebcd128e520fc58ec2f5b30a423b0fd26acdfc0c6fef8e26/jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40", size = 351438, upload-time = "2026-02-02T12:37:07.189Z" }, + { url = "https://files.pythonhosted.org/packages/76/b3/ba9a69f0e4209bd3331470c723c2f5509e6f0482e416b612431a5061ed71/jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202", size = 364774, upload-time = "2026-02-02T12:37:08.579Z" }, + { url = "https://files.pythonhosted.org/packages/b3/16/6cdb31fa342932602458dbb631bfbd47f601e03d2e4950740e0b2100b570/jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0", size = 487238, upload-time = "2026-02-02T12:37:10.066Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b1/956cc7abaca8d95c13aa8d6c9b3f3797241c246cd6e792934cc4c8b250d2/jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95", size = 372892, upload-time = "2026-02-02T12:37:11.656Z" }, + { url = "https://files.pythonhosted.org/packages/26/c4/97ecde8b1e74f67b8598c57c6fccf6df86ea7861ed29da84629cdbba76c4/jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59", size = 360309, upload-time = "2026-02-02T12:37:13.244Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d7/eabe3cf46715854ccc80be2cd78dd4c36aedeb30751dbf85a1d08c14373c/jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe", size = 389607, upload-time = "2026-02-02T12:37:14.881Z" }, + { url = "https://files.pythonhosted.org/packages/df/2d/03963fc0804e6109b82decfb9974eb92df3797fe7222428cae12f8ccaa0c/jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939", size = 514986, upload-time = "2026-02-02T12:37:16.326Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/8c83b45eb3eb1c1e18d841fe30b4b5bc5619d781267ca9bc03e005d8fd0a/jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9", size = 548756, upload-time = "2026-02-02T12:37:17.736Z" }, + { url = "https://files.pythonhosted.org/packages/47/66/eea81dfff765ed66c68fd2ed8c96245109e13c896c2a5015c7839c92367e/jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6", size = 201196, upload-time = "2026-02-02T12:37:19.101Z" }, + { url = "https://files.pythonhosted.org/packages/ff/32/4ac9c7a76402f8f00d00842a7f6b83b284d0cf7c1e9d4227bc95aa6d17fa/jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8", size = 204215, upload-time = "2026-02-02T12:37:20.495Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8e/7def204fea9f9be8b3c21a6f2dd6c020cf56c7d5ff753e0e23ed7f9ea57e/jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024", size = 187152, upload-time = "2026-02-02T12:37:22.124Z" }, + { url = "https://files.pythonhosted.org/packages/79/b3/3c29819a27178d0e461a8571fb63c6ae38be6dc36b78b3ec2876bbd6a910/jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b1cbfa133241d0e6bdab48dcdc2604e8ba81512f6bbd68ec3e8e1357dd3c316c", size = 307016, upload-time = "2026-02-02T12:37:42.755Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/60993e4b07b1ac5ebe46da7aa99fdbb802eb986c38d26e3883ac0125c4e0/jiter-0.13.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:db367d8be9fad6e8ebbac4a7578b7af562e506211036cba2c06c3b998603c3d2", size = 305024, upload-time = "2026-02-02T12:37:44.774Z" }, + { url = "https://files.pythonhosted.org/packages/77/fa/2227e590e9cf98803db2811f172b2d6460a21539ab73006f251c66f44b14/jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f6f8efb2f3b0603092401dc2df79fa89ccbc027aaba4174d2d4133ed661434", size = 339337, upload-time = "2026-02-02T12:37:46.668Z" }, + { url = "https://files.pythonhosted.org/packages/2d/92/015173281f7eb96c0ef580c997da8ef50870d4f7f4c9e03c845a1d62ae04/jiter-0.13.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597245258e6ad085d064780abfb23a284d418d3e61c57362d9449c6c7317ee2d", size = 346395, upload-time = "2026-02-02T12:37:48.09Z" }, + { url = "https://files.pythonhosted.org/packages/80/60/e50fa45dd7e2eae049f0ce964663849e897300433921198aef94b6ffa23a/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:3d744a6061afba08dd7ae375dcde870cffb14429b7477e10f67e9e6d68772a0a", size = 305169, upload-time = "2026-02-02T12:37:50.376Z" }, + { url = "https://files.pythonhosted.org/packages/d2/73/a009f41c5eed71c49bec53036c4b33555afcdee70682a18c6f66e396c039/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f", size = 303808, upload-time = "2026-02-02T12:37:52.092Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/528b439290763bff3d939268085d03382471b442f212dca4ff5f12802d43/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59", size = 337384, upload-time = "2026-02-02T12:37:53.582Z" }, + { url = "https://files.pythonhosted.org/packages/67/8a/a342b2f0251f3dac4ca17618265d93bf244a2a4d089126e81e4c1056ac50/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19", size = 343768, upload-time = "2026-02-02T12:37:55.055Z" }, +] + +[[package]] +name = "jsonref" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", size = 8814, upload-time = "2023-01-16T16:10:04.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", size = 9425, upload-time = "2023-01-16T16:10:02.255Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-path" +version = "0.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pathable" }, + { name = "pyyaml" }, + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/7e6102f2b8bdc6705a9eb5294f8f6f9ccd3a8420e8e8e19671d1dd773251/jsonschema_path-0.4.5.tar.gz", hash = "sha256:c6cd7d577ae290c7defd4f4029e86fdb248ca1bd41a07557795b3c95e5144918", size = 15113, upload-time = "2026-03-03T09:56:46.87Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/d5/4e96c44f6c1ea3d812cf5391d81a4f5abaa540abf8d04ecd7f66e0ed11df/jsonschema_path-0.4.5-py3-none-any.whl", hash = "sha256:7d77a2c3f3ec569a40efe5c5f942c44c1af2a6f96fe0866794c9ef5b8f87fd65", size = 19368, upload-time = "2026-03-03T09:56:45.39Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mcp" +version = "1.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, + { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, + { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, + { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, + { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, + { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, +] + +[[package]] +name = "openai" +version = "2.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/15/52580c8fbc16d0675d516e8749806eda679b16de1e4434ea06fb6feaa610/openai-2.30.0.tar.gz", hash = "sha256:92f7661c990bda4b22a941806c83eabe4896c3094465030dd882a71abe80c885", size = 676084, upload-time = "2026-03-25T22:08:59.96Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/9e/5bfa2270f902d5b92ab7d41ce0475b8630572e71e349b2a4996d14bdda93/openai-2.30.0-py3-none-any.whl", hash = "sha256:9a5ae616888eb2748ec5e0c5b955a51592e0b201a11f4262db920f2a78c5231d", size = 1146656, upload-time = "2026-03-25T22:08:58.2Z" }, +] + +[[package]] +name = "openapi-pydantic" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, +] + +[[package]] +name = "openenv-core" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastapi" }, + { name = "fastmcp" }, + { name = "gradio" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "openai" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, + { name = "tomli" }, + { name = "tomli-w" }, + { name = "typer" }, + { name = "uvicorn" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/f3/41a5ed932a2507438c985e9d959dcaa1a6c46f293995c064348c0e52dd40/openenv_core-0.2.3.tar.gz", hash = "sha256:48aefd774474556297ce012b80f2ceb271db51253d7fd0838e6e2dcc329db0c3", size = 146944, upload-time = "2026-03-28T18:56:28.415Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/22/38c339e370d198008f2c17ebdda1ae8f23bb4e1509dc7ae8eab6dc9b9cbe/openenv_core-0.2.3-py3-none-any.whl", hash = "sha256:f75a20c94452057a5f53a86e6d71a9f6a461524c3d6a865aa9344d257a92b795", size = 174557, upload-time = "2026-03-28T18:56:26.874Z" }, +] + +[package.optional-dependencies] +core = [ + { name = "fastapi" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "uvicorn" }, + { name = "websockets" }, +] + +[[package]] +name = "openenv-toolforge-env" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "openenv-core", extra = ["core"] }, +] + +[package.optional-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-cov" }, +] + +[package.metadata] +requires-dist = [ + { name = "openenv-core", extras = ["core"], specifier = ">=0.2.2" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "opentelemetry-api" +version = "1.40.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/1d/4049a9e8698361cc1a1aa03a6c59e4fa4c71e0c0f94a30f988a6876a2ae6/opentelemetry_api-1.40.0.tar.gz", hash = "sha256:159be641c0b04d11e9ecd576906462773eb97ae1b657730f0ecf64d32071569f", size = 70851, upload-time = "2026-03-04T14:17:21.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/bf/93795954016c522008da367da292adceed71cca6ee1717e1d64c83089099/opentelemetry_api-1.40.0-py3-none-any.whl", hash = "sha256:82dd69331ae74b06f6a874704be0cfaa49a1650e1537d4a813b86ecef7d0ecf9", size = 68676, upload-time = "2026-03-04T14:17:01.24Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/45/b268004f745ede84e5798b48ee12b05129d19235d0e15267aa57dcdb400b/orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49", size = 6144992, upload-time = "2026-02-02T15:38:49.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1a/a373746fa6d0e116dd9e54371a7b54622c44d12296d5d0f3ad5e3ff33490/orjson-3.11.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a02c833f38f36546ba65a452127633afce4cf0dd7296b753d3bb54e55e5c0174", size = 229140, upload-time = "2026-02-02T15:37:06.082Z" }, + { url = "https://files.pythonhosted.org/packages/52/a2/fa129e749d500f9b183e8a3446a193818a25f60261e9ce143ad61e975208/orjson-3.11.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63c6e6738d7c3470ad01601e23376aa511e50e1f3931395b9f9c722406d1a67", size = 128670, upload-time = "2026-02-02T15:37:08.002Z" }, + { url = "https://files.pythonhosted.org/packages/08/93/1e82011cd1e0bd051ef9d35bed1aa7fb4ea1f0a055dc2c841b46b43a9ebd/orjson-3.11.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043d3006b7d32c7e233b8cfb1f01c651013ea079e08dcef7189a29abd8befe11", size = 123832, upload-time = "2026-02-02T15:37:09.191Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d8/a26b431ef962c7d55736674dddade876822f3e33223c1f47a36879350d04/orjson-3.11.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57036b27ac8a25d81112eb0cc9835cd4833c5b16e1467816adc0015f59e870dc", size = 129171, upload-time = "2026-02-02T15:37:11.112Z" }, + { url = "https://files.pythonhosted.org/packages/a7/19/f47819b84a580f490da260c3ee9ade214cf4cf78ac9ce8c1c758f80fdfc9/orjson-3.11.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:733ae23ada68b804b222c44affed76b39e30806d38660bf1eb200520d259cc16", size = 141967, upload-time = "2026-02-02T15:37:12.282Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cd/37ece39a0777ba077fdcdbe4cccae3be8ed00290c14bf8afdc548befc260/orjson-3.11.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fdfad2093bdd08245f2e204d977facd5f871c88c4a71230d5bcbd0e43bf6222", size = 130991, upload-time = "2026-02-02T15:37:13.465Z" }, + { url = "https://files.pythonhosted.org/packages/8f/ed/f2b5d66aa9b6b5c02ff5f120efc7b38c7c4962b21e6be0f00fd99a5c348e/orjson-3.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cededd6738e1c153530793998e31c05086582b08315db48ab66649768f326baa", size = 133674, upload-time = "2026-02-02T15:37:14.694Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6e/baa83e68d1aa09fa8c3e5b2c087d01d0a0bd45256de719ed7bc22c07052d/orjson-3.11.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:14f440c7268c8f8633d1b3d443a434bd70cb15686117ea6beff8fdc8f5917a1e", size = 138722, upload-time = "2026-02-02T15:37:16.501Z" }, + { url = "https://files.pythonhosted.org/packages/0c/47/7f8ef4963b772cd56999b535e553f7eb5cd27e9dd6c049baee6f18bfa05d/orjson-3.11.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3a2479753bbb95b0ebcf7969f562cdb9668e6d12416a35b0dda79febf89cdea2", size = 409056, upload-time = "2026-02-02T15:37:17.895Z" }, + { url = "https://files.pythonhosted.org/packages/38/eb/2df104dd2244b3618f25325a656f85cc3277f74bbd91224752410a78f3c7/orjson-3.11.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:71924496986275a737f38e3f22b4e0878882b3f7a310d2ff4dc96e812789120c", size = 144196, upload-time = "2026-02-02T15:37:19.349Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2a/ee41de0aa3a6686598661eae2b4ebdff1340c65bfb17fcff8b87138aab21/orjson-3.11.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4a9eefdc70bf8bf9857f0290f973dec534ac84c35cd6a7f4083be43e7170a8f", size = 134979, upload-time = "2026-02-02T15:37:20.906Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fa/92fc5d3d402b87a8b28277a9ed35386218a6a5287c7fe5ee9b9f02c53fb2/orjson-3.11.7-cp310-cp310-win32.whl", hash = "sha256:ae9e0b37a834cef7ce8f99de6498f8fad4a2c0bf6bfc3d02abd8ed56aa15b2de", size = 127968, upload-time = "2026-02-02T15:37:23.178Z" }, + { url = "https://files.pythonhosted.org/packages/07/29/a576bf36d73d60df06904d3844a9df08e25d59eba64363aaf8ec2f9bff41/orjson-3.11.7-cp310-cp310-win_amd64.whl", hash = "sha256:d772afdb22555f0c58cfc741bdae44180122b3616faa1ecadb595cd526e4c993", size = 125128, upload-time = "2026-02-02T15:37:24.329Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/da6cb01fc6087048d7f61522c327edf4250f1683a58a839fdcc435746dd5/orjson-3.11.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9487abc2c2086e7c8eb9a211d2ce8855bae0e92586279d0d27b341d5ad76c85c", size = 228664, upload-time = "2026-02-02T15:37:25.542Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c2/5885e7a5881dba9a9af51bc564e8967225a642b3e03d089289a35054e749/orjson-3.11.7-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:79cacb0b52f6004caf92405a7e1f11e6e2de8bdf9019e4f76b44ba045125cd6b", size = 125344, upload-time = "2026-02-02T15:37:26.92Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1d/4e7688de0a92d1caf600dfd5fb70b4c5bfff51dfa61ac555072ef2d0d32a/orjson-3.11.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e85fe4698b6a56d5e2ebf7ae87544d668eb6bde1ad1226c13f44663f20ec9e", size = 128404, upload-time = "2026-02-02T15:37:28.108Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b2/ec04b74ae03a125db7bd69cffd014b227b7f341e3261bf75b5eb88a1aa92/orjson-3.11.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8d14b71c0b12963fe8a62aac87119f1afdf4cb88a400f61ca5ae581449efcb5", size = 123677, upload-time = "2026-02-02T15:37:30.287Z" }, + { url = "https://files.pythonhosted.org/packages/4c/69/f95bdf960605f08f827f6e3291fe243d8aa9c5c9ff017a8d7232209184c3/orjson-3.11.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91c81ef070c8f3220054115e1ef468b1c9ce8497b4e526cb9f68ab4dc0a7ac62", size = 128950, upload-time = "2026-02-02T15:37:31.595Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1b/de59c57bae1d148ef298852abd31909ac3089cff370dfd4cd84cc99cbc42/orjson-3.11.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:411ebaf34d735e25e358a6d9e7978954a9c9d58cfb47bc6683cdc3964cd2f910", size = 141756, upload-time = "2026-02-02T15:37:32.985Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9e/9decc59f4499f695f65c650f6cfa6cd4c37a3fbe8fa235a0a3614cb54386/orjson-3.11.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a16bcd08ab0bcdfc7e8801d9c4a9cc17e58418e4d48ddc6ded4e9e4b1a94062b", size = 130812, upload-time = "2026-02-02T15:37:34.204Z" }, + { url = "https://files.pythonhosted.org/packages/28/e6/59f932bcabd1eac44e334fe8e3281a92eacfcb450586e1f4bde0423728d8/orjson-3.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0b51672e466fd7e56230ffbae7f1639e18d0ce023351fb75da21b71bc2c960", size = 133444, upload-time = "2026-02-02T15:37:35.446Z" }, + { url = "https://files.pythonhosted.org/packages/f1/36/b0f05c0eaa7ca30bc965e37e6a2956b0d67adb87a9872942d3568da846ae/orjson-3.11.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:136dcd6a2e796dfd9ffca9fc027d778567b0b7c9968d092842d3c323cef88aa8", size = 138609, upload-time = "2026-02-02T15:37:36.657Z" }, + { url = "https://files.pythonhosted.org/packages/b8/03/58ec7d302b8d86944c60c7b4b82975d5161fcce4c9bc8c6cb1d6741b6115/orjson-3.11.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7ba61079379b0ae29e117db13bda5f28d939766e410d321ec1624afc6a0b0504", size = 408918, upload-time = "2026-02-02T15:37:38.076Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/868d65ef9a8b99be723bd510de491349618abd9f62c826cf206d962db295/orjson-3.11.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0527a4510c300e3b406591b0ba69b5dc50031895b0a93743526a3fc45f59d26e", size = 143998, upload-time = "2026-02-02T15:37:39.706Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c7/1e18e1c83afe3349f4f6dc9e14910f0ae5f82eac756d1412ea4018938535/orjson-3.11.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a709e881723c9b18acddcfb8ba357322491ad553e277cf467e1e7e20e2d90561", size = 134802, upload-time = "2026-02-02T15:37:41.002Z" }, + { url = "https://files.pythonhosted.org/packages/d4/0b/ccb7ee1a65b37e8eeb8b267dc953561d72370e85185e459616d4345bab34/orjson-3.11.7-cp311-cp311-win32.whl", hash = "sha256:c43b8b5bab288b6b90dac410cca7e986a4fa747a2e8f94615aea407da706980d", size = 127828, upload-time = "2026-02-02T15:37:42.241Z" }, + { url = "https://files.pythonhosted.org/packages/af/9e/55c776dffda3f381e0f07d010a4f5f3902bf48eaba1bb7684d301acd4924/orjson-3.11.7-cp311-cp311-win_amd64.whl", hash = "sha256:6543001328aa857187f905308a028935864aefe9968af3848401b6fe80dbb471", size = 124941, upload-time = "2026-02-02T15:37:43.444Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8e/424a620fa7d263b880162505fb107ef5e0afaa765b5b06a88312ac291560/orjson-3.11.7-cp311-cp311-win_arm64.whl", hash = "sha256:1ee5cc7160a821dfe14f130bc8e63e7611051f964b463d9e2a3a573204446a4d", size = 126245, upload-time = "2026-02-02T15:37:45.18Z" }, + { url = "https://files.pythonhosted.org/packages/80/bf/76f4f1665f6983385938f0e2a5d7efa12a58171b8456c252f3bae8a4cf75/orjson-3.11.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bd03ea7606833655048dab1a00734a2875e3e86c276e1d772b2a02556f0d895f", size = 228545, upload-time = "2026-02-02T15:37:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/79/53/6c72c002cb13b5a978a068add59b25a8bdf2800ac1c9c8ecdb26d6d97064/orjson-3.11.7-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:89e440ebc74ce8ab5c7bc4ce6757b4a6b1041becb127df818f6997b5c71aa60b", size = 125224, upload-time = "2026-02-02T15:37:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/2c/83/10e48852865e5dd151bdfe652c06f7da484578ed02c5fca938e3632cb0b8/orjson-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ede977b5fe5ac91b1dffc0a517ca4542d2ec8a6a4ff7b2652d94f640796342a", size = 128154, upload-time = "2026-02-02T15:37:48.954Z" }, + { url = "https://files.pythonhosted.org/packages/6e/52/a66e22a2b9abaa374b4a081d410edab6d1e30024707b87eab7c734afe28d/orjson-3.11.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b7b1dae39230a393df353827c855a5f176271c23434cfd2db74e0e424e693e10", size = 123548, upload-time = "2026-02-02T15:37:50.187Z" }, + { url = "https://files.pythonhosted.org/packages/de/38/605d371417021359f4910c496f764c48ceb8997605f8c25bf1dfe58c0ebe/orjson-3.11.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed46f17096e28fb28d2975834836a639af7278aa87c84f68ab08fbe5b8bd75fa", size = 129000, upload-time = "2026-02-02T15:37:51.426Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/af32e842b0ffd2335c89714d48ca4e3917b42f5d6ee5537832e069a4b3ac/orjson-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3726be79e36e526e3d9c1aceaadbfb4a04ee80a72ab47b3f3c17fefb9812e7b8", size = 141686, upload-time = "2026-02-02T15:37:52.607Z" }, + { url = "https://files.pythonhosted.org/packages/96/0b/fc793858dfa54be6feee940c1463370ece34b3c39c1ca0aa3845f5ba9892/orjson-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0724e265bc548af1dedebd9cb3d24b4e1c1e685a343be43e87ba922a5c5fff2f", size = 130812, upload-time = "2026-02-02T15:37:53.944Z" }, + { url = "https://files.pythonhosted.org/packages/dc/91/98a52415059db3f374757d0b7f0f16e3b5cd5976c90d1c2b56acaea039e6/orjson-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7745312efa9e11c17fbd3cb3097262d079da26930ae9ae7ba28fb738367cbad", size = 133440, upload-time = "2026-02-02T15:37:55.615Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/cb540117bda61791f46381f8c26c8f93e802892830a6055748d3bb1925ab/orjson-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f904c24bdeabd4298f7a977ef14ca2a022ca921ed670b92ecd16ab6f3d01f867", size = 138386, upload-time = "2026-02-02T15:37:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/63/1a/50a3201c334a7f17c231eee5f841342190723794e3b06293f26e7cf87d31/orjson-3.11.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b9fc4d0f81f394689e0814617aadc4f2ea0e8025f38c226cbf22d3b5ddbf025d", size = 408853, upload-time = "2026-02-02T15:37:58.291Z" }, + { url = "https://files.pythonhosted.org/packages/87/cd/8de1c67d0be44fdc22701e5989c0d015a2adf391498ad42c4dc589cd3013/orjson-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:849e38203e5be40b776ed2718e587faf204d184fc9a008ae441f9442320c0cab", size = 144130, upload-time = "2026-02-02T15:38:00.163Z" }, + { url = "https://files.pythonhosted.org/packages/0f/fe/d605d700c35dd55f51710d159fc54516a280923cd1b7e47508982fbb387d/orjson-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4682d1db3bcebd2b64757e0ddf9e87ae5f00d29d16c5cdf3a62f561d08cc3dd2", size = 134818, upload-time = "2026-02-02T15:38:01.507Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e4/15ecc67edb3ddb3e2f46ae04475f2d294e8b60c1825fbe28a428b93b3fbd/orjson-3.11.7-cp312-cp312-win32.whl", hash = "sha256:f4f7c956b5215d949a1f65334cf9d7612dde38f20a95f2315deef167def91a6f", size = 127923, upload-time = "2026-02-02T15:38:02.75Z" }, + { url = "https://files.pythonhosted.org/packages/34/70/2e0855361f76198a3965273048c8e50a9695d88cd75811a5b46444895845/orjson-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:bf742e149121dc5648ba0a08ea0871e87b660467ef168a3a5e53bc1fbd64bb74", size = 125007, upload-time = "2026-02-02T15:38:04.032Z" }, + { url = "https://files.pythonhosted.org/packages/68/40/c2051bd19fc467610fed469dc29e43ac65891571138f476834ca192bc290/orjson-3.11.7-cp312-cp312-win_arm64.whl", hash = "sha256:26c3b9132f783b7d7903bf1efb095fed8d4a3a85ec0d334ee8beff3d7a4749d5", size = 126089, upload-time = "2026-02-02T15:38:05.297Z" }, + { url = "https://files.pythonhosted.org/packages/89/25/6e0e52cac5aab51d7b6dcd257e855e1dec1c2060f6b28566c509b4665f62/orjson-3.11.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1d98b30cc1313d52d4af17d9c3d307b08389752ec5f2e5febdfada70b0f8c733", size = 228390, upload-time = "2026-02-02T15:38:06.8Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/a77f48d2fc8a05bbc529e5ff481fb43d914f9e383ea2469d4f3d51df3d00/orjson-3.11.7-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:d897e81f8d0cbd2abb82226d1860ad2e1ab3ff16d7b08c96ca00df9d45409ef4", size = 125189, upload-time = "2026-02-02T15:38:08.181Z" }, + { url = "https://files.pythonhosted.org/packages/89/25/0a16e0729a0e6a1504f9d1a13cdd365f030068aab64cec6958396b9969d7/orjson-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814be4b49b228cfc0b3c565acf642dd7d13538f966e3ccde61f4f55be3e20785", size = 128106, upload-time = "2026-02-02T15:38:09.41Z" }, + { url = "https://files.pythonhosted.org/packages/66/da/a2e505469d60666a05ab373f1a6322eb671cb2ba3a0ccfc7d4bc97196787/orjson-3.11.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d06e5c5fed5caedd2e540d62e5b1c25e8c82431b9e577c33537e5fa4aa909539", size = 123363, upload-time = "2026-02-02T15:38:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/23/bf/ed73f88396ea35c71b38961734ea4a4746f7ca0768bf28fd551d37e48dd0/orjson-3.11.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31c80ce534ac4ea3739c5ee751270646cbc46e45aea7576a38ffec040b4029a1", size = 129007, upload-time = "2026-02-02T15:38:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/73/3c/b05d80716f0225fc9008fbf8ab22841dcc268a626aa550561743714ce3bf/orjson-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f50979824bde13d32b4320eedd513431c921102796d86be3eee0b58e58a3ecd1", size = 141667, upload-time = "2026-02-02T15:38:13.398Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/0be9b0addd9bf86abfc938e97441dcd0375d494594b1c8ad10fe57479617/orjson-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e54f3808e2b6b945078c41aa8d9b5834b28c50843846e97807e5adb75fa9705", size = 130832, upload-time = "2026-02-02T15:38:14.698Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ec/c68e3b9021a31d9ec15a94931db1410136af862955854ed5dd7e7e4f5bff/orjson-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12b80df61aab7b98b490fe9e4879925ba666fccdfcd175252ce4d9035865ace", size = 133373, upload-time = "2026-02-02T15:38:16.109Z" }, + { url = "https://files.pythonhosted.org/packages/d2/45/f3466739aaafa570cc8e77c6dbb853c48bf56e3b43738020e2661e08b0ac/orjson-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:996b65230271f1a97026fd0e6a753f51fbc0c335d2ad0c6201f711b0da32693b", size = 138307, upload-time = "2026-02-02T15:38:17.453Z" }, + { url = "https://files.pythonhosted.org/packages/e1/84/9f7f02288da1ffb31405c1be07657afd1eecbcb4b64ee2817b6fe0f785fa/orjson-3.11.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ab49d4b2a6a1d415ddb9f37a21e02e0d5dbfe10b7870b21bf779fc21e9156157", size = 408695, upload-time = "2026-02-02T15:38:18.831Z" }, + { url = "https://files.pythonhosted.org/packages/18/07/9dd2f0c0104f1a0295ffbe912bc8d63307a539b900dd9e2c48ef7810d971/orjson-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:390a1dce0c055ddf8adb6aa94a73b45a4a7d7177b5c584b8d1c1947f2ba60fb3", size = 144099, upload-time = "2026-02-02T15:38:20.28Z" }, + { url = "https://files.pythonhosted.org/packages/a5/66/857a8e4a3292e1f7b1b202883bcdeb43a91566cf59a93f97c53b44bd6801/orjson-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1eb80451a9c351a71dfaf5b7ccc13ad065405217726b59fdbeadbcc544f9d223", size = 134806, upload-time = "2026-02-02T15:38:22.186Z" }, + { url = "https://files.pythonhosted.org/packages/0a/5b/6ebcf3defc1aab3a338ca777214966851e92efb1f30dc7fc8285216e6d1b/orjson-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7477aa6a6ec6139c5cb1cc7b214643592169a5494d200397c7fc95d740d5fcf3", size = 127914, upload-time = "2026-02-02T15:38:23.511Z" }, + { url = "https://files.pythonhosted.org/packages/00/04/c6f72daca5092e3117840a1b1e88dfc809cc1470cf0734890d0366b684a1/orjson-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:b9f95dcdea9d4f805daa9ddf02617a89e484c6985fa03055459f90e87d7a0757", size = 124986, upload-time = "2026-02-02T15:38:24.836Z" }, + { url = "https://files.pythonhosted.org/packages/03/ba/077a0f6f1085d6b806937246860fafbd5b17f3919c70ee3f3d8d9c713f38/orjson-3.11.7-cp313-cp313-win_arm64.whl", hash = "sha256:800988273a014a0541483dc81021247d7eacb0c845a9d1a34a422bc718f41539", size = 126045, upload-time = "2026-02-02T15:38:26.216Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0", size = 228391, upload-time = "2026-02-02T15:38:27.757Z" }, + { url = "https://files.pythonhosted.org/packages/46/19/e40f6225da4d3aa0c8dc6e5219c5e87c2063a560fe0d72a88deb59776794/orjson-3.11.7-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c2428d358d85e8da9d37cba18b8c4047c55222007a84f97156a5b22028dfbfc0", size = 125188, upload-time = "2026-02-02T15:38:29.241Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7e/c4de2babef2c0817fd1f048fd176aa48c37bec8aef53d2fa932983032cce/orjson-3.11.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4bc6c6ac52cdaa267552544c73e486fecbd710b7ac09bc024d5a78555a22f6", size = 128097, upload-time = "2026-02-02T15:38:30.618Z" }, + { url = "https://files.pythonhosted.org/packages/eb/74/233d360632bafd2197f217eee7fb9c9d0229eac0c18128aee5b35b0014fe/orjson-3.11.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd0d68edd7dfca1b2eca9361a44ac9f24b078de3481003159929a0573f21a6bf", size = 123364, upload-time = "2026-02-02T15:38:32.363Z" }, + { url = "https://files.pythonhosted.org/packages/79/51/af79504981dd31efe20a9e360eb49c15f06df2b40e7f25a0a52d9ae888e8/orjson-3.11.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:623ad1b9548ef63886319c16fa317848e465a21513b31a6ad7b57443c3e0dcf5", size = 129076, upload-time = "2026-02-02T15:38:33.68Z" }, + { url = "https://files.pythonhosted.org/packages/67/e2/da898eb68b72304f8de05ca6715870d09d603ee98d30a27e8a9629abc64b/orjson-3.11.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e776b998ac37c0396093d10290e60283f59cfe0fc3fccbd0ccc4bd04dd19892", size = 141705, upload-time = "2026-02-02T15:38:34.989Z" }, + { url = "https://files.pythonhosted.org/packages/c5/89/15364d92acb3d903b029e28d834edb8780c2b97404cbf7929aa6b9abdb24/orjson-3.11.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c6c3af76716f4a9c290371ba2e390ede06f6603edb277b481daf37f6f464e", size = 130855, upload-time = "2026-02-02T15:38:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1", size = 133386, upload-time = "2026-02-02T15:38:37.704Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0e/45e1dcf10e17d0924b7c9162f87ec7b4ca79e28a0548acf6a71788d3e108/orjson-3.11.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bda117c4148e81f746655d5a3239ae9bd00cb7bc3ca178b5fc5a5997e9744183", size = 138295, upload-time = "2026-02-02T15:38:39.096Z" }, + { url = "https://files.pythonhosted.org/packages/63/d7/4d2e8b03561257af0450f2845b91fbd111d7e526ccdf737267108075e0ba/orjson-3.11.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:23d6c20517a97a9daf1d48b580fcdc6f0516c6f4b5038823426033690b4d2650", size = 408720, upload-time = "2026-02-02T15:38:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/78/cf/d45343518282108b29c12a65892445fc51f9319dc3c552ceb51bb5905ed2/orjson-3.11.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8ff206156006da5b847c9304b6308a01e8cdbc8cce824e2779a5ba71c3def141", size = 144152, upload-time = "2026-02-02T15:38:42.262Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3a/d6001f51a7275aacd342e77b735c71fa04125a3f93c36fee4526bc8c654e/orjson-3.11.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:962d046ee1765f74a1da723f4b33e3b228fe3a48bd307acce5021dfefe0e29b2", size = 134814, upload-time = "2026-02-02T15:38:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d3/f19b47ce16820cc2c480f7f1723e17f6d411b3a295c60c8ad3aa9ff1c96a/orjson-3.11.7-cp314-cp314-win32.whl", hash = "sha256:89e13dd3f89f1c38a9c9eba5fbf7cdc2d1feca82f5f290864b4b7a6aac704576", size = 127997, upload-time = "2026-02-02T15:38:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl", hash = "sha256:845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1", size = 124985, upload-time = "2026-02-02T15:38:46.388Z" }, + { url = "https://files.pythonhosted.org/packages/6f/1c/f2a8d8a1b17514660a614ce5f7aac74b934e69f5abc2700cc7ced882a009/orjson-3.11.7-cp314-cp314-win_arm64.whl", hash = "sha256:4a2e9c5be347b937a2e0203866f12bba36082e89b402ddb9e927d5822e43088d", size = 126038, upload-time = "2026-02-02T15:38:47.703Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0", size = 10326926, upload-time = "2026-03-31T06:46:08.29Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c", size = 9926987, upload-time = "2026-03-31T06:46:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/52/77/9b1c2d6070b5dbe239a7bc889e21bfa58720793fb902d1e070695d87c6d0/pandas-3.0.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:339dda302bd8369dedeae979cb750e484d549b563c3f54f3922cb8ff4978c5eb", size = 10757067, upload-time = "2026-03-31T06:46:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76", size = 11258787, upload-time = "2026-03-31T06:46:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/90/e3/3f1126d43d3702ca8773871a81c9f15122a1f412342cc56284ffda5b1f70/pandas-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c934008c733b8bbea273ea308b73b3156f0181e5b72960790b09c18a2794fe1e", size = 11771616, upload-time = "2026-03-31T06:46:20.532Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cf/0f4e268e1f5062e44a6bda9f925806721cd4c95c2b808a4c82ebe914f96b/pandas-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:60a80bb4feacbef5e1447a3f82c33209c8b7e07f28d805cfd1fb951e5cb443aa", size = 12337623, upload-time = "2026-03-31T06:46:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df", size = 9897372, upload-time = "2026-03-31T06:46:26.703Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/781516b808a99ddf288143cec46b342b3016c3414d137da1fdc3290d8860/pandas-3.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f12b1a9e332c01e09510586f8ca9b108fd631fd656af82e452d7315ef6df5f9f", size = 9154922, upload-time = "2026-03-31T06:46:30.284Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921, upload-time = "2026-03-31T06:46:33.36Z" }, + { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127, upload-time = "2026-03-31T06:46:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577, upload-time = "2026-03-31T06:46:39.224Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030, upload-time = "2026-03-31T06:46:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468, upload-time = "2026-03-31T06:46:45.2Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381, upload-time = "2026-03-31T06:46:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993, upload-time = "2026-03-31T06:46:51.488Z" }, + { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118, upload-time = "2026-03-31T06:46:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, + { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, + { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, + { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, + { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, + { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, + { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, + { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, + { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, + { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, + { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, + { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, + { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, + { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, + { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, + { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" }, +] + +[[package]] +name = "pathable" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/55/b748445cb4ea6b125626f15379be7c96d1035d4fa3e8fee362fa92298abf/pathable-0.5.0.tar.gz", hash = "sha256:d81938348a1cacb525e7c75166270644782c0fb9c8cecc16be033e71427e0ef1", size = 16655, upload-time = "2026-02-20T08:47:00.748Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/96/5a770e5c461462575474468e5af931cff9de036e7c2b4fea23c1c58d2cbe/pathable-0.5.0-py3-none-any.whl", hash = "sha256:646e3d09491a6351a0c82632a09c02cdf70a252e73196b36d8a15ba0a114f0a6", size = 16867, upload-time = "2026-02-20T08:46:59.536Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/30/5bd3d794762481f8c8ae9c80e7b76ecea73b916959eb587521358ef0b2f9/pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0", size = 5304099, upload-time = "2026-02-11T04:20:06.13Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c1/aab9e8f3eeb4490180e357955e15c2ef74b31f64790ff356c06fb6cf6d84/pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713", size = 4657880, upload-time = "2026-02-11T04:20:09.291Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0a/9879e30d56815ad529d3985aeff5af4964202425c27261a6ada10f7cbf53/pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b", size = 6222587, upload-time = "2026-02-11T04:20:10.82Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5f/a1b72ff7139e4f89014e8d451442c74a774d5c43cd938fb0a9f878576b37/pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b", size = 8027678, upload-time = "2026-02-11T04:20:12.455Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c2/c7cb187dac79a3d22c3ebeae727abee01e077c8c7d930791dc592f335153/pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4", size = 6335777, upload-time = "2026-02-11T04:20:14.441Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7b/f9b09a7804ec7336effb96c26d37c29d27225783dc1501b7d62dcef6ae25/pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4", size = 7027140, upload-time = "2026-02-11T04:20:16.387Z" }, + { url = "https://files.pythonhosted.org/packages/98/b2/2fa3c391550bd421b10849d1a2144c44abcd966daadd2f7c12e19ea988c4/pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e", size = 6449855, upload-time = "2026-02-11T04:20:18.554Z" }, + { url = "https://files.pythonhosted.org/packages/96/ff/9caf4b5b950c669263c39e96c78c0d74a342c71c4f43fd031bb5cb7ceac9/pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff", size = 7151329, upload-time = "2026-02-11T04:20:20.646Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f8/4b24841f582704da675ca535935bccb32b00a6da1226820845fac4a71136/pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40", size = 6325574, upload-time = "2026-02-11T04:20:22.43Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/9f6b01c0881d7036063aa6612ef04c0e2cad96be21325a1e92d0203f8e91/pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23", size = 7032347, upload-time = "2026-02-11T04:20:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/79/13/c7922edded3dcdaf10c59297540b72785620abc0538872c819915746757d/pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9", size = 2453457, upload-time = "2026-02-11T04:20:25.392Z" }, + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "py-key-value-aio" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", size = 92300, upload-time = "2026-02-16T21:21:43.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/69/f1b537ee70b7def42d63124a539ed3026a11a3ffc3086947a1ca6e861868/py_key_value_aio-0.4.4-py3-none-any.whl", hash = "sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d", size = 152291, upload-time = "2026-02-16T21:21:44.241Z" }, +] + +[package.optional-dependencies] +filetree = [ + { name = "aiofile" }, + { name = "anyio" }, +] +keyring = [ + { name = "keyring" }, +] +memory = [ + { name = "cachetools" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[package.optional-dependencies] +email = [ + { name = "email-validator" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, + { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, + { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, + { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, + { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, + { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, + { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, + { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, + { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, +] + +[[package]] +name = "pydub" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326, upload-time = "2021-03-10T02:09:54.659Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pyperclip" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", size = 12185, upload-time = "2025-09-26T14:40:37.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" }, +] + +[[package]] +name = "pytz" +version = "2026.1.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, +] + +[[package]] +name = "rich" +version = "14.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, +] + +[[package]] +name = "rich-rst" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/6d/a506aaa4a9eaa945ed8ab2b7347859f53593864289853c5d6d62b77246e0/rich_rst-1.3.2.tar.gz", hash = "sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4", size = 14936, upload-time = "2025-10-14T16:49:45.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/2f/b4530fbf948867702d0a3f27de4a6aab1d156f406d72852ab902c4d04de9/rich_rst-1.3.2-py3-none-any.whl", hash = "sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a", size = 12567, upload-time = "2025-10-14T16:49:42.953Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +] + +[[package]] +name = "safehttpx" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/d1/4282284d9cf1ee873607a46442da977fc3c985059315ab23610be31d5885/safehttpx-0.1.7.tar.gz", hash = "sha256:db201c0978c41eddb8bb480f3eee59dd67304fdd91646035e9d9a720049a9d23", size = 10385, upload-time = "2025-10-24T18:30:09.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/a3/0f0b7d78e2f1eb9e8e1afbff1d2bff8d60144aee17aca51c065b516743dd/safehttpx-0.1.7-py3-none-any.whl", hash = "sha256:c4f4a162db6993464d7ca3d7cc4af0ffc6515a606dfd220b9f82c6945d869cde", size = 8959, upload-time = "2025-10-24T18:30:08.733Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "jeepney", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/8c/f9290339ef6d79badbc010f067cd769d6601ec11a57d78569c683fb4dd87/sse_starlette-3.3.4.tar.gz", hash = "sha256:aaf92fc067af8a5427192895ac028e947b484ac01edbc3caf00e7e7137c7bef1", size = 32427, upload-time = "2026-03-29T09:00:23.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/7f/3de5402f39890ac5660b86bcf5c03f9d855dad5c4ed764866d7b592b46fd/sse_starlette-3.3.4-py3-none-any.whl", hash = "sha256:84bb06e58939a8b38d8341f1bc9792f06c2b53f48c608dd207582b664fc8f3c1", size = 14330, upload-time = "2026-03-29T09:00:21.846Z" }, +] + +[[package]] +name = "starlette" +version = "0.52.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/68/79977123bb7be889ad680d79a40f339082c1978b5cfcf62c2d8d196873ac/starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933", size = 2653702, upload-time = "2026-01-18T13:34:11.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74", size = 74272, upload-time = "2026-01-18T13:34:09.188Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "tomli-w" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, +] + +[[package]] +name = "tomlkit" +version = "0.13.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "typer" +version = "0.24.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "uncalled-for" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/7c/b5b7d8136f872e3f13b0584e576886de0489d7213a12de6bebf29ff6ebfc/uncalled_for-0.2.0.tar.gz", hash = "sha256:b4f8fdbcec328c5a113807d653e041c5094473dd4afa7c34599ace69ccb7e69f", size = 49488, upload-time = "2026-02-27T17:40:58.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/7f/4320d9ce3be404e6310b915c3629fe27bf1e2f438a1a7a3cb0396e32e9a9/uncalled_for-0.2.0-py3-none-any.whl", hash = "sha256:2c0bd338faff5f930918f79e7eb9ff48290df2cb05fcc0b40a7f334e55d4d85f", size = 11351, upload-time = "2026-02-27T17:40:56.804Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/ad/4a96c425be6fb67e0621e62d86c402b4a17ab2be7f7c055d9bd2f638b9e2/uvicorn-0.42.0.tar.gz", hash = "sha256:9b1f190ce15a2dd22e7758651d9b6d12df09a13d51ba5bf4fc33c383a48e1775", size = 85393, upload-time = "2026-03-16T06:19:50.077Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/89/f8827ccff89c1586027a105e5630ff6139a64da2515e24dafe860bd9ae4d/uvicorn-0.42.0-py3-none-any.whl", hash = "sha256:96c30f5c7abe6f74ae8900a70e92b85ad6613b745d4879eb9b16ccad15645359", size = 68830, upload-time = "2026-03-16T06:19:48.325Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", size = 407318, upload-time = "2025-10-14T15:04:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", size = 394478, upload-time = "2025-10-14T15:04:20.297Z" }, + { url = "https://files.pythonhosted.org/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", size = 449894, upload-time = "2025-10-14T15:04:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", size = 459065, upload-time = "2025-10-14T15:04:22.795Z" }, + { url = "https://files.pythonhosted.org/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", size = 488377, upload-time = "2025-10-14T15:04:24.138Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", size = 595837, upload-time = "2025-10-14T15:04:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", size = 473456, upload-time = "2025-10-14T15:04:26.497Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", size = 455614, upload-time = "2025-10-14T15:04:27.539Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", size = 630690, upload-time = "2025-10-14T15:04:28.495Z" }, + { url = "https://files.pythonhosted.org/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", size = 622459, upload-time = "2025-10-14T15:04:29.491Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", size = 272663, upload-time = "2025-10-14T15:04:30.435Z" }, + { url = "https://files.pythonhosted.org/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", size = 287453, upload-time = "2025-10-14T15:04:31.53Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", size = 409611, upload-time = "2025-10-14T15:06:05.809Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", size = 396889, upload-time = "2025-10-14T15:06:07.035Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", size = 451616, upload-time = "2025-10-14T15:06:08.072Z" }, + { url = "https://files.pythonhosted.org/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", size = 458413, upload-time = "2025-10-14T15:06:09.209Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", size = 177343, upload-time = "2026-01-10T09:22:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", size = 175021, upload-time = "2026-01-10T09:22:22.696Z" }, + { url = "https://files.pythonhosted.org/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", size = 175320, upload-time = "2026-01-10T09:22:23.94Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2f/4b3ca7e106bc608744b1cdae041e005e446124bebb037b18799c2d356864/websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72", size = 183815, upload-time = "2026-01-10T09:22:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", size = 185054, upload-time = "2026-01-10T09:22:27.101Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", size = 184565, upload-time = "2026-01-10T09:22:28.293Z" }, + { url = "https://files.pythonhosted.org/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", size = 183848, upload-time = "2026-01-10T09:22:30.394Z" }, + { url = "https://files.pythonhosted.org/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", size = 178249, upload-time = "2026-01-10T09:22:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", size = 178685, upload-time = "2026-01-10T09:22:33.345Z" }, + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +]