Complete lesson text and action cards
Source-owned text for offline reading and retrieval. Command success still requires actual local evidence.
Choose the item and collection limits
Write a one-line search brief: item category, maximum distance, transport constraints, acceptable condition and available pickup times. Do not treat “free” as zero transport cost.
Expected: The brief contains a category, radius, transport plan and a clear rejection rule.
Set up the practice folder
Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder.
Expected: Python reports version 3.10 or newer and the terminal is in the extracted resource folder.
windows
python --version
Get-Location
Get-ChildItem
macos
python3 --version
pwd
ls
linux
python3 --version
pwd
ls
Inspect the listing contract
Open listings.csv. Map each header to a permitted marketplace export or your manually collected public listings. Keep the original listing URL and observation time. The example.com rows are synthetic. Verify platform terms before adding any live collection adapter.
Expected: Every row has id, title, price, distance_km, URL, UTC observation time and status.
Filter the supplied listings
Run the finder on listings.csv with a 5 km limit. Open matches.json and locate the source URL for each match.
Expected: FINDER PASS reports 1 match and 0 rejected rows; matches.json contains only chair-1.
windows
python finder.py listings.csv --max-km 5 --out matches.json
macos
python3 finder.py listings.csv --max-km 5 --out matches.json
linux
python3 finder.py listings.csv --max-km 5 --out matches.json
Audit the rejected candidates
Compare all five CSV rows with the result. Record the reason each excluded row failed: duplicate, nonzero price, distance, or collected status. Use listing ID as the stable deduplication key.
Expected: The audit explains why the chair duplicate, desk, lamp and sofa do not appear.
Prove a bad row is visible
Copy listings.csv to listings-bad.csv and add a row with price “free” rather than numeric zero. Run the finder on that copy and inspect rejected in the output. Then record how you will recheck stale availability before contacting anyone.
Expected: The malformed row is reported as rejected; existing valid matches still appear; availability will be checked manually.
windows
python finder.py listings-bad.csv --max-km 5 --out bad-report.json
macos
python3 finder.py listings-bad.csv --max-km 5 --out bad-report.json
linux
python3 finder.py listings-bad.csv --max-km 5 --out bad-report.json
Prepare a pickup review
Choose one match, fill pickup-checklist.md, and draft a short message that asks whether it is available and when/where to collect. Review the source listing yourself. Do not send through an agent as part of this exercise.
Expected: One shortlist item has a source, recent availability check, transport plan and reviewed draft.
Repeat the workflow on a new list
Replace the sample rows with at least three permitted listings or newly invented test cases. Include one qualifying free item and one explicit rejection. Run the filter, inspect the source URLs and record the decisions.
Expected: FINDER PASS produces the expected shortlist, with no duplicate IDs and explained rejections.
windows
python finder.py listings.csv --max-km 5 --out matches.json
macos
python3 finder.py listings.csv --max-km 5 --out matches.json
linux
python3 finder.py listings.csv --max-km 5 --out matches.json
Write a repeatable onboarding checklist
Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project.
Expected: The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.
Demonstrate the variable-path limit safely
Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text.
Expected: GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.
windows
python workspace_guard.py --self-test
macos
python3 workspace_guard.py --self-test
linux
python3 workspace_guard.py --self-test
Verify the actual protection in your tool
For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; the BBB working reference is linked in Sources. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. Grok Bot has no proven local shell guard here: use project-only tasks and reviewed actions, with backups.
Expected: A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.
Enable a real backup of memory and project files
Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials.
Expected: A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.
windows
.\profile-backup.ps1 -Destination D:\Backups\llm-profiles
macos
bash profile-backup.sh /Volumes/YourBackup/llm-profiles
linux
bash profile-backup.sh /media/YourBackup/llm-profiles
Practice a hash-verified restore
Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile.
Expected: RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.
windows
python restore_drill.py --backup-root D:\Backups\bbb-practice --work-root practice
macos
python3 restore_drill.py --backup-root /Volumes/YourBackup/bbb-practice --work-root practice
linux
python3 restore_drill.py --backup-root /media/YourBackup/bbb-practice --work-root practice