Hands-on · Claude Code Build Guide

From today to a working weekly-status Op

A real, step-by-step build with Claude Code and the tools you already use — GitHub, GitHub Projects, Slack, Google Drive, and Notion. Each step has the prompt you paste, the file it produces, and the technical why. No Intelligence Hub required; this runs today.

Since there's no Hub yet, we map the three concepts onto Claude Code primitives you can use right now. Here's the repo you'll have at the end — your context, workers, and workflow all in version control:

~/atlas — what you'll buildrepo layout
atlas/                          ← your git repo = the context home
├── CLAUDE.md                   ← imports the Frames (auto-loaded every session)
├── .mcp.json                   ← GitHub · Slack · Drive · Notion connectors
├── frames/
│   ├── company.frame.md            ← parent Frame (inherited)
│   └── atlas-program.frame.md      ← FRAME · your context
├── .claude/
│   ├── agents/
│   │   ├── status-report.md            ← COG · briefed worker
│   │   └── risk-triage.md              ← COG · briefed worker
│   └── commands/
│       └── weekly-status.md            ← OP · orchestration + your gate
└── status/
    └── 2026-W39.md                 ← drafted output (git history = memory)
0
The starting point

Today: you assemble it by hand

Every Monday you open six tabs — GitHub PRs and issues, the Projects board, the Slack workstream channels, the latest Drive meeting transcript, the Notion notes — and reconcile it all into a RAG deck. The context that says what "amber" means, which workstreams exist, and who owns what lives in your head. The goal of this guide: make that context explicit and the gather repeatable — without giving up your sign-off.

Sources: GitHub · Projects · Slack · Drive · Notion Output: hand-built RAG deck Cost: ≈ 3 hrs/week

One decision up front: pick a git repo to be the home for all of this. Everything we add lives in version control — that's what makes your context inheritable and your runs auditable (your stand-in for Organizational Memory until you have a Hub).

terminalsetup
$ mkdir atlas && cd atlas && git init
$ mkdir -p frames .claude/agents .claude/commands status logs
1
Tools · the connectors

Connect your sources over MCP

Claude Code reaches your tools through MCP servers. Add one connector per source, each authenticated with a read-only token — least-privilege scoping is your governance layer today. This is the "tools" half of a Cog, set up once for the whole repo.

terminalmcp setup
# GitHub — PRs, issues, and Projects v2 (read-only PAT)
$ claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \
      --header "Authorization: Bearer $GITHUB_TOKEN"

# Notion — hosted connector (read access to the Atlas workspace)
$ claude mcp add --transport http notion https://mcp.notion.com/mcp

# Slack — project channels (bot token, channels:history scope)
$ claude mcp add slack --env SLACK_BOT_TOKEN=$SLACK_BOT_TOKEN \
      -- npx -y @modelcontextprotocol/server-slack

# Google Drive — meeting transcripts & docs (read-only)
$ claude mcp add gdrive -- npx -y @modelcontextprotocol/server-gdrive

$ claude mcp list        # confirm all four are connected
Two notes. Connector packages move — the GitHub and Notion remote MCP URLs are current; the Slack and Drive reference servers are community-maintained, so confirm the package you install. And recordings can't be "watched": point the Cog at their auto-generated transcripts in Drive, which are just docs.
Result: all five sources reachable from Claude Code, read-only
2
Frame · the context

Create the Frame

A Frame is just a versioned markdown file that captures your context. The fastest way to write the first one is to have Claude Code read what you already produce and draft it — your past status docs and notes already encode the vocabulary and format.

Paste into Claude Code
Read the last 4 weekly-status docs in the Google Drive folder "Atlas / Weekly Status", the "Project Atlas" page in Notion, and recent messages in #atlas-eng and #atlas-product on Slack. From those, draft frames/atlas-program.frame.md capturing: - the workstreams and their owners - our vocabulary — define "milestone", "slip", and the RAG (red/amber/green) criteria - the EXACT status format we use today - our norms (when status is due, how blockers escalate) Add a "Sources" section mapping each workstream to where its signal lives: GitHub repo, Projects board field, Slack channel, Drive transcript folder, Notion page. Use scope: program, name: Project Atlas, version: 0.1.0, extends: frame://acme/company. Output only the file.

Review what it drafts, fix anything wrong, and you've got your Frame:

frames/atlas-program.frame.mdFrame
scope:    program
name:     Project Atlas
version:  0.1.0
extends:  frame://acme/company          # parent frame, inherited
---
## Goals
Migrate billing to the new platform by Dec 15 with zero customer-facing downtime.

## Workstreams
- platform   — owner: Lena    (the migration itself)
- data       — owner: Omar    (backfill + reconciliation)
- frontend   — owner: Priya   (checkout UI)

## Terminology
"Milestone" = a dated, owner-bound deliverable on the critical path.
"Slip" = a milestone moved more than 3 business days.
RAG: green = on track; amber = at-risk with a recovery plan; red = blocked or slipped, needs a decision.

## Status format
RAG per workstream + top-3 risks + decisions needed. One screen, no prose.

## Norms
Status drafts Monday 9am. Blockers escalate same-day, never held for the readout.

## Sources
- platform:  github://acme/billing-svc  · project:Atlas/Status · slack://atlas-eng     · drive://Atlas/Transcripts · notion://Atlas/Platform
- data:      github://acme/billing-data · project:Atlas/Status · slack://atlas-data    · drive://Atlas/Transcripts · notion://Atlas/Data
- frontend:  github://acme/checkout-ui  · project:Atlas/Status · slack://atlas-product · drive://Atlas/Transcripts · notion://Atlas/Frontend

Now make it inherited: Claude Code auto-loads CLAUDE.md in every session, and @-imports pull in your Frame files. After this, every session in the repo is already oriented — no re-explaining.

CLAUDE.mdinheritance
# CLAUDE.md — auto-loaded into every Claude Code session in this repo
@frames/company.frame.md
@frames/atlas-program.frame.md
terminalcommit
$ git add frames CLAUDE.md && git commit -m "frame: Atlas v0.1.0"   # git history = your audit trail
Result: frames/atlas-program.frame.md, inherited via CLAUDE.md
3
Cogs · the workers

Create the Cogs

A Cog is a Claude Code subagent — its own system prompt, its own tool allowlist, oriented by the Frame. We'll build two: status-report (gathers signal, assigns RAG) and risk-triage (scores and de-dupes risks, assigns owners). The tools: allowlist is the governance fence; "draft only" is the rule baked into the prompt.

Paste into Claude Code
Create a Claude Code subagent at .claude/agents/status-report.md. It is oriented by frames/atlas-program.frame.md (already loaded via CLAUDE.md). Its job: produce a DRAFT weekly status in the format defined in that frame. For each workstream in the frame's Sources map, over the last 7 days, gather: - GitHub: merged PRs, still-open PRs, issues opened/closed - GitHub Projects: items whose status changed; items past their target date - Slack: async updates and blockers in the workstream channel - Drive: the latest meeting transcript — pull decisions and risks - Notion: the workstream's notes page Then assign RAG per workstream using the frame's criteria, and surface the top-3 risks and any decisions needed. Constrain tools to READ-ONLY (the only write allowed is creating files under status/). The system prompt must say: DRAFT ONLY, cite evidence for each RAG call, and mark a workstream "no-signal" rather than guessing. Output only the file.
.claude/agents/status-report.mdCog · subagent
---
name: status-report
description: Drafts the weekly RAG status for Project Atlas from GitHub, Projects, Slack, Drive transcripts, and Notion. Use for the weekly status only.
tools: Read, Write, mcp__github__list_pull_requests, mcp__github__list_issues, mcp__github__list_project_items, mcp__slack__conversations_history, mcp__gdrive__search, mcp__gdrive__read_file, mcp__notion__search
model: sonnet
---
You are the Status-Report Cog for Project Atlas. You are oriented by
frames/atlas-program.frame.md — follow its vocabulary, RAG criteria, and status
format exactly.

Reporting window: the last 7 days ending today.

For each workstream in the frame's Sources map:
1. GitHub: merged PRs, open PRs, issues opened/closed in the window.
2. Projects: items whose status changed; flag any item past its target date.
3. Slack: scan the workstream channel for async updates and the word "blocked".
4. Drive: open the most recent transcript; extract decisions and risks.
5. Notion: read the workstream's notes page for context.

Assign RAG per workstream per the frame's criteria. Surface the top-3 risks and the
decisions needed.

Rules:
- DRAFT ONLY. Never post to Slack, Notion, or Drive. Write only under status/.
- Cite evidence for every RAG call (PR #, message link, transcript line).
- If a workstream has no signal, mark it "no-signal" — never invent status.

Everything below the frontmatter is the Cog's runtime system prompt — what orients it on every run. The tools: line is its governance boundary.

The second Cog is smaller — it only reasons over the risks the first one surfaced:

.claude/agents/risk-triage.mdCog · subagent
---
name: risk-triage
description: Scores, de-dupes, and assigns owners to Project Atlas risks. Invoked by the weekly-status Op.
tools: Read, mcp__github__list_issues, mcp__github__list_project_items
model: sonnet
---
You are the Risk-Triage Cog for Project Atlas, oriented by frames/atlas-program.frame.md.
Given a set of candidate risks, you:
- merge duplicates and phrase each as "risk -> impact -> next step"
- score severity (high / med / low) using the frame's definitions of "slip" and "blocked"
- assign an owner from the workstream's owner in the frame
- output the top-3 by severity
You are read-only: you never modify issues or post anywhere.

Test a Cog in isolation before wiring it in — check its RAG calls cite real evidence:

terminaltest one Cog
$ claude
> Use the status-report subagent to draft this week's status for the platform workstream only.
Result: two subagents = two Cogs, tool-fenced and draft-only
4
Op · the workflow

Create the weekly-status Op

The Op is the orchestration plus your gate. In Claude Code that's a slash command that runs both Cogs, composes their output into your format, writes a draft for review, and stops. No auto-publish — that's the human checkpoint you asked to keep.

Paste into Claude Code
Create a slash command at .claude/commands/weekly-status.md that: - runs the status-report subagent to gather signal and draft RAG-per-workstream - runs the risk-triage subagent to score, de-dupe, and assign owners to the risks - composes both into the status format in frames/atlas-program.frame.md (a RAG table per workstream with evidence links, top-3 risks, decisions needed) - writes the result to status/<ISO year-week>.md as a DRAFT - prints a 3-line summary and STOPS for my review — posts nothing anywhere Output only the command file.
.claude/commands/weekly-status.mdOp · slash command
---
description: Draft this week's Project Atlas status for review (no publish)
allowed-tools: Read, Write, Task
---
Compose the Project Atlas weekly status for the window: the last 7 days ending today.

1. Use the status-report subagent to gather signal and produce RAG-per-workstream.
2. Use the risk-triage subagent to score, de-dupe, and assign owners to the risks.
3. Merge into the format defined in frames/atlas-program.frame.md:
   - a RAG table per workstream, each call linked to its evidence
   - the top-3 risks (severity · owner · next step)
   - decisions needed
4. Write the result to status/$(date +%G-W%V).md as a DRAFT.
5. Print a 3-line summary, then STOP. Do not post to Slack, Notion, or Drive.

Run it, and review the draft it leaves behind:

terminalrun the Op
$ claude
> /weekly-status
# drafts status/2026-W39.md, prints a 3-line summary, and stops. You review, edit, publish.

Want it ready before standup? Schedule a headless draft — the gate never moves, because it only ever writes the file:

crontaboptional · schedule
# Monday 9am: draft only — leaves the file in status/ for you to review.
0 9 * * 1  cd ~/atlas && claude -p "/weekly-status" >> logs/status.log 2>&1
Result: /weekly-status Op — orchestrates 2 Cogs, drafts for review
5
The payoff

A functional weekly-status Op

Here's what /weekly-status drops into status/ for your Monday review — in exactly the format your Frame defines, with evidence behind every call:

status/2026-W39.md — DRAFT for reviewoutput
# Project Atlas — Weekly Status · 2026-W39

## RAG by workstream
- platform   GREEN  — on track. billing-svc cutover PR #482 merged; staging green (transcript 09-21).
- data       AMBER  — at-risk. backfill 2 days behind; recovery plan posted in slack://atlas-data (Omar).
- frontend   RED    — blocked. checkout-ui waiting on the data contract; decision needed.

## Top-3 risks
1. [HIGH] Data contract unresolved blocks frontend  -> owner Omar  -> lock the schema by Wed
2. [MED]  Backfill slip threatens the Dec 15 milestone -> owner Omar -> add a second runner
3. [MED]  Load test not yet scheduled -> owner Lena -> book a window this week

## Decisions needed
- Approve the schema freeze for the billing data contract — frontend is blocked on it.

How it maps back to Frames, Cogs & Ops

You just built the whole execution layer — using only Claude Code and your existing tools:

ConceptWhat it is hereLives in
FrameVersioned context, inherited every session.frames/*.frame.md + CLAUDE.md
CogA briefed subagent, fenced by a tool allowlist..claude/agents/*.md
OpOrchestration of Cogs + your review gate..claude/commands/weekly-status.md
ToolsMCP connectors, read-only..mcp.json
Org MemoryAudit trail + accumulated context.git history of frames/ + status/
Human gateYou review the draft before it ships.the "STOP for review" step in the Op
What you have now

A functional weekly-status Op, today, with no Hub. When you stand one up later, these artifacts port cleanly: the Frame file becomes a real Frame, the subagents become Cogs, and the slash command becomes an installable Op. Same shapes — more governance and reproducibility around them.

Sensible next steps:

  • Add a compliance.frame.md and import it in CLAUDE.md — the Cogs inherit it automatically.
  • Add an exec-brief Cog and a /qbr-pack Op for the quarterly review.
  • Share a redacted subset of the Frame with a vendor partner (goals + terminology only).

New to the concepts? Start with the PM playbook or the engineer's field guide →