Complete lesson text and action cards
Source-owned text for offline reading and retrieval. Command success still requires actual local evidence.
Create an objective property profile
Open subject.json. Set area, bedrooms, bathrooms, square feet and currency for a practice property. Use property attributes only; do not collect protected characteristics or screen tenants.
Expected: The subject file contains numeric beds/baths/size, one area and a currency.
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 comparable listings
Open comps.csv and verify the source URL, observation time, currency, size and rent for every row. Use permitted exports/manual observations. Keep asking rents distinct from completed lease rents; note concessions, utilities and fees separately.
Expected: The sample has complete objective attributes and traceable sources; no private tenant data is present.
Run the comparable filter
Run rental_comps.py using subject.json. Open rental-report.json and inspect the included IDs.
Expected: COMPS PASS reports 3 comparable properties and median 2000.0; normalized reference is 2000.0 USD.
windows
python rental_comps.py comps.csv --subject subject.json --out rental-report.json
macos
python3 rental_comps.py comps.csv --subject subject.json --out rental-report.json
linux
python3 rental_comps.py comps.csv --subject subject.json --out rental-report.json
Check sample size and normalization
For each included property divide monthly asking rent by square feet. Compare the median of these ratios with the median asking rent. Write why a three-property synthetic sample cannot establish market value.
Expected: The calculations explain 2.0 USD/sqft and a size-normalized 2000.0 reference for 1000 sqft; limitations are recorded.
Prove the filter respects property criteria
Copy subject.json to subject-empty.json and choose an area absent from the CSV. Rerun. Then add one malformed sqft value to a copy of comps.csv. Record the zero-sample result and the rejected-row reason.
Expected: The absent area yields sample_size 0 with no fabricated median; malformed rows are explicitly rejected.
windows
python rental_comps.py comps.csv --subject subject-empty.json --out empty-report.json
macos
python3 rental_comps.py comps.csv --subject subject-empty.json --out empty-report.json
linux
python3 rental_comps.py comps.csv --subject subject-empty.json --out empty-report.json
Prepare one source-linked lead
Fill lead-review.md for one included property. Record objective facts, observed time, concessions and the next manual action. Keep the report separate from tenant decisions.
Expected: One reviewed lead has the original URL, dated facts, fees/assumptions and a draft next action.
Deliver the final comparison
Use a permitted sample of your own or create at least four clearly synthetic property cases. Include a duplicate and one non-comparable. Run the report and explain every included/excluded ID, sample size and median.
Expected: COMPS PASS and a source-linked report are reproducible, with honest limits and no duplicate IDs.
windows
python rental_comps.py comps.csv --subject subject.json --out rental-report.json
macos
python3 rental_comps.py comps.csv --subject subject.json --out rental-report.json
linux
python3 rental_comps.py comps.csv --subject subject.json --out rental-report.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