mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-07 03:00:29 +00:00
parent
83a52bd963
commit
6074fbdf55
6 changed files with 1296 additions and 253 deletions
90
stages/007-verify_data@1/diff.patch
Normal file
90
stages/007-verify_data@1/diff.patch
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
diff --git a/.ai/verify_data.md b/.ai/verify_data.md
|
||||
new file mode 100644
|
||||
index 000000000..ef093ff11
|
||||
--- /dev/null
|
||||
+++ b/.ai/verify_data.md
|
||||
@@ -0,0 +1,84 @@
|
||||
+# Solitaire Data Structures Verification
|
||||
+
|
||||
+This document verifies the core solitaire data structures (`Card`, `Deck`, `Pile` abstractions, and `GameState`) and the initial dealing logic of the terminal-based Klondike solitaire game.
|
||||
+
|
||||
+## Verification Checklist
|
||||
+
|
||||
+- [x] **Card structure implementation & tests** (color, suite, rank, visibility, label, string formatting, and display representation).
|
||||
+- [x] **Deck structure implementation & tests** (52-card standard deck creation, drawing logic, shuffling with/without random seeds).
|
||||
+- [x] **Pile abstractions implementation & tests** (`StockPile`, `WastePile`, `FoundationPile`, `TableauPile` inheriting from `Pile` list-class, supporting `top_card` property access).
|
||||
+- [x] **Initial GameState & Deal logic & tests** (tableau column sizes 1-7, top card face-up, other cards face-down, remaining 24 cards in Stock face-down, empty waste, empty foundations).
|
||||
+- [x] **Syntax and compilation validation** (compilation via `py_compile` is successful).
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## Test Execution Results
|
||||
+
|
||||
+We executed the unit tests using the virtual environment's `pytest` interpreter:
|
||||
+
|
||||
+```bash
|
||||
+cd solitaire-app && .venv/bin/pytest tests/ -v
|
||||
+```
|
||||
+
|
||||
+**Output:**
|
||||
+```
|
||||
+============================= test session starts ==============================
|
||||
+platform linux -- Python 3.12.3, pytest-9.0.3, pluggy-1.6.0
|
||||
+rootdir: /home/daytona/repos/fabro-sh/fabro/solitaire-app
|
||||
+configfile: pyproject.toml
|
||||
+collected 10 items
|
||||
+
|
||||
+tests/test_game.py .......... [100%]
|
||||
+
|
||||
+============================== 10 passed in 0.02s ==============================
|
||||
+```
|
||||
+
|
||||
+All 10 test cases covering basic data structures, card properties, pile interactions, initial deal counts/visibility, moves, undo/redo state preservation, and win condition checking passed flawlessly.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## Code Compilation Validation
|
||||
+
|
||||
+We compiled the Python files using `py_compile`:
|
||||
+
|
||||
+```bash
|
||||
+cd solitaire-app && .venv/bin/python -m py_compile main.py src/solitaire_tui/*.py
|
||||
+```
|
||||
+
|
||||
+**Output:**
|
||||
+The command completed with exit code `0` and no compilation errors, confirming all source files are free of syntax issues.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## Analysis of Test Coverage
|
||||
+
|
||||
+### 1. Card Data Structure
|
||||
+- **Verified via `test_card_color_and_helpers`**:
|
||||
+ - `Card.color` returns "red" for Hearts ('H') and Diamonds ('D'), "black" for Spades ('S') and Clubs ('C').
|
||||
+ - `Card.is_red` behaves correctly.
|
||||
+ - `Card.display_str()` prints correct suit unicode character (e.g., `♥`, `♦`, `♣`, `♠`) or rank string when face up, and `##` when face down.
|
||||
+ - `Card.__repr__` returns expected debug brackets representation like `[A♥]` or `[##]`.
|
||||
+
|
||||
+### 2. Deck Logic
|
||||
+- **Verified via `test_deck_creation_and_shuffling`**:
|
||||
+ - Initializes standard 52-card deck face-down.
|
||||
+ - Shuffles correctly with consistent seeding for test reproducibility.
|
||||
+ - Draws from the end of the list properly.
|
||||
+
|
||||
+### 3. Pile Handling
|
||||
+- **Verified via `test_pile_abstractions` & `test_draw_and_recycle`**:
|
||||
+ - Custom pile sub-classes (`StockPile`, `WastePile`, `FoundationPile`, `TableauPile`) inherit list behavior.
|
||||
+ - `top_card` returns the correct top element or `None` if empty.
|
||||
+ - Drawing and recycling between Stock and Waste are fully tested.
|
||||
+
|
||||
+### 4. Game State & Deal Setup
|
||||
+- **Verified via `test_initial_deal`**:
|
||||
+ - Sets up the 7 tableau columns with increasing sizes (1 to 7 cards).
|
||||
+ - Correctly sets face-up/face-down visibilities in columns.
|
||||
+ - Places exactly 24 cards in the stock and leaves the waste and foundations empty.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## Conclusion
|
||||
+
|
||||
+The core Solitaire logic data structures are well-designed, extremely robust, syntactically correct, and fully covered by automated testing.
|
||||
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:24:27.330394Z"
|
||||
}
|
||||
40
stages/009-impl_logic@1/prompt.md
Normal file
40
stages/009-impl_logic@1/prompt.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
Goal: Build a terminal-based Klondike solitaire game in Python with a curses TUI
|
||||
|
||||
## Completed stages
|
||||
- **expand_spec**: succeeded
|
||||
- Model: gemini-3.5-flash, 140.8k tokens in / 24.8k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/solitaire-spec.md, /home/daytona/workspace/fabro/solitaire-app/game.py, /home/daytona/workspace/fabro/solitaire-app/main.py, /home/daytona/workspace/fabro/solitaire-app/test_game.py, /home/daytona/workspace/fabro/solitaire-app/ui.py, /home/daytona/workspace/fabro/status.json
|
||||
- **impl_setup**: succeeded
|
||||
- Model: gemini-3.5-flash, 148.0k tokens in / 18.3k out
|
||||
- Files: /home/daytona/workspace/fabro/solitaire-app/README.md, /home/daytona/workspace/fabro/solitaire-app/main.py, /home/daytona/workspace/fabro/solitaire-app/pyproject.toml, /home/daytona/workspace/fabro/solitaire-app/src/solitaire_tui/__init__.py, /home/daytona/workspace/fabro/solitaire-app/src/solitaire_tui/game.py, /home/daytona/workspace/fabro/solitaire-app/src/solitaire_tui/ui.py, /home/daytona/workspace/fabro/solitaire-app/tests/__init__.py, /home/daytona/workspace/fabro/solitaire-app/tests/test_game.py, /home/daytona/workspace/fabro/status.json
|
||||
- **verify_setup**: succeeded
|
||||
- Model: gemini-3.5-flash, 154.6k 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, 218.9k tokens in / 18.1k out
|
||||
- Files: /home/daytona/workspace/fabro/solitaire-app/src/solitaire_tui/game.py, /home/daytona/workspace/fabro/solitaire-app/tests/test_game.py, /home/daytona/workspace/fabro/status.json
|
||||
- **verify_data**: succeeded
|
||||
- Model: gemini-3.5-flash, 92.2k tokens in / 3.7k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/verify_data.md, /home/daytona/workspace/fabro/status.json
|
||||
- **check_data**: succeeded
|
||||
|
||||
|
||||
Read .ai/solitaire-spec.md and the current solitaire-app implementation.
|
||||
|
||||
Implement complete draw-one Klondike game logic:
|
||||
- Legal moves from waste/tableau to tableau
|
||||
- Legal moves to foundation
|
||||
- Moving face-up tableau runs
|
||||
- Flipping newly exposed tableau cards
|
||||
- Drawing from stock to waste
|
||||
- Recycling waste into stock when stock is empty
|
||||
- Undo for player actions
|
||||
- Win detection when all foundations are complete
|
||||
|
||||
Add tests for legal moves, illegal moves, deal invariants, stock/waste behavior, undo, and win detection.
|
||||
|
||||
Run:
|
||||
cd solitaire-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"
|
||||
}
|
||||
15
stages/009-impl_logic@1/response.md
Normal file
15
stages/009-impl_logic@1/response.md
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
I have successfully completed all the requirements for the **Draw-One Klondike solitaire game logic**!
|
||||
|
||||
### Key Accomplishments:
|
||||
1. **Rule Engine Enhancements (`game.py`)**:
|
||||
- Strengthened validation for moving single/multiple cards on the Tableau to make sure they are completely face-up, alternating in color, and descending in rank.
|
||||
- Guarded moves from the Waste to the Tableau/Foundation and from the Foundation to the Tableau to ensure they respect the destination column's face-up constraints.
|
||||
- Refined and verified proper recycling of waste back into the Stock while maintaining the original draw order.
|
||||
2. **Comprehensive Test Coverage (`test_game.py`)**:
|
||||
- Added exhaustive tests for all transition paths: `waste-to-tableau`, `waste-to-foundation`, `tableau-to-foundation`, `foundation-to-tableau`.
|
||||
- Covered illegal transitions (e.g. invalid colors, incorrect rank sequencing, attempts to move cards onto face-down destinations).
|
||||
- Added scenarios for validating whole stack moves (runs) on the Tableau, verifying automatic flipping of face-down cards when newly exposed.
|
||||
3. **Execution & Validation**:
|
||||
- Ran `python3 -m pytest tests/ -v` and verified that all 15 unit tests pass successfully.
|
||||
- Ran `python3 main.py --smoke` and confirmed the smoke tests exit successfully with code `0`.
|
||||
- Updated `status.json` with `"outcome": "succeeded"`.
|
||||
Loading…
Add table
Reference in a new issue