vibe · evening 1 of 4 · eight workstreams
From intern to expert in one evening, with wine. FY26 H2 · Confidential
Type your name plainly.
Dear Chief of Staff. Welcome to your greenfield, cloud-agnostic, future-proof Innovation Campus. As of today the only asset on the balance sheet is Rolinda's Hospitality Hub, which is admittedly best in class. Over one evening of high-bandwidth synchronous co-creation, one workstream per hour, we will stand up eight strategic capabilities, unlock eight OKRs, operationalise a repeatable AI delivery framework and drive end-to-end, top-to-bottom value realisation at scale. On the final slide, and I cannot stress this enough, we will align on a go-live date.
Tom is your Site Reliability Engineer, Executive Sponsor, and single-threaded owner of this initiative. Rolinda is Head of Hospitality Operations (Beverages) and, per the RACI, the only stakeholder empowered to speak like a person. On the subject of wine, however, she is insufferable, and the evening is paired accordingly, beginning with a Chardonnay from Bourgogne die, in her words, lekker arrogant aan de wang hangt en goed tegen de huig galoppeert.
This is Evening 1 of a four-evening campaign. The other three islands (history and how the models work, from vibes to determinism, terminal and git) are one World button away, and real people from the field stand on them: Karpathy, LeCun, Hinton, Fei-Fei Li, Sutton, Amodei, Olah, Cherny, Wu, Hashimoto, Torvalds. Talk to them or walk past; your choices become your path in the vault. Built for a MacBook with Apple silicon and Chrome.
Walk to a signposted plot to open a workstream. Tap the ground to move. Each workstream carries a full lesson with commands, so this also works as the manual afterwards. Start with Pre-flight in the Roadmap if Claude Code is not installed yet.
vibe-mapok one file · no CDN · works offline
Up and down to move, Enter to open, Escape to close.
Select a workstream below, or walk to its plot. Dependencies are strictly sequential, as ratified by the Steering Committee.
Loading the sources...
The game and the terminal companion share one progress code. In the repo: uv run vibe export prints a code to paste here; uv run vibe import <code> takes the one from here and writes the vault notes.
Template repo (fork it with "Use this template"): github.com/tpetedb/vibe-map. It ships AGENTS.md, five skills in the Agent Skills standard, a subagent, a hook, the CLI, DuckDB queries and a starter vault. Setup: bash scripts/setup.sh.
Twenty minutes of unglamorous enablement so that the evening has zero blockers, zero dependencies and zero excuses.
Twenty minutes, alone, before the night. Everything here is boring on purpose so the evening itself is not.
Open Terminal (Cmd+Space, type Terminal). Paste this and press Enter. It installs the native build, which updates itself in the background:
curl -fsSL https://claude.ai/install.sh | bash
Then confirm it worked. It should print a version number followed by (Claude Code):
claude --version
Start it once. Your browser opens, you sign in with your Claude account (Pro, Max, Team or Enterprise), and the credentials are stored. You will not be asked again.
claude
Type /exit to leave. If you ever need to switch accounts, type /login inside a session.
git is the save-point system for workstream 4, jq is a tiny helper the hook uses. On a Mac:
xcode-select --install
brew install jq
If brew is not installed, the first line still gives you git; ask Claude to install Homebrew for you on the night, it takes two minutes.
Download from obsidian.md, open it once, close it. Do not create anything yet.
One small game you would enjoy having on your laptop. A card duel, a dungeon room, a scoring board that ranks the team by coffee consumption. Three sentences, in your head.
Source: Claude Code quickstart, Obsidian
Before the first glass is empty we ship a minimum viable product to production. You articulate the north-star vision in a three-sentence elevator pitch. Tom imposes one non-negotiable guardrail: single-file architecture, no third-party dependencies, zero technical debt on day one. Then it exists. Time to value: sub ten minutes. Please update your priors accordingly.
No knowledge transfer takes place this hour. This is intentional. We front-load the quick win, socialise the outcome, and backload the target operating model into subsequent workstreams.
What is it, who plays it, how do you win. Type them here and the prompt you paste into Claude Code is written out below, with Tom's guardrail already attached.
The goal of this hour is one thing: a playable game exists before the first glass, or cup, is empty. We explain almost nothing. That is the design.
You need two things: a terminal, and Claude Code signed in. Pre-flight in the Roadmap installs both in twenty minutes.
Claude Code is not a chat box. You give it a goal in plain language, it reads and writes files in the folder you started it in, runs commands, looks at the result, and keeps going until the goal is met. The folder you start it in is its whole world, so start it in an empty one.
cd ~/vibe-map-*/workspace/game
claude
Build a small browser game as a single file called index.html, no external libraries, no frameworks. The game: [your three sentences]. Keep score. When done, tell me how to open it.
open index.html
Ask for exactly one change, in one sentence, and watch it land. Then leave it alone. The next hour is about why that worked or did not.
Source: Quickstart, How Claude Code works
Two open standards mean your rules are not locked to one vendor. AGENTS.md is a plain Markdown file at the repo root that 30+ coding agents read (Codex, Cursor, Copilot, Gemini CLI, Aider, Zed and more), stewarded by the Linux Foundation's Agentic AI Foundation: agents.md. Claude Code reads CLAUDE.md instead, so the template's CLAUDE.md is one line, @AGENTS.md, plus Claude-only extras: memory docs.
Agent Skills is the open format for skills: a folder with a SKILL.md (name, description, instructions), loaded only when relevant: agentskills.io. The cross-tool folder is .agents/skills/; Claude Code reads .claude/skills/, so the template symlinks one to the other. Community packs you can install into any agent: wshobson/agents.
Do this: open the template's AGENTS.md, change one rule to your taste, and watch Claude follow it next session.
Tom asks you to make the MVP "more impactful". It regresses across every dimension of the scorecard. Then you raise one well-scoped, outcome-oriented change request with explicit in-scope and out-of-scope sections, and it lands first time, on time, on budget. Key learning for the lessons-learned log: the agent has zero line of sight into your mental model. Specificity is not a nice-to-have. Specificity is the deliverable.
Anything you catch yourself repeating gets codified into a skill: a living playbook the agent ingests automatically at every touchpoint, so you stop re-onboarding it session after session. Think of it as a standing operating procedure with executive sign-off.
One component, two change requests. Press either and watch what the agent is free to touch.
Edit freely. This is the standing operating procedure the agent reads at every touchpoint.
This is the hour that separates people who vibe code from people who got lucky once.
It only has what is in the folder and what you typed. "Make it more impactful" is a request it will fulfil according to its own idea of impact. "Add a badge next to the title, keep the colour and the columns, do not touch anything else" has a scope, a keep-list and a do-not-touch list. That is the entire craft.
make it more impactful
Add a purple badge to the main character. Keep all stats and the score exactly as they are. Do not change anything else. Reply with one line describing what you changed.
Every session starts with a blank memory. CLAUDE.md is a plain markdown file in your project folder that Claude reads at the start of every session. It is where you write down what you would otherwise re-explain: build commands, conventions, "always do X" rules. Target under 200 lines, concrete enough to verify. "Keep it one file" beats "keep it simple".
/init
# Rules for this project
- Single file: index.html only, no external libraries
- Readable on a laptop, minimum font size 14px
- Scores are a system of record: never reset or reformat stored scores without asking
- After every change, reply with one line saying what changed
/context
CLAUDE.md is for facts that apply every session. A skill is a folder with a SKILL.md for a repeatable procedure, loaded only when it is relevant or when you type /skill-name. Personal skills live in ~/.claude/skills/ and work in every project.
mkdir -p ~/.claude/skills/add-feature
---
description: Add a feature to the game safely. Use when the user asks to add, change or extend gameplay.
---
When adding a feature:
1. Restate the request in one sentence and list what will NOT change.
2. Make the change in index.html only.
3. Open index.html and check it still loads without console errors.
4. Reply with one line: what changed, and one sentence: what to test.
/add-feature give the enemy a health bar
If you tell Claude "remember that I prefer British spelling", it saves that to its own notes for this project and loads them next time. Run /memory to see and edit everything it has saved. Everything is plain markdown you can delete.
Source: How Claude remembers your project, Skills, Best practices
The template ships workspace/data/scores.csv, three DuckDB queries and one Python script, all tested. DuckDB reads a CSV as a table with no server: duckdb -c "select * from 'workspace/data/scores.csv' order by score desc limit 5". Docs: duckdb.org/docs. Zero-to-SQL in an evening: SQLBolt; analytics-flavoured: Mode SQL tutorial.
Do this, in order: duckdb < workspace/sql/top_runs.sql, then workspace/sql/per_player.sql (group by), then workspace/sql/streaks.sql (window functions, lag()). Then python3 workspace/python/scores.py and read the one new concept explained at the top of the file (a dict comprehension). Then ask Claude: "add a column to scores.csv and update every query that breaks". Python reference: the official tutorial; practice: Exercism, Kaggle Learn.
The MVP pivots to a data-driven, insight-led, metrics-first posture. Every session is persisted to a file, which we will refer to as the enterprise data warehouse for the remainder of the evening. Then we surface actionable insights: top performers, rolling averages, streak analytics, all visualised on a self-serve dashboard. You will observe that the file rapidly becomes the single source of truth and the game a mere presentation layer.
Data requires a fixed location and a governed schema. Relocate the file, rename a column, and downstream dashboards are impacted, incidents are raised, and Tom is paged. This is the precise moment a folder graduates into a platform.
The same rows and the same query. Rename one column and watch every reader of the file go red.
Time to feed the spreadsheet person. The game learns to remember, the data gets a home, and the home turns out to matter more than the game.
A browser page cannot write files to your disk on its own, so the pattern is: the game stores every finished round in the browser (localStorage), and offers an Export button that downloads a CSV. Once that CSV has a fixed name and fixed columns, anything can be built on top of it. Rename one column and everything downstream breaks. That is not a bug, that is what a schema is.
Every time a round ends, save a record to localStorage with exactly these fields: played_at (ISO timestamp), player (string), score (integer), duration_s (integer). Add an "Export CSV" button that downloads all records as scores.csv with those four columns in that order and a header row. Do not change gameplay.
mv ~/Downloads/scores.csv workspace/data/scores.csv
head -1 workspace/data/scores.csv
That header line must read played_at,player,score,duration_s, exactly. It is the same schema the camp's queries and uv run vibe check 3 expect.
Write workspace/python/analyze.py that reads workspace/data/scores.csv, prints number of rounds, mean score, best score, longest streak of improving scores, and saves a bar chart of score per round to chart.png. Use only the Python standard library plus matplotlib. Then run it.
open chart.png
workspace/data/scores.csv to points, run analyze.py again, watch it fail. Rename it back.The game is now a front end. The CSV is the thing. Any spreadsheet, script or chart can read it, and Claude can build the next one in a minute because the shape is known. This is the same idea as a table in a database: the columns are a contract.
uv run vibe check 3 is green.Source: Common workflows
Git, in two bullet points for the executive summary: a commit is a named, immutable, auditable snapshot, and rollback is always on the table. Tonight you ship a change, commit it, deliberately introduce a Sev 1 incident with full customer impact, and execute a controlled rollback within the agreed recovery time objective. Tom, as SRE, will be on call and will visibly age.
Then one hook: an automated control that fires at a defined lifecycle event, for example snapshotting the data warehouse after every edit. A hook is not guidance, a best practice, or a gentle nudge. A hook is enforcement. Compliance will be delighted.
Fear of breaking things is what stops people from experimenting. This hour removes the fear.
git keeps a history of your folder. A commit is a snapshot with a message. You can look at old ones, compare them, and go back. Claude Code makes this conversational, you never have to memorise commands.
initialise git in this folder, add a .gitignore that excludes backups/ and .DS_Store, and commit everything with the message "first playable"
commit my changes with a descriptive message
show me the last 5 commits
discard all uncommitted changes and restore the last commit
Inside a session, Claude Code also keeps its own checkpoints: /rewind takes the files back to an earlier point in the conversation. That is for "the last ten minutes went wrong". git is for "I want this to survive closing the laptop". Use both.
CLAUDE.md is advice. Claude reads it and tries. A hook is a shell command Claude Code runs at a fixed moment in its lifecycle, whether Claude wants to or not. PostToolUse fires after a tool ran, PreToolUse fires before and can block. Hooks live in a settings file, and the /hooks menu shows what is registered.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "mkdir -p backups && cp scores.csv backups/scores-$(date +%Y%m%d-%H%M%S).csv 2>/dev/null || true"
}
]
}
]
}
}
/hooks
Put the folder somewhere other than the laptop: "create a private GitHub repository for this project and push it". Claude will ask you to sign in to GitHub the first time.
Source: Hooks guide, Checkpointing and /rewind, Quickstart: git section
The chat window is not the enterprise perimeter. You integrate one system of record you already operate in, calendar, files or mail, and run a query that only works because of the integration. In Claude Code this is an MCP server. In the app it is a connector. Same underlying capability, different go-to-market. This is the workstream with the highest projected ROI, and the one most likely to quietly transform your Tuesday.
MCP in one sentence for the board pack: an open interoperability standard, so any tool plugs in the same way. Think USB-C, but for cross-functional enablement and ecosystem synergies.
Until now Claude could only see the folder. This hour it reaches your calendar, your files, your mail. This is the part that quietly changes a work week.
The Model Context Protocol is an open standard for giving an AI model tools. An MCP server is a program or a hosted service that exposes tools: search an issue tracker, read a calendar, drive a browser. Claude Code connects to servers; the Claude app calls the same thing connectors. Same idea, different door.
claude mcp add --transport http claude-code-docs https://code.claude.com/docs/mcp
claude mcp list
Use the claude-code-docs server to look up what a PostToolUse hook is
By default the server is local: only you, only this project. Add --scope user to have it in every project, or --scope project to write it to .mcp.json in the folder so anyone who clones the project gets it too. Inside a session, /mcp shows the panel and lets you authenticate or reconnect.
claude mcp add --transport http notion https://mcp.notion.com/mcp
# then inside a session: /mcp → notion → Authenticate
What is on my calendar Thursday? Draft an agenda for the 10:00 as a markdown file called thursday-agenda.md
claude mcp remove claude-code-docs
Source: Connect to MCP servers, MCP reference
The final workstream has, by a distance, the best optics. You open Obsidian, point the agent at the vault, and have it document tonight's learnings, cross-link them, and tag them for discoverability. Then you open the graph view and watch institutional knowledge materialise in real time. Screenshots are encouraged for the all-hands.
Long-term memory is files with links. You own them, they are fully human-readable without any agent in the loop, they are vendor-neutral, and they compound quarter over quarter. This is your knowledge moat.
Below is a working vault: a live graph view of every note from tonight. Drag nodes, tap one to read it, follow the [[links]]. This is what your Obsidian will look like once Claude has written it for you.
The last hour is the prettiest, and the one that gives everything before it a place to live.
An Obsidian vault is a normal folder on disk. Every note is a .md file. A link from one note to another is the text [[Note name]]. The graph view draws a circle per note and a line per link; the more notes point at a note, the bigger it gets. Because it is all plain files, Claude can read and write the vault directly, and you can read it without any AI at all.
cd ~/vibe-vault && claude
Create CLAUDE.md with these rules: every note is markdown; link related notes with [[wikilinks]]; each note starts with a one-line summary; project notes live in Projects/, people in People/, tools in Tools/.
Create Projects/Vibe Code Camp game.md summarising what we built tonight (single-file game, scores.csv schema, git, hooks). Create Tools/Claude Code.md, Tools/CLAUDE.md and skills.md, Tools/Hooks.md, Tools/MCP.md, Tools/Obsidian.md, each with a short explanation in my words and a "how to" section. Create People/Tom.md and People/Rolinda.md. Link everything that is related with [[wikilinks]] and make sure every note links to at least two others.
Next week, when Lotte builds the meeting-note tool, she starts Claude Code in the vault, and it can read Tools/Hooks.md to remember how she likes hooks written. Every project adds notes, every note adds links, the graph grows. Nothing is locked in: it is a folder of text files she owns. Put the vault in git too, and ignore the .obsidian folder.
Source: Obsidian: graph view, Obsidian: internal links, Obsidian: manage vaults
The MVP has lived on one laptop all evening. That is a single point of failure and, frankly, a governance risk. This workstream takes it public: the folder goes to GitHub, GitHub Pages serves it, and the game gets a URL you can send to anyone. Time to market: fifteen minutes, including the Roquefort.
Concept. A remote is a copy of your [[Git]] history on someone else's computer. GitHub Pages is a static host that serves the files in a repository as a website, which is exactly what a single-file game is. No server, no build step, no ops. Claude Code can do every step of this from the terminal.
brew install gh
gh auth login
create a public GitHub repo called vibe from this folder and push it
enable GitHub Pages for this repo from the main branch, root folder, and tell me the URL
gh browse
Docs: GitHub Pages quickstart · gh repo create · Claude Code common workflows (git)
Everything so far needed you at the keyboard. The final workstream removes you from the loop: Claude runs headless, on a schedule, does one job, and writes the result into your vault. This is the SRE hour. Tom is visibly moved.
Concept. claude -p "prompt" runs Claude Code without the interactive session: it takes the prompt, does the work in the folder, prints the result and exits. Put that in a scheduled job and you have an agent that runs while you sleep. A subagent is a second Claude the first one delegates to, with its own instructions, useful for a job you want done the same way every time.
claude -p "read workspace/data/scores.csv and append a one-paragraph summary of tonight's best runs to vault/Camp/Scores.md"
create a subagent called scorekeeper that only does that job, and document it in the vault
claude -p with --output-format text.schedule the scorekeeper to run every morning at 08:00 with launchd
launchctl list | grep scorekeeper
Docs: Run Claude Code programmatically (headless) · Subagents · CLI reference
Eight OKRs unlocked, eight capabilities stood up, zero Sev 1s outstanding, the campus is fully operational and the Steering Committee has been briefed. The only open action item on the tracker is the go-live date. Tom has the following availability, subject to change control.
Three things, in order, each one evening or less.
Tom is available for one panicked message per week. Rolinda is available for wine.
Supporting documentation, runbooks and enablement material for any workstreams deferred beyond the session window: the syllabus.