Back to skills
SkillHub ClubShip Full StackFull Stack

arena-example

Generate valid PromptArena example configurations. Use when creating new Arena examples, scenarios, provider configs, prompt configs, or tool configs.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
7
Hot score
83
Updated
March 20, 2026
Overall rating
C1.2
Composite score
1.2
Best-practice grade
A92.4

Install command

npx @skill-hub/cli install altairalabs-promptkit-arena-example

Repository

AltairaLabs/PromptKit

Skill path: .claude/skills/arena-example

Generate valid PromptArena example configurations. Use when creating new Arena examples, scenarios, provider configs, prompt configs, or tool configs.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: AltairaLabs.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install arena-example into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/AltairaLabs/PromptKit before adding arena-example to shared team environments
  • Use arena-example for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: arena-example
description: Generate valid PromptArena example configurations. Use when creating new Arena examples, scenarios, provider configs, prompt configs, or tool configs.
argument-hint: "<description of the example to create>"
allowed-tools: Read,Write,Glob,Grep,Bash
---

# Create PromptArena Example

Generate a complete, schema-valid PromptArena example based on: $ARGUMENTS

## Process

1. **Read existing examples** — before creating any config file, read at least one working example of the same `kind` from `examples/`. Use Glob to find them:
   - Arena: `examples/*/config.arena.yaml`
   - Scenario: `examples/*/scenarios/*.scenario.yaml`
   - Provider: `examples/*/providers/*.provider.yaml`
   - Prompt: `examples/*/prompts/*.yaml`
   - Tool: `examples/*/tools/*.tool.yaml`
   - Persona: `examples/*/personas/*.persona.yaml`

2. **Read the JSON schema** — read the relevant schema from `schemas/v1alpha1/` to verify required fields:
   - `schemas/v1alpha1/arena.json`
   - `schemas/v1alpha1/scenario.json`
   - `schemas/v1alpha1/promptconfig.json`
   - `schemas/v1alpha1/provider.json`
   - `schemas/v1alpha1/tool.json`
   - `schemas/v1alpha1/persona.json`

3. **Generate configs** matching the schemas exactly, using the existing examples as templates.

4. **Validate** by running: `env PROMPTKIT_SCHEMA_SOURCE=local ./bin/promptarena run --config <arena-config> --mock-provider --ci --formats json`
   - Build first if needed: `make build-arena`
   - If validation fails, read the error, fix the config, and retry.

## Required Config Patterns

### Arena Config (`config.arena.yaml`)
```yaml
apiVersion: promptkit.altairalabs.ai/v1alpha1
kind: Arena
metadata:
  name: <name>
spec:
  prompt_configs:
    - id: <prompt-task-type>
      file: prompts/<file>.yaml
  providers:
    - file: providers/<file>.provider.yaml
  scenarios:
    - file: scenarios/<file>.scenario.yaml
  defaults:
    temperature: 0.7
    max_tokens: 1500
    seed: 42
    concurrency: 3
    output:
      dir: out
      formats: ["json", "html"]
```

### Provider (`providers/<name>.provider.yaml`)
```yaml
apiVersion: promptkit.altairalabs.ai/v1alpha1
kind: Provider
metadata:
  name: <provider-name>
spec:
  id: <provider-id>
  type: openai|claude|gemini|mock
  model: <model-name>
  # base_url: http://custom-endpoint/v1  # optional
  defaults:
    temperature: 0.7
    max_tokens: 1500
    top_p: 1.0          # REQUIRED — always include top_p
  pricing:               # optional
    input_cost_per_1k: 0.00015
    output_cost_per_1k: 0.0006
```

**CRITICAL**: `defaults.top_p` is required by the schema. Always include it.

### Prompt Config (`prompts/<name>.yaml`)
```yaml
apiVersion: promptkit.altairalabs.ai/v1alpha1
kind: PromptConfig
metadata:
  name: <name>
spec:
  task_type: <task-type>        # REQUIRED — must match scenario task_type
  version: "1.0.0"              # REQUIRED
  description: "<description>"  # REQUIRED
  system_template: |            # REQUIRED
    Your system prompt here.
```

**CRITICAL**: `kind` is `PromptConfig` (not `Prompt`). Fields `version` and `description` are required. There is NO `id` field in spec — use `task_type` instead. The `prompt_configs[].id` in the arena config must match the `task_type` here.

### Judge Prompt Config (for `llm_judge` assertions)
```yaml
apiVersion: promptkit.altairalabs.ai/v1alpha1
kind: PromptConfig
metadata:
  name: <judge-name>
spec:
  task_type: <judge-task-type>
  version: "1.0.0"
  description: "<description>"
  system_template: |
    You are an impartial judge. Respond with JSON {"passed":bool,"score":number,"reasoning":string}.

    CRITERIA:
    {{criteria}}

    CONVERSATION:
    {{conversation}}

    RESPONSE:
    {{response}}
  variables:
    - name: criteria
      required: true
      description: Evaluation criteria
    - name: conversation
      required: false
      description: Full conversation transcript
    - name: response
      required: true
      description: Assistant response being evaluated
```

**CRITICAL**: Judge prompts MUST include `{{criteria}}`, `{{conversation}}`, and `{{response}}` template variables.

### Scenario (`scenarios/<name>.scenario.yaml`)
```yaml
apiVersion: promptkit.altairalabs.ai/v1alpha1
kind: Scenario
metadata:
  name: <name>
spec:
  id: "<scenario-id>"
  task_type: <task-type>          # must match a prompt_configs[].id
  description: "<description>"
  turns:
    - role: user
      content: "<user message>"
      assertions:
        - type: <assertion-type>
          params: { ... }
          message: "<failure message>"
```

### Self-Play Turns
```yaml
turns:
  - role: user
    content: "Initial message to seed the conversation"
  - role: gemini-user            # self-play provider role
    persona: curious-learner     # optional persona name
    turns: 4                     # number of self-play turns
    assertions:
      - type: content_matches
        params:
          pattern: "(?i)relevant-topic"
```

Self-play requires `self_play` config in the arena config:
```yaml
spec:
  self_play:
    enabled: true
    roles:
      - id: gemini-user
        provider: <provider-id>
```

### LLM Judge Assertions

Arena config needs judges:
```yaml
spec:
  judges:
    - name: <judge-name>
      provider: <judge-provider-id>
  judge_defaults:
    prompt: <judge-prompt-task-type>
```

Judge provider needs its own provider config in `group: judge`:
```yaml
providers:
  - file: providers/assistant.provider.yaml
    group: default
  - file: providers/judge.provider.yaml
    group: judge
```

Scenario usage:
```yaml
assertions:
  - type: llm_judge
    params:
      criteria: |
        Evaluation criteria here.
      judge: <judge-name>
      min_score: 0.7
    message: "Quality check"

conversation_assertions:
  - type: llm_judge_conversation
    params:
      judge: <judge-name>
      criteria: |
        Overall conversation quality criteria.
      min_score: 0.7
    message: "Overall quality"
```

### Trials (statistical repetition)
```yaml
spec:
  trials: 5
  turns:
    - role: user
      content: "..."
      assertions:
        - type: min_length
          params:
            min: 50
          pass_threshold: 0.8    # pass in 80% of trials
```

### Tool Config (`tools/<name>.tool.yaml`)
```yaml
apiVersion: promptkit.altairalabs.ai/v1alpha1
kind: Tool
metadata:
  name: <tool-name>
spec:
  name: <tool-name>
  description: "<description>"
  mode: mock
  timeout_ms: 2000
  input_schema:
    type: object
    properties:
      param1:
        type: string
        description: "<description>"
    required: ["param1"]
  output_schema:
    type: object
    properties:
      result:
        type: string
  mock_result:
    result: "static response"
```

## Common Assertion Types

| Type | Params | Use for |
|------|--------|---------|
| `content_matches` | `pattern`, `message` | Regex on response |
| `content_includes` | `patterns` (list) | Response contains strings |
| `content_excludes` | `patterns` (list) | Response must NOT contain |
| `min_length` | `min` | Minimum response length |
| `llm_judge` | `criteria`, `judge`, `min_score` | Quality scoring per turn |
| `llm_judge_conversation` | `criteria`, `judge`, `min_score` | Quality scoring for full conversation |
| `tools_called` | `tool_names` (list) | Verify tool usage |
| `cost_budget` | `max_cost_usd` or `max_total_tokens` | Cost/token limits |
| `is_valid_json` | `allow_wrapped`, `extract_json` | JSON response validation |

## Directory Structure

```
examples/<name>/
  config.arena.yaml
  providers/
    <name>.provider.yaml
  prompts/
    <name>.yaml
  scenarios/
    <name>.scenario.yaml
  tools/                    # optional
    <name>.tool.yaml
  personas/                 # optional
    <name>.persona.yaml
  mock-responses.yaml       # optional, for mock providers
  README.md
```

## Validation

After generating all files, ALWAYS validate:

```bash
make build-arena
env PROMPTKIT_SCHEMA_SOURCE=local ./bin/promptarena run \
  --config examples/<name>/config.arena.yaml \
  --mock-provider --ci --formats json
```

Fix any schema validation errors and retry until it passes config loading. Note that `--mock-provider` only replaces the assistant provider — judge assertions will fail without API keys, which is expected.
arena-example | SkillHub