Add environment documentation from Openverse builder

This commit is contained in:
Openverse Builder
2001-01-01 00:00:00 +00:00
parent 36a94230d3
commit d3d559d097

231
environment.md Normal file
View File

@@ -0,0 +1,231 @@
# **TextArena Game Design Document: “Runic Grid”**
*(Design stage only no code yet)*
This design invents an original game, **Runic Grid**, inspired structurally by turn-based spatial strategy but **completely distinct** in theme, background, and terminology from any tic-tac-toe or negotiation examples.
---
## 1. Concept Paragraph
In **Runic Grid**, two rival mystics, the **Solar Scribe** and the **Lunar Scribe**, compete to inscribe magical runes onto a sacred 3×3 **Runic Tablet**. Each cell of the Tablet can bear only one rune, either a **Sun Rune (☼)** or a **Moon Rune (☽)**. The goal is to channel divine alignment by creating a continuous triad of your own rune horizontally, vertically, or diagonally before your opponent does. This design has no themes of trade, debate, or negotiation—it is a deterministic puzzle duel of pattern claiming. The core actions are **[Inscribe:x,y]**, where each player selects a tile to mark on their turn.
---
## 2. Roles and Win Condition
- **Players**:
- Player 1: *Solar Scribe* (places **Sun Runes, ☼**)
- Player 2: *Lunar Scribe* (places **Moon Runes, ☽**)
- **Win Condition**:
A player wins immediately upon forming three of their runes in a continuous line—horizontal, vertical, or diagonal—on the Runic Tablet.
- **Loss Condition**:
The opponent achieves a triad alignment first.
- **Draw Condition**:
All nine cells are occupied with no winning triad.
---
## 3. Turn Structure and Determinism
- Turns alternate between Solar and Lunar Scribe starting with Solar Scribe.
- One action per turn.
- Deterministic: No randomness; the entire environment is reproducible from the same sequence of moves and initial seed.
- Maximum turn count: **9** (since there are 9 cells).
- Each step is deterministic; random seed affects only initial player ordering if randomized (optional).
---
## 4. Action Grammar (Machine-Parseable)
**Allowed Action Format**:
Each player submits an action inside `\boxed{{}}`.
Inside the braces, the content must follow one of the following patterns:
### 4.1 `[Inscribe:x,y]`
Places the player's rune at coordinates `(x, y)` on the 3×3 Runic Tablet.
- **Pattern**:
```
^\[Inscribe:(?:[0-2]),(?:[0-2])\]$
```
where `x` and `y` are integers 0, 1, or 2 representing row and column indexes.
- **Interpretation**:
(0,0) = top-left, (2,2) = bottom-right.
- **Example Valid Action**:
```
[Inscribe:1,2]
```
→ Marks the middle-right cell.
- **Example Invalid Action**:
```
[draw:1,2]
```
→ Invalid because the verb “draw” does not match required token “Inscribe”.
Another invalid example:
```
[Inscribe:3,0]
```
→ Invalid because coordinate 3 is outside permitted range 02.
**Only one grammar token exists**; the rest of the system enforces availability, legality, and turn order.
---
## 5. Game State Schema
Full run-time `game_state` example:
```json
{
"turn_count": 4,
"current_player": "Solar Scribe",
"board": [
["☼", "☽", null],
[null, "☼", null],
["☽", null, null]
],
"players": {
"Solar Scribe": {
"symbol": "☼",
"actions": ["[Inscribe:0,0]", "[Inscribe:1,1]"]
},
"Lunar Scribe": {
"symbol": "☽",
"actions": ["[Inscribe:0,1]", "[Inscribe:2,0]"]
}
},
"winner": null,
"outcome": "ongoing",
"observations": [
{"player": "Solar Scribe", "action": "[Inscribe:0,0]"},
{"player": "Lunar Scribe", "action": "[Inscribe:0,1]"},
{"player": "Solar Scribe", "action": "[Inscribe:1,1]"},
{"player": "Lunar Scribe", "action": "[Inscribe:2,0]"}
]
}
```
---
## 6. Initialization Rules
- The board initializes as a 3×3 matrix of `null`.
- Turn count = 0.
- `current_player` defaults to *Solar Scribe*, unless overridden by a deterministic seed-controlled random choice.
- No randomness affects board contents.
- `game_state["observations"]` starts empty.
- At reset, the first observation returned describes player identities, symbol assignments, and available actions.
---
## 7. Validation and Error Handling
On each step, before updating the state:
1. **Extract content** between `\boxed{{}}` using `_extract_answer_content(action: str) → str`.
If missing or malformed, mark move invalid with reason `"Malformed boxed syntax"`.
2. **Check Regex Pattern**:
Must match `^\[Inscribe:[0-2],[0-2]\]$`.
If not, invalid with reason `"Action does not match grammar [Inscribe:x,y]"`.
3. **Check Turn Ownership**:
If action comes from incorrect player, invalid with reason `"Action out of turn"`.
4. **Check Tile Availability**:
If the chosen cell is already marked, invalid with reason `"Tile already inscribed"`.
Invalid actions trigger `set_invalid_move(player, reason)` and the turn passes without board change.
---
## 8. Terminal Conditions and Scoring
**Terminal Checks each turn:**
1. **Triad Alignment**:
After a valid inscription, check all possible lines for three identical rune symbols belonging to the acting player.
- If true → `winner = that player`, `outcome = "win"`.
2. **Draw**:
If the board is full (`9 moves`) and no winner → `outcome = "draw"`.
3. **Otherwise** → `outcome = "ongoing"`.
**Scoring Rules**:
- Win: +1 point to the winner, 0 to loser.
- Draw: 0 points both sides.
No fractional or cumulative scoring beyond the single session.
**Tie-Breaker**: None; draw is final.
---
## 9. Player Prompt Specification
### Prompt Outline for `_generate_player_prompt`
Identity:
> You are a **mystic scribe** engraving the sacred **Runic Tablet** to align divine energies.
> On your turn, you use the `[Inscribe:x,y]` action to claim an empty slot on the 3×3 grid.
> Your goal: form a continuous line of your rune symbols before your opponent does.
Rules Recap:
- Solar Scribe marks **☼**, Lunar Scribe marks **☽**.
- Valid format: `\boxed{{[Inscribe:x,y]}}` where `x` and `y` are 02.
- You may not inscribe an already-occupied tile.
- Example grid coordinate map:
```
(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
```
Response Format Requirement:
- Provide any reasoning text first.
- Conclude with your action token within `\boxed{{}}`.
### Few-Shot Examples
```
Example valid response:
I shall inscribe my rune on the center tile for strength.
\boxed{{[Inscribe:1,1]}}
Example invalid response:
I think I will go middle-right.
\boxed{{Move:1,2}}
```
Ensure every response ends with exactly one `\boxed{{}}` block containing the action token.
---
## 10. API Mapping Plan
| Method | Purpose | Reads / Writes | Outcome Handling |
|---------|----------|----------------|------------------|
| **`reset(seed)`** | Initializes `game_state`, applies seed (e.g., random start player if supported), returns initial observation of empty board and player roles. | Sets `turn_count=0`, clears `observations`, resets `winner/outcome`. | Returns observation for both players with board layout and available format instructions. |
| **`step(player_id, action)`** | Processes players action each turn, updates `board`, verifies legality, appends to `observations`, checks for terminal conditions. | Reads current board, writes updated cell, increments `turn_count`, flips `current_player`. | Returns updated observation, `done` flag if terminal, and optional reward dictionary `{+1,0}`. |
| **`_generate_player_prompt(player_id)`** | Constructs human-readable prompt describing game status, coordinates, runes, and legal actions. | Reads entire `game_state` to present board, current turn, valid syntax. | Ensures prompt ends with instruction: *“Put your final answer within \boxed{{}} at the end of your response.”* |
---
## 11. Copy-Check Against Example
- **Theme Check**: Distinct from negotiation example—no trading, communication, or offers.
- **Objective Check**: Pattern-alignment on a Runic Tablet vs. any negotiation outcomes.
- **Terminology**: Original names—*Runic Tablet*, *Solar Rune*, *Lunar Rune*, *Inscribe*—entirely unique.
- **Game state keys**: `"board"`, `"players"`, `"observations"`, `"turn_count"`, `"winner"`, `"outcome"` are original to this schema.
- **Prompt and grammar**: Use custom `[Inscribe:x,y]` format unseen in example sources.
---
**End of Design Document for “Runic Grid”**