10:00

VCS = Version Control System
Original domain: software development
Git = The most popular VCS
Our domain: data analysis & agentic workflows

git in a terminal


A project folder that
tracks its own history
Example: course website: https://github.com/emse-madd-gwu/2026-Fall
A labeled save point — “this is a state worth remembering”
Send / recieve your commits up to GitHub
(the cloud copy)
Changes (locally on your computer) → Commit (with a message) → Push
stuffupdateasdffixed itAdd flights bar chartFix airline join dropping NAsClean column names in importA message is a note to future you
A .gitignore file lists what git should pretend it can’t see.
_site/, *_files/).DS_Store, .Rhistory.qmd, .RREADME.md, CLAUDE.md.gitignore itselfIgnored files still live on your computer — they just never get pushed.
Checkpoint
You already ran the solo loop in HW1 — let’s make sure it stuck.
madd-practice repo is thereMissing it, or joined the class late?
Flag me now — grab the steps from HW1 or this 2-min walkthrough

Make your own local copy
of someone else’s repo
Someone they’ve given write access
so your pushes land in their repo
Add each other as collaborators and you both work on the same main.
Pull → Changes → Commit → Push
One new step at the front: pull before you start.
Different files, or different parts of a file → git merges them for you.
Same lines, both changed → git stops and asks which one do you want?
That’s a merge conflict, and you fix it by editing the file.
Pull often. Commit small. Tell each other what you’re working on.
A branch is a sandbox copy of main. You work there, then open a pull request to merge it back. Big teams live this way. We’ll stay on main all semester — but this is the picture you’ll see everywhere.

Your turn
Team up and both commit to the same repo
madd-practice repo on GitHub.com:README.md in Positron → Commit to main → Push10:00
This class lives on the agent side.

Claude Code is the agent. You supply the project and the direction.

Other agents:
Google’s open-source terminal agent
OpenAI’s coding agent (CLI + cloud)
claude and press Enter
Direct the agent to build a multi-page Quarto website about someone you admire (a scientist, athlete, artist, etc.)
my-website like you did in the HW (include a README file). Make it public (not private), and publish it to GitHub.claude in terminal.index.html file in the _site folder.10:00
_site to docs (edit _quarto.yml’s output-dir), then re-render.main, Folder: /docs → Save.
Make a plan before doing big work.
read-only
Approve or deny each edit.
safe but slow
Auto-applies file edits.
semi engagement
Approves EVERYTHING.
full file access, use with care
Press shift + tab to cycle through them
The current mode always shows at the bottom of the prompt box
plan → manual → accept edits → auto
less freedom, more supervision more freedom, less supervision
Give more autonomy to Claude when
you have a very clear step-by-step plan
Five you’ll reach for constantly:
/init · /model · /effort · /clear · /compact
CLAUDE.md: standing instructionsProject CLAUDE.md
rules for this repo, shared with anyone who clones it
Home ~/.claude/CLAUDE.md
rules for everything you do, on your machine only
/init — let the agent write CLAUDE.md for youYou don’t write CLAUDE.md from scratch.
When you run /init, Claude:
README, config files, existing codeCLAUDE.md in the project root/init actually producesA short file, roughly:
/init is a draft, not gospelClaude is guessing from what it can see. It gets things wrong.
theme_minimal_hgrid()”/init only after big changes/model — pick the right brain for the job| Model | Good for |
|---|---|
| Opus | Hard reasoning, tricky bugs, big refactors |
| Sonnet | Everyday work — fast, capable, cheaper |
| Haiku | Quick, simple, high-volume tasks |
/model switches anytime. Bigger isn’t always better.
Match the model to the task.
/effort — how hard the model thinksSame model, different amount of thinking before it acts.
| Level | What it’s for |
|---|---|
low |
Simple, mechanical edits — fastest, cheapest |
medium |
Everyday work |
high |
Multi-step tasks, debugging, design decisions |
xhigh |
Genuinely hard problems — slowest, most expensive |
/effort auto returns to your model’s default.
/model vs. /effort/model
Which brain.
Changes the underlying capability — reasoning ability, speed, cost per token.
/effort
How long it thinks.
Same brain, more deliberation before it starts editing files.
General rules of thumb:
A token is a chunk of text — roughly ¾ of a word.
Everything the agent does is paid for in tokens.
Reasoning before it acts
Every file it reads, every command it runs
Everything it writes back to you
The clock starts at your first message, then resets.
the one you’ll actually hit
A weekly cap sitting on top of the 5-hour one.
the safety net
Run out mid-assignment and you wait
Every message re-sends the whole conversation, not just your last line.
Room to think
healthy
Slower and pricier
trim it soon
Hard stop at 100%
start fresh
Two consequences: a tiny question pays for the whole history,
and you should start fresh early, not at 99%.
The agent’s chattiness is billed too — so tell it to be terse.
The 🪨 Caveman plugin does exactly that:
“why use many token when few do trick”
“The reason your React component is re-rendering is likely because you’re creating a new object reference on each render cycle. When you pass an inline object as a prop, React’s shallow comparison sees it as a different object every time, which triggers a re-render. I’d recommend using useMemo to memoize the object.”
69 tokens
“New object ref each render. Inline object prop = new ref = re-render. Wrap in useMemo.”
19 tokens
65% saved on prose 8.5% on real coding runs accuracy unchanged
/clear vs. /compact — managing memory/clear
Wipe the slate.
/compact
Summarize and continue.
Go back to your my-website repo
/init — then open the CLAUDE.md it wrote and read it. Is it right? Fix anything wrong, and add one rule of your own./model and /effort to see your options./effort low./effort high. Read the plan before you approve it./compact, then keep going — it should still know what you’re building./clear, then ask “what am I working on?” — see what it lost, and what CLAUDE.md saved.10:00
/init, /clear, /effort, etc. are built in with Claude Code
A skill is a slash command you define that teaches the agent one of your recipes.
~/.claude/skills/.claude/skills/ in a repo)/skill-name/my-chart-style/my-chart-styleSame request — “mean departure delay by airline, as a bar chart” :
Without the skill

With the skill

cowplot package minimal theme (gridlines matched to the plot)Learn the conventions once → encode them in a skill
Your turn
See the difference a skill makes
my-chart-style skill from today’s class folder into .claude/skills/ in your project (create the folder if it doesn’t exist)flights.csv data./my-chart-style.10:00
They won’t say “I’m not sure”
Fast ≠ Better
Throughput goes up, but quality is not guaranteed


library(tidyverse)
library(rnaturalearth)
library(sf)
funding <- read_csv("data/africa-funding.csv")
africa <- ne_countries(continent = "Africa", returnclass = "sf")
stopifnot(all(funding$name %in% africa$name))
funded <- africa |>
inner_join(funding, by = "name") |>
mutate(
lon = st_coordinates(st_point_on_surface(geometry))[, "X"],
lat = st_coordinates(st_point_on_surface(geometry))[, "Y"]
)
ggplot(africa) +
geom_sf(fill = "grey90", color = "white", linewidth = 0.2) +
geom_sf(data = funded, fill = "#00798c", color = "white") +
geom_segment(
data = funded, color = "#2e4057",
aes(lon, lat, xend = lon + dx, yend = lat + dy)
) +
geom_text(
data = funded, color = "#2e4057", size = 5, lineheight = 0.9,
family = "Fira Sans Condensed",
aes(
lon + dx, lat + dy, hjust = ifelse(dx > 0, -0.05, 1.05),
label = paste0(name, "\n$", amount, "M")
)
) +
coord_sf(xlim = c(-38, 66), ylim = c(-36, 38)) +
theme_void()
data.csv → script.R → figure.png
AI can do the first three. Verifying the output is still yours.
input/ scripts/ output/ layoutBut running isn’t the same as right.
You are still the gatekeeper for the results.
Don’t ask the agent if it’s right — it’ll say yes.
Check it a way it can’t fake:
Codebook, prior paper,
official table
Back-of-envelope,
done by you
Different chat, different
prompt, different model
Run these every time — they’re the skill this whole course is really about:
NA handling, inner vs. left join)?Two checks passed silently. One caught something real.
Make fake data with the same shape, and work on that instead.
The agent never sees the real data. The script still works on it.
charlatan: fake data in RAlso emails, addresses, colors, coordinates, credit cards, etc.
faker charlatan is an R port of this package — same idea, either language
github.com/joke2k/faker
Your turn
Which airline should you avoid?
The code will run. The chart will look great. The answer may be wrong.
flights.csv to airlines.csv for the names — and chart it15:00
Alaska ranks worst, but
only has 20 flights.
Mesa: 10. Hawaiian: 11.
These are tiny samples
SkyWest flew once
but it was cancelled.
mean() returned NaN, so it dropped off the chart silently.
na.rm = TRUE deletes every cancelled flight.
Endeavor cancelled 7.3% — none of those count as “late.”
Every one of these is invisible in the chart and invisible in the code.
You only find them if you go looking.
prompt → read the diff → verify → commit / push
/init, /model, /effort, /clear, /compact, CLAUDE.md, skills, and modes