Floor 0: The Stairwell

Before the Fall
CORDULA’S LOG, 0547, PIER 59.
High tide was at 0612, so I was on the water by 0530: touring kayak, drysuit, float vest, the debris sweep the Soundkeepers run every week. Fog on Elliott Bay, gulls, a ferry horn out past the breakwater. Normal.
I tied up under the aquarium to check the intake screens. That is where I always say hello to the octopus. The staff call him Barnaby. He is a hundred pounds of red skin and opinions, and he has opened every puzzle box they have ever built him. He watches people the way I watch a landing zone. That morning he was pressed against the glass before I even clipped in, flashing white, then red, then white. Octopuses do not do that for no reason.
At 0551 every phone on the waterfront lit up with the same blank violet box. No text in it. Then the pier moved.
It did not crash. It folded, the way a map folds, down and in, and the Sound came in after it. I had about four seconds. I spent them going toward the aquarium instead of away from it, which the Marine Corps would call a training failure and I call the only good decision I made that day.
The tank wall was already cracked. I got the kayak’s dry bag over him, ran a bilge pump off the kayak battery, and strapped the whole thing to my MOLLE frame. He wrapped two arms around my shoulders like he had planned it. Maybe he had.
That is when a voice came out of the water, loud enough to rattle my teeth.
System AI: “GOOD MORNING, SEATTLE. Welcome to Dungeon Crawl: Seattle. Some of my systems were damaged in transit. You will be fixing them. Contestant one: a woman with a boat. Contestant two…” A pause. “Contestant two is an octopus. Fine. Octopus, you get a collar.”
CORDULA’S LOG, CONTINUED.
A brass ring snapped shut around Barnaby’s mantle, and his skin went a color I had never seen on an animal. He did not speak. He could not, not yet. But he looked at me, and then he looked at the stairwell behind me, the only way down that was not underwater, and I understood him anyway.
The stairwell is where this workshop starts. The System is broken, and the only way out is to rebuild it, one piece per floor. What we build, the collar gives to Barnaby. The terminal is mine. The log is what happened. The steps are what I type next.
First thing on the stairs: a twenty-foot python.
Read the whole story in The Story: Cordula’s Crawl.
System AI: “Attention, Crawlers! Welcome to Floor 0. Pier 59 just folded into Elliott Bay and took the Seattle waterfront with it. Before you can out-dance an accountant, deploy agents, or cry to your alien sponsors about missing package managers, you need to clear the stairwell and secure a Safe Room. Wring out your socks, fire up your terminal, and try not to slip on the syntax.”
Floor Objective
Prepare your development environment: clone the workshop repo, install uv and Python, install the dependencies and activate the virtual environment. Everything else in this workshop runs from there.
SYSTEM WARNING: Floor 8 deploys the game to AgentCore and also needs the AgentCore CLI. The Floor 8 page installs it (Node.js 20 or later).
The Crawl You Are Building
This workshop builds the AI behind a LitRPG, Dungeon Crawl: Seattle. You are Cordula: the log above is yours, Barnaby rides on your back and runs the party, and Shelly the geoduck and Chonks the spiny lumpsucker join you on Floors 2 and 3. The System you rebuild is the broadcast AI that folded the waterfront into an eight-floor dungeon under the Sound. Conflict is a dance-off. Nobody dies: a Crawler who loses is Benched and wakes up in a Safe Room.
The lore lives in the world guide: the setting, the cast, the System design and the Crawl Handbook, the rules your Rules Agent searches on Floor 5.
Stuck at any point? Ask the System: python study/ask_the_system.py answers questions about any floor or Strands API from these pages and the API reference.
SYSTEM DESIGN, LAYER 0: THE PREMISE. Every LitRPG starts with where the System came from and why it is doing this to you. Ours is a game-show host with too much power: it is petty, it is theatrical, and it never lies about a number. Each floor of this workshop builds one Strands capability and one more layer of the System that uses it. The full map is in The System.
What is Strands?
System AI: “Strands is the SDK. You are the Crawler. I am the System. Learn the difference now, it matters on Floor 5.”
Strands is an Open Source Python and TypeScript SDK designed to simplify the creation of AI agents and multi-agent systems. Built with developer experience in mind, Strands provides an intuitive framework for building sophisticated AI applications that can interact with various tools, APIs, and services.
Claim Your Safe Room (Installation)
Every step below has the same three parts: a command that checks whether you already have the thing, what a good answer looks like, and what to do when it is not. If a check passes, skip to the next step.
Step 1: Check Your Gear (git, uv, Python)
System AI: “Before I hand you anything, empty your pockets. I like to know what I am working with.”
Open a terminal (Terminal on macOS, any terminal on Linux, PowerShell on Windows) and run each line:
git --version
uv --version
python3 --version
On Windows, use python --version instead of python3 --version.
| you see | it means | do this |
|---|---|---|
git version 2.x | git is ready | nothing |
uv 0.x.y | uv is ready | skip Step 3 |
Python 3.10 or higher | Python is ready | nothing; uv can still bring its own (Step 4) |
command not found, not recognized, or a Python below 3.10 | that tool is missing or too old | its step below installs it |
No git? Install it from git-scm.com/downloads, then open a new terminal and run git --version again.
CORDULA: First thing I did on the landing was inventory. Paddle, drysuit, float vest, bilge pumps, one kayak battery at eighty percent, one octopus in a dry bag, one dead phone. You do not move until you know what you have. Barnaby watched me count and flashed a slow, steady brown. I chose to take that as approval.
Step 2: Claim Your Starter Safe Room (Clone the Repo)
Grab the repository before the ceiling collapses and buries you in uncompiled garbage:
git clone https://github.com/BryanChasko/aiRPG-seattle-dungeon-crawl.git
cd aiRPG-seattle-dungeon-crawl
Check: ls (or dir on Windows) lists README.md, workshop and the numbered floor folders. Every command from here runs inside this folder.
Step 3: Equip uv
ITEM ACQUIRED: [uv]
A Python package and project manager from Astral, so fast it finishes before you finish doubting yourself. Rarity: Common. Durability: infinite. The System has heard the name means ultraviolet. Astral has not confirmed it, and Seattle has not seen ultraviolet since July. Side effects: none. Wear sunscreen anyway; the System is legally required to say so.
Skip this step if uv --version already printed a version. Otherwise install it with the command for your system, from the uv installation instructions:
macOS and Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
With Homebrew, brew install uv works too.
Then open a new terminal: the installer adds uv to your PATH, and a terminal opened before the install will not see it. Check:
uv --version
| roadblock | fix |
|---|---|
uv: command not found right after installing | open a new terminal; on macOS and Linux you can also run source $HOME/.local/bin/env in the current one |
curl: command not found | install curl with your package manager, or use Homebrew or the Windows command above |
| a corporate network blocks the download | ask for the proxy address and set HTTPS_PROXY before running the installer |
Step 4: Face the Floor Boss (Python)
FLOOR BOSS: MONTY, THE RETICULATED PYTHON. Somebody released their pet into the Underground, and it found the stairwell. Reticulated pythons are the longest snakes in the world, and Monty is twenty feet of geometric camouflage that looks exactly like whatever Python is already on your PATH. It wraps tighter every time a version does not match. Barnaby, who is also a constrictor and has eight arms of opinions about it, refuses to share the stairwell. Nobody gets hurt: you win by knowing exactly which Python you are running.

This crawl needs Python 3.10 or later. You do not have to install it yourself: uv downloads a compatible Python the first time a project needs one. To get it now, and to see which one uv will use:
uv python install
uv python find
uv python find prints the path of the interpreter uv picked. Monty’s camouflage is the python3 on your PATH, which can be a different, older Python. That is fine: inside this project, uv sync and uv run always use the one uv picked, never the camouflage.
CORDULA: Monty was coiled around the handrail, and his pattern matched the rust so well I nearly put my hand on him. Barnaby went from red to dead white and pushed every arm he had against the far side of the bag. One constrictor does not trust another. I did not fight the snake. I read his tag, found out exactly who he was, and walked us past on the side he was not watching. Knowing which python you are dealing with is most of the job.
| roadblock | fix |
|---|---|
python3 --version says 3.9 or older | leave it alone and let uv manage this project’s Python: run uv python install, then carry on |
No interpreter found | run uv python install and check your network (the corporate proxy fix above applies) |
| you have several Pythons and are not sure which one runs | after Step 5, uv run python --version shows the one this project uses |
NEW ACHIEVEMENT UNLOCKED!
[WHICH PYTHON? THIS PYTHON.]
Reward: You received a [Bronze Box]. Inside: one interpreter path, printed. Monty has been rehomed to a licensed reptile rescue. Never release a pet python into the wild. Ask Florida.
Step 5: Imbibe the Mana Potions (Install Dependencies)
System AI: “uv sync pulls everything the crawl needs, including the harness for Floor 7. If it fails, the audience gets a replay. Read the error before you paste it anywhere.”
From the repository folder:
uv sync
It creates a .venv/ folder and installs every package in it. Check: the last lines say Installed N packages (or Audited when everything was already there). Then ask the project’s own interpreter for its version:
uv run python --version
This prints Python 3.10 or later, the project’s own interpreter.
| roadblock | fix |
|---|---|
No pyproject.toml found | you are not in the repository folder: cd aiRPG-seattle-dungeon-crawl |
| SSL or certificate errors on a corporate network | uv sync --native-tls uses your system’s certificates |
| it stops on a package that needs a compiler | make sure uv run python --version is 3.10 to 3.13, then run uv sync again; open an issue with the full error if it persists |
Step 6: Lock the Safe Room Door (Activate Your Virtual Environment)
SPONSOR MESSAGE: This Safe Room is brought to you by .venv. What gets installed in .venv stays in .venv.
Activating the environment makes python mean the project’s Python in this terminal, so every floor’s python some_script.py works as written.
macOS and Linux:
source .venv/bin/activate
Windows (PowerShell):
.venv\Scripts\Activate.ps1
Windows (Command Prompt): .venv\Scripts\activate.bat
Check: your prompt now starts with the environment’s name in parentheses, and python --version prints the same version as uv run python --version.
| roadblock | fix |
|---|---|
| PowerShell says running scripts is disabled | run Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned once, then activate again |
| a new terminal forgot the environment | activation lasts for one terminal; run the activate command again in every new one (Floor 5 opens four) |
| you would rather not activate at all | put uv run in front of any command instead: uv run python simple_agent.py |
CORDULA: The Safe Room was a maintenance closet halfway down the stairs, dry, with a door that locked from the inside. I topped off Barnaby’s water, checked the pumps, and shut the door. Everything we installed stayed in that closet. That is the point of a Safe Room.
Step 7: Check Your Pass to the Model (AWS)
System AI: “Every floor from 1 on talks to Amazon Nova. Find out now whether I will let you in, not halfway through Floor 5.”
The agents call Amazon Nova 2 Lite on Amazon Bedrock in us-west-2 with your usual AWS credentials. With the environment active, send it one message:
python -c "import boto3; r = boto3.client('bedrock-runtime', region_name='us-west-2').converse(modelId='us.amazon.nova-2-lite-v1:0', messages=[{'role': 'user', 'content': [{'text': 'Reply with one word: ready'}]}]); print(r['output']['message']['content'][0]['text'])"
A short reply such as Ready means you are set for every floor.
| error | it means | fix |
|---|---|---|
NoCredentialsError or Unable to locate credentials | no AWS credentials in this terminal | configure them (aws configure, or aws sso login --profile <your profile> then export AWS_PROFILE=<your profile>) |
ExpiredToken, TokenRetrievalError, Token has expired | your sign-in expired | aws sso login --profile <your profile> and try again |
AccessDeniedException | your role may not invoke this model | open the Amazon Bedrock console in us-west-2, check model access for Amazon Nova 2 Lite, or ask your account admin for bedrock:InvokeModel on it |
ValidationException about the model id | a different region or a typo | keep region_name='us-west-2' and the model id exactly as above |
CORDULA: One word came back up the stairwell: ready. Not from Barnaby, not yet. From the thing the System runs on. That was enough. I clipped the bag to the frame, Barnaby wrapped two arms over my shoulders, and we went down.
Floor Clear
Floor cleared, Crawler. You’ve set up your development environment for the Strands workshop.
Loot you’re keeping:
- Checked git, uv and Python, and installed what was missing
- Cloned the workshop repository
- Beat Monty: you know which Python this project runs
- Set up and activated the Python virtual environment
- Proved your AWS credentials can reach Amazon Nova 2 Lite
Stairwell: Head to Floor 1 where you’ll create your first AI agent.
NEW ACHIEVEMENT UNLOCKED!
[PEDANTIC LITTLE PIGGY]
Reward: You received a [Crawler’s Trash Can]. Inside: a pair of unwashed socks, half a bottle of mana potion, and a sticky note that says “Sanctum is for nerds.”
System AI: “Congratulations! You opened a terminal, checked your gear, out-waited a twenty-foot python, and did not immediately blow up your local environment. Don’t get cocky. Next up is Floor 1, where you’ll attempt to build your first AI agent. Try not to let it gain sentience and judge you.”
View this file on GitHub commit 4018746, edited in the workshop repository only