mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-06 02:48:25 +00:00
parent
ee07a49cac
commit
916c46b57a
6 changed files with 1278 additions and 274 deletions
65
stages/007-verify_data@1/diff.patch
Normal file
65
stages/007-verify_data@1/diff.patch
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
diff --git a/.ai/verify_data.md b/.ai/verify_data.md
|
||||
new file mode 100644
|
||||
index 000000000..aa6dfcaf0
|
||||
--- /dev/null
|
||||
+++ b/.ai/verify_data.md
|
||||
@@ -0,0 +1,59 @@
|
||||
+# Data Structures and Core Game State Verification Findings
|
||||
+
|
||||
+## 1. Overview and Command Execution
|
||||
+We verified the core card game data structures, domain model classes, and test suite. The compilation and automated test run executed successfully:
|
||||
+
|
||||
+```bash
|
||||
+cd card-game-app && python3 -m pytest tests/ -v && python3 -m py_compile main.py src/card_game_tui/*.py
|
||||
+```
|
||||
+
|
||||
+**Results:**
|
||||
+- **Pytest:** 13/13 tests passed successfully.
|
||||
+- **Python Compilation:** All files compiled cleanly without syntax or import errors.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## 2. Core Game-State Types Defined
|
||||
+
|
||||
+The following models and enum types are defined in `src/card_game_tui/domain.py`:
|
||||
+
|
||||
+### Enums
|
||||
+- **`Suit`**: Enum representing the four suits: `HEARTS` ("H"), `DIAMONDS` ("D"), `CLUBS` ("C"), and `SPADES` ("S"). Includes color classification (`RED` or `BLACK`) and UTF-8 symbols (`♥`, `♦`, `♣`, `♠`).
|
||||
+- **`Rank`**: Enum representing ranks `ACE` (1) to `KING` (13) with appropriate alphanumeric labels (`A`, `J`, `Q`, `K`, or numeric string).
|
||||
+- **`LocationType`**: Enum classifying board areas: `TABLEAU`, `FREECELL`, and `FOUNDATION`.
|
||||
+
|
||||
+### Core Data Classes & Entities
|
||||
+- **`Card`**: Frozen dataclass containing `suit` and `rank`, with custom representation `[Rank][Suit]` (e.g., `A♥`, `10♠`).
|
||||
+- **`Position`**: Frozen dataclass packaging `LocationType` and `index` for explicit target and source identification during gameplay.
|
||||
+- **`MoveRecord`**: Stores move history containing `from_pos`, `to_pos`, moving cards list (`cards`), and a list of nested, cascaded `auto_moves` resulting from auto-homing.
|
||||
+- **`Deck`**: Builds a standard 52-card deck, supports deterministic random seeding, and deals cards into the 8 Tableau columns (four columns of 7 cards, four columns of 6 cards).
|
||||
+- **`GameState`**: Main orchestrator of the board. Holds state for:
|
||||
+ - 8 Tableau columns
|
||||
+ - 4 Free cells
|
||||
+ - Foundations mapped by Suit
|
||||
+ - Undo/Redo history stacks
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## 3. Basic & Advanced Operations Verified
|
||||
+
|
||||
+### Move Validation and Rules Execution
|
||||
+- **Single Card Moves:** Correctly validates moving a card to free cells (if empty) and to foundations (Aces first, then sequential cards of the matching suit).
|
||||
+- **Tableau Placement rules:** Strictly enforces alternating colors and descending ranks (e.g., moving a Red 8 onto a Black 9).
|
||||
+- **Sequence/Multi-Card Moves:** Computes valid transit capacities based on the exact FreeCell Solitaire formula:
|
||||
+ $$\text{Max Cards} = (1 + \text{empty\_freecells}) \times 2^{\text{transit\_empty\_tableaus}}$$
|
||||
+ Tested and verified that moves exceeding this threshold or violating sequential alternating order are rejected.
|
||||
+
|
||||
+### Cascade Auto-Homing
|
||||
+- Safely moves cards to foundations automatically after a successful player move.
|
||||
+- Avoids preemptive/unsafe auto-homing: a card is only auto-homed if its rank does not exceed $N+1$, where $N$ is the rank of the highest cards of the *opposite* color already placed in foundations. This prevents burying cards that might still be needed as Tableau anchors.
|
||||
+- Cascades until no further eligible cards can be home-bound.
|
||||
+
|
||||
+### Command History (Undo / Redo)
|
||||
+- Seamlessly reverts and reapplies moves.
|
||||
+- Accurately tracks nested auto-homed moves so that undoing a player's move rolls back the cascading auto-homing moves in precise reverse order.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## 4. Conclusion
|
||||
+The data model is fully complete, mathematically sound, robustly tested, and perfectly ready for consumption by the TUI layer.
|
||||
6
stages/008-check_data@1/status.json
Normal file
6
stages/008-check_data@1/status.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"outcome": "succeeded",
|
||||
"notes": "Conditional node evaluated: check_data",
|
||||
"failure_reason": null,
|
||||
"timestamp": "2026-06-04T18:51:24.388447Z"
|
||||
}
|
||||
37
stages/009-impl_logic@1/prompt.md
Normal file
37
stages/009-impl_logic@1/prompt.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
Goal: Build a terminal-based FreeCell solitaire game in Python
|
||||
|
||||
## Completed stages
|
||||
- **expand_spec**: succeeded
|
||||
- Model: gemini-3.5-flash, 85.9k tokens in / 8.3k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/card-game-spec.md, /home/daytona/workspace/fabro/status.json
|
||||
- **impl_setup**: succeeded
|
||||
- Model: gemini-3.5-flash, 144.1k tokens in / 6.8k out
|
||||
- Files: /home/daytona/workspace/fabro/card-game-app/README.md, /home/daytona/workspace/fabro/card-game-app/main.py, /home/daytona/workspace/fabro/card-game-app/pyproject.toml, /home/daytona/workspace/fabro/card-game-app/src/card_game_tui/__init__.py, /home/daytona/workspace/fabro/card-game-app/src/card_game_tui/domain.py, /home/daytona/workspace/fabro/card-game-app/src/card_game_tui/tui.py, /home/daytona/workspace/fabro/card-game-app/tests/__init__.py, /home/daytona/workspace/fabro/card-game-app/tests/test_domain.py, /home/daytona/workspace/fabro/status.json
|
||||
- **verify_setup**: succeeded
|
||||
- Model: gemini-3.5-flash, 185.9k tokens in / 2.2k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/verify_setup.md, /home/daytona/workspace/fabro/status.json
|
||||
- **check_setup**: succeeded
|
||||
- **impl_data**: succeeded
|
||||
- Model: gemini-3.5-flash, 179.9k tokens in / 32.0k out
|
||||
- Files: /home/daytona/workspace/fabro/card-game-app/src/card_game_tui/domain.py, /home/daytona/workspace/fabro/card-game-app/tests/test_domain.py, /home/daytona/workspace/fabro/status.json
|
||||
- **verify_data**: succeeded
|
||||
- Model: gemini-3.5-flash, 140.2k tokens in / 3.2k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/verify_data.md, /home/daytona/workspace/fabro/status.json
|
||||
- **check_data**: succeeded
|
||||
|
||||
|
||||
Read .ai/card-game-spec.md and the current card-game-app implementation.
|
||||
|
||||
Implement the requested card game's rules:
|
||||
- Initial setup/deal where applicable
|
||||
- Move/action validation
|
||||
- Auto-complete or helper actions where applicable
|
||||
- Win/loss condition
|
||||
- Undo
|
||||
|
||||
Add tests for legal actions, illegal actions, win/loss detection, and edge cases.
|
||||
|
||||
Run:
|
||||
cd card-game-app && python3 -m pytest tests/ -v
|
||||
|
||||
Write status.json at workspace root: outcome=succeeded if all tests pass and rules are implemented, outcome=failed with failure_reason otherwise.
|
||||
5
stages/009-impl_logic@1/provider_used.json
Normal file
5
stages/009-impl_logic@1/provider_used.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"mode": "agent",
|
||||
"provider": "gemini",
|
||||
"model": "gemini-3.5-flash"
|
||||
}
|
||||
12
stages/009-impl_logic@1/response.md
Normal file
12
stages/009-impl_logic@1/response.md
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
I have successfully completed the tasks:
|
||||
|
||||
1. **Reviewed Specifications & Game Rules:** Read `.ai/card-game-spec.md` and verified the domain models (`Card`, `Deck`, `LocationType`, `Position`, `MoveRecord`, and `GameState`).
|
||||
2. **Implemented/Enhanced Game Rules:**
|
||||
- **Initial setup/deal:** Fully handled inside `Deck` and `GameState` constructor, dealing 52 unique cards deterministically.
|
||||
- **Move/action validation:** Fully covered for tableau, free cell, and foundation moves, including proper transit and capacity calculations based on empty free cells/tableaus.
|
||||
- **Auto-complete helper actions:** Standard auto-homing behavior is implemented, moving eligible cards to foundations automatically and cleanly nesting them in `MoveRecord` so they are fully undoable/redoable.
|
||||
- **Win/loss condition:** Implemented and tested both `check_win()` and `check_loss()`. `check_loss()` correctly detects when the game has no legal moves remaining and is not yet won.
|
||||
- **Undo/Redo:** Reverts and reapplies both the primary action and any nested auto-homing steps.
|
||||
3. **Tests:** Added comprehensive test cases to `tests/test_domain.py` to cover `check_loss` under various conditions (not lost, won, and fully locked/lost).
|
||||
4. **Validation:** Ran all tests with `pytest` successfully, and confirmed that the `--smoke` test successfully initializes and validates the game.
|
||||
5. **Status File:** Wrote `status.json` with `"outcome": "succeeded"`.
|
||||
Loading…
Add table
Reference in a new issue