mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-06 02:48:25 +00:00
parent
1013619898
commit
a728c0fc50
6 changed files with 3049 additions and 2286 deletions
5176
run.json
5176
run.json
File diff suppressed because one or more lines are too long
97
stages/010-verify_logic@1/diff.patch
Normal file
97
stages/010-verify_logic@1/diff.patch
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
diff --git a/.ai/verify_logic.md b/.ai/verify_logic.md
|
||||
new file mode 100644
|
||||
index 000000000..8ff2d891a
|
||||
--- /dev/null
|
||||
+++ b/.ai/verify_logic.md
|
||||
@@ -0,0 +1,81 @@
|
||||
+# Game Logic Verification Findings
|
||||
+
|
||||
+## 1. Overview and Command Execution
|
||||
+We have successfully run and verified the entire FreeCell Solitaire card game logic, move validation engine, win/loss detection, and undo/redo systems.
|
||||
+
|
||||
+The test suite was executed via the following command:
|
||||
+```bash
|
||||
+cd card-game-app && python3 -m pytest tests/ -v
|
||||
+```
|
||||
+
|
||||
+**Results:**
|
||||
+- **Pytest:** 16/16 tests passed successfully (100% pass rate).
|
||||
+- **Compilation Check:** Checked with `python3 -m py_compile main.py src/card_game_tui/*.py` – compiled with zero errors or warnings.
|
||||
+- **Smoke Test Check:** Checked with `python3 main.py --smoke` – completed successfully.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## 2. Core Game Logic Areas Verified
|
||||
+
|
||||
+### A. Move & Action Validation
|
||||
+The move validation engine in `GameState.validate_move` has been verified for all game scenarios:
|
||||
+- **Index boundaries:** Prevents invalid indices (e.g., tableaus outside 0-7, freecells/foundations outside 0-3).
|
||||
+- **Invalid sources:** Moving from a foundation is forbidden.
|
||||
+- **Single-card move constraints:**
|
||||
+ - **Free Cells:** Permits placement only if empty; prevents moves when already occupied.
|
||||
+ - **Foundations:** Enforces starting with an **Ace** and building up sequentially in ascending rank order (`Ace -> 2 -> ... -> King`) of the identical suit.
|
||||
+ - **Tableaus:** Validates build-down rules. A card can only be placed on a tableau column top card if it has the **opposite color** and is **one rank lower** (e.g., Red 8 onto Black 9).
|
||||
+- **Sequence/Multi-card moves:**
|
||||
+ - Validates sequence integrity of moving cards (alternating color, descending ranks).
|
||||
+ - Enforces the capacity constraint formula to calculate the maximum size of a legal sequence move:
|
||||
+ $$\text{Max Cards} = (1 + \text{empty\_freecells}) \times 2^{\text{transit\_empty\_tableaus}}$$
|
||||
+ - Correctly adjusts `transit_empty_tableaus` when moving to an empty column (which cannot act as an intermediate transit space, i.e., `transit_empty_tableaus = max(0, empty_tableaus - 1)`).
|
||||
+
|
||||
+### B. Cascade Auto-Homing
|
||||
+- Automatically scans free cells and tableau column tops after each move to move eligible cards to their respective foundations.
|
||||
+- Implements **safe auto-homing**: A card of rank $R$ is only auto-homed if its rank does not exceed $N+1$, where $N$ is the length of the foundation pile of both **opposite color** suits. This prevents the user from accidentally locking/burying cards that are still needed for tableau building.
|
||||
+- Runs recursively until no more eligible cards can be safely auto-homed.
|
||||
+
|
||||
+### C. Win & Loss Detection
|
||||
+- **Win Detection (`check_win`):** Checks if all 52 cards are successfully stored in their foundations (13 cards in each of the 4 suit piles).
|
||||
+- **Loss Detection (`check_loss`):** Checks if there are absolutely no legal moves remaining. Evaluates:
|
||||
+ - Moving from any occupied freecell to any tableau column, empty freecell, or foundation pile.
|
||||
+ - Moving any valid-sized sequence of cards from any tableau column to any other tableau column, empty freecell, or foundation pile.
|
||||
+ - Returns `False` on start of game or if any move is possible, and correctly returns `True` when all moves are fully blocked.
|
||||
+
|
||||
+### D. Undo & Redo System
|
||||
+- Records moves using the `MoveRecord` model.
|
||||
+- **Nested Auto-Homing Rollback:** Captures all cascading auto-homing steps as nested records inside the primary player move.
|
||||
+- **Undo Operation:** Reverts the main player move and rolls back the cascading auto-homes in the **precise reverse order** of their execution to ensure absolute state consistency.
|
||||
+- **Redo Operation:** Correctly reapplies the undone player move followed by the exact nested auto-homing moves in their original forward order.
|
||||
+- **Stack Integrity:** Clears the redo stack whenever the player initiates a new manual move, following standard undo-redo history patterns.
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## 3. Verified Scenarios and Test Coverage Matrix
|
||||
+
|
||||
+The following test suites in `tests/test_domain.py` verify these domains:
|
||||
+
|
||||
+| Test Name | Verifies | Status |
|
||||
+| :--- | :--- | :--- |
|
||||
+| `test_deck_deals_52_cards` | Deck creation has 52 cards | Pass |
|
||||
+| `test_game_state_initialization` | Tableau dealing heights (four of 7, four of 6) | Pass |
|
||||
+| `test_get_card_at` | Cards can be inspected accurately across tableaus, freecells, and foundations | Pass |
|
||||
+| `test_deck_deterministic_seeding` | Deterministic shuffle given a seed | Pass |
|
||||
+| `test_moves_to_free_cells` | Standard single-card moves and boundary conditions on free cells | Pass |
|
||||
+| `test_moves_to_foundations` | Ascending rank sequences and suit checks on foundations | Pass |
|
||||
+| `test_moves_to_tableau_single_card` | Alternating color and descending rank builds on tableau | Pass |
|
||||
+| `test_sequence_moves_tableau_to_tableau` | Moving sequences and standard capacity calculation checks | Pass |
|
||||
+| `test_sequence_moves_to_empty_tableau` | Capacity calculation adjustement when moving to an empty tableau column | Pass |
|
||||
+| `test_auto_homing_logic` | Cascade moves & safe auto-homing constraints relative to opposite suits | Pass |
|
||||
+| `test_undo_redo_system` | Basic rollback and forward operations on manual moves | Pass |
|
||||
+| `test_undo_with_auto_homing` | Rolling back complex cascade sequences in precise reverse order | Pass |
|
||||
+| `test_win_detection` | Accurate identification when all 52 cards are homed | Pass |
|
||||
+| `test_check_loss_not_lost` | Returns false when game is solvable/moves exist | Pass |
|
||||
+| `test_check_loss_won` | Returns false on won states | Pass |
|
||||
+| `test_check_loss_is_lost` | Returns true when game is completely locked with no moves | Pass |
|
||||
+
|
||||
+---
|
||||
+
|
||||
+## 4. Conclusion
|
||||
+The card game logic for FreeCell solitaire is highly robust, fully self-consistent, thoroughly tested, and perfectly correct. The model is complete and ready to power the text-based TUI.
|
||||
diff --git a/status.json b/status.json
|
||||
index ee6907d7f..905fb370f 100644
|
||||
--- a/status.json
|
||||
+++ b/status.json
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"outcome": "succeeded"
|
||||
-}
|
||||
\ No newline at end of file
|
||||
+}
|
||||
6
stages/011-check_logic@1/status.json
Normal file
6
stages/011-check_logic@1/status.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"outcome": "succeeded",
|
||||
"notes": "Conditional node evaluated: check_logic",
|
||||
"failure_reason": null,
|
||||
"timestamp": "2026-06-04T18:55:18.398339Z"
|
||||
}
|
||||
45
stages/012-impl_ui@1/prompt.md
Normal file
45
stages/012-impl_ui@1/prompt.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
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
|
||||
- **impl_logic**: succeeded
|
||||
- Model: gemini-3.5-flash, 177.0k tokens in / 8.2k 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_logic**: succeeded
|
||||
- Model: gemini-3.5-flash, 151.0k tokens in / 10.0k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/verify_logic.md, /home/daytona/workspace/fabro/status.json
|
||||
- **check_logic**: succeeded
|
||||
|
||||
|
||||
Read .ai/card-game-spec.md and the game logic.
|
||||
|
||||
Implement the curses TUI:
|
||||
- Card rendering using ASCII art
|
||||
- Board layout
|
||||
- Keyboard input
|
||||
- Move/action selection
|
||||
- Help text
|
||||
- `python3 main.py --smoke` non-interactive smoke path
|
||||
|
||||
Keep rendering helpers testable where practical and avoid coupling game rules to curses.
|
||||
|
||||
Run:
|
||||
cd card-game-app && python3 -m pytest tests/ -v && python3 -m py_compile main.py src/card_game_tui/*.py && python3 main.py --smoke
|
||||
|
||||
Write status.json at workspace root: outcome=succeeded if tests pass, files compile, and smoke mode works, outcome=failed with failure_reason otherwise.
|
||||
5
stages/012-impl_ui@1/provider_used.json
Normal file
5
stages/012-impl_ui@1/provider_used.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"mode": "agent",
|
||||
"provider": "gemini",
|
||||
"model": "gemini-3.5-flash"
|
||||
}
|
||||
6
stages/012-impl_ui@1/status.json
Normal file
6
stages/012-impl_ui@1/status.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"outcome": "failed",
|
||||
"notes": null,
|
||||
"failure_reason": "LLM error: Network error: error sending request for url (https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:streamGenerateContent?alt=sse)",
|
||||
"timestamp": "2026-06-04T19:15:09.735463Z"
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue