Copilot Without Babysitting

Tool-belt series · GitHub Copilot · Autonomy & memory

Stop sitting next to it.
Give it a stop condition instead.

Everything below is what practitioners actually report — the wins, the burns, the exact flags — pulled from field write-ups rather than product pages. Written to be read in slices of thirty seconds, at the moment you need the slice.

The whole page, if you only read one box

  1. Autonomy is a dial, not a switch. Plan first, autopilot second. Never the reverse.
  2. A run without a verify command is a run you have to babysit. Tests are the stop condition.
  3. Corrections belong in a file, not in a chat. If you said it twice, it should have been written down once.
  4. Fan out only where work is genuinely independent. Parallel dependent tasks just fail four times.
  5. The repo is the source of truth; the workspace is the runtime. True for code, doubly true for Power BI.
  6. Agents draft, humans post. Nothing an agent writes reaches a system of record unreviewed.
Loop

The daily rhythm that makes it a daily driver

The mistake is treating the app like a chat window you visit. It is an inbox and a dispatch desk. Four beats, and only one of them is you typing.

First 10 min

Read what ran overnight, before you start anything new

Scheduled automations and cloud sessions have already produced pull requests, triage comments and briefs. My Work is the single pane: active sessions, issues, PRs, automations. Triage before you create.

Dispatch

Delegate three to five, not one

Each session gets its own git worktree — a real isolated copy of the branch, created and cleaned up for you. That is the whole point of the app: parallel work without branch juggling. One agent at a time wastes the architecture.

Steer

Review the plan, not the keystrokes

Plans and diffs land on canvases — work surfaces you edit, reorder and approve on, instead of scrolling a chat log. Kill a bad plan at step two; a bad plan at step twenty costs you the whole session.

Last 5 min

Harvest the corrections

Whatever you had to say twice today goes into the memory file tonight, not "sometime". This is the beat everyone skips, and it is the one that compounds. The loop is below.

Why this orderDelegation is cheap and review is expensive, so the constraint on your day is review capacity, not agent capacity. Start by clearing the review queue and you will always know how many new sessions you can afford to start.
Dial

The autonomy dial

Five settings, genuinely ordered by how much can go wrong before you find out. Pick the lowest one that finishes the job. The rungs are real product modes, not a metaphor.

0

Ask read-only

Questions about the codebase or model. No edits. Use it to find out whether the thing you're about to ask for is even possible here.

Approval: n/aBlast radius: none
1

Plan writes a plan, not code

Produces the step list and the files it intends to touch. GitHub's own recommended path is plan first, then "Accept plan and build on autopilot". Reading a plan takes ninety seconds and saves an hour of unwinding.

Approval: you approve the planBlast radius: none
2

Interactive per-tool approvals

The default. It asks before each meaningful action. Correct setting for unfamiliar repos, live models, anything with a rename cascade.

Approval: every toolBlast radius: one keystroke
3

Autopilot local, sandboxed, capped

Runs multi-step to completion without stopping between steps. Shift+Tab cycles into it interactively; programmatically it is
copilot --autopilot --yolo --max-autopilot-continues 10 -p "…". The cap is the important flag — it is your infinite-loop insurance. Autopilot is sticky between tasks unless you set "stayInAutopilot": false in ~/.copilot/settings.json.

Approval: up front, onceBlast radius: the worktreeCost: it spends credits on its own
4

Cloud automation runs when your laptop is shut

A saved prompt on a trigger: hourly, daily, weekly, CRON (local automations only), or on issue-created / PR-opened / PR-synchronised. Scoped to one repo, with an explicit tool list. Output lands as a PR, a label, an issue comment — things you review in the morning.

Approval: the pull requestBlast radius: one repo, chosen tools
The one flag people regret--yolo / --allow-all grants every tool, path and URL. GitHub's own advice is to prefer --allow-tool and --allow-url with only what the task needs, and to keep the blanket version for sandboxes. Also worth setting explicitly for unattended runs: --no-ask-user (it can't ask you anything at 3am anyway), --model (so a silent model swap doesn't change your results), and -s for clean capturable output.
Field notes

What people actually report

Not marketing, not docs. Practitioners writing up what happened, including the parts that went badly. Every note links to the source.

Holds up

~60% of bug tickets closed with no steering. A developer pointed Copilot at his Sentry queue from outside the IDE entirely and called it "simpler and more magical than my local IDE experience". Most of the rest needed only light correction.

Harrison Milbradt · An honest review of Copilot & Agents HQ

Specs pay when they are acceptance criteria. One practitioner reports 2–3 hours writing a spec built around acceptance tests, then a working tested version, claiming roughly 20× return on the end-to-end tests written into it. Mercari's internal write-up claims 150% over their traditional baseline and 80% over freeform prompting after six months.

Field study of practitioner reports · Spec-driven development

Real model refactor, 54 measures, 30–40 minutes. Against 30–90 minutes by hand — and the agent planned eight steps with checkpoints before touching anything. Verdict: "Agentic AI works best when the task is specific, the tools are clear, and the checkpoints are real."

BI Insight · Copilot + Power BI Modeling MCP in action

Search and summarise beats generate. For semantic models, agents reading metadata are "the quickest and most efficient way for AI to search or summarize" — strongest on a model you didn't build.

Kurt Buhler · AI agents that work with TMDL files

Burns people

Confidently wrong, plausibly shaped. The same reviewer watched it force single-threaded test runs to make a failure disappear rather than fix the environment, and flatly notes "Copilot sucks at handling merge conflicts" — a real problem when you're running parallel branches.

Harrison Milbradt · Honest review

Rate limits are the number one complaint of 2026. Paying users reported multi-day lockouts — one 44-hour weekly limit, others claiming far worse — after GitHub fixed a token-counting bug that had been undercounting the newest models. Plan unattended runs around this; don't assume unlimited throughput.

The Register, April 2026 · Customers revolt as Copilot "fixes" rate limits

Elaborate specs get partially ignored. Drift is called "the #1 practical problem": "it just keeps drifting and drifting until you have duplication and contradictions." One framework generated 1,300 lines of markdown for a date-display feature. The sting: "agents ignore parts of the elaborate spec — control is partly illusory."

Field study · Spec-driven development

MCP servers eat your context before work starts. Measured: "29% of the context is taken up by the Power BI modelling MCP server, alone." Advice from the same write-up — "only enable them when you need them."

Kurt Buhler · Agents + Power BI MCP servers

The pattern under all of itThe failures are not intelligence failures. They are verification failures — nothing in the loop could tell the agent it was wrong. Every fix on this page is really the same fix: give the run something that can say no.
Run alone

Five conditions before you walk away

If a task fails all five, it needs you in the chair. If it passes all five, it can run overnight and you can review the pull request with coffee. This is the checklist, and it is short on purpose.

The unattended-run recipe, compressedPlan mode → read the plan → accept into autopilot with a continuation cap → it pushes a branch and opens a PR → Agent Merge watches CI, addresses failing checks and waits on required reviewers → you review a green PR in the morning. Nowhere in that chain did you sit and watch a spinner.
Fleet

Sub-agents: when fanning out actually helps

A sub-agent is a temporary worker the main agent launches with its own clean context. The value is context isolation first, speed second — and it costs you a coordination layer, so spend it deliberately.

PatternShapeUse it when
Research, then actOne agent gathers facts, a second implements from themDefault for anything in an unfamiliar model or repo. /research does this for you.
Coordinator & workersPlanner → implementer → reviewer, orchestrator holds the threadMulti-file work with real dependencies. Keep the orchestrator thin — it coordinates, it doesn't code.
Multi-perspective reviewParallel reviewers: correctness, security, performance, conventionsBefore a PR you can't easily unwind. Different models per lens is a feature, not a gimmick.
Fleet/fleet decomposes, launches background sub-agents, respects dependencies, synthesisesGenuinely independent tracks. Headless: copilot -p "/fleet …" --no-ask-user
Two settings to know before you scale thisRecursive delegation (sub-agents spawning sub-agents) is off by default in VS Code — chat.subagents.allowInvocationsFromSubagents. And recent CLI builds let you cap parallelism and depth from /settings, explicitly to prevent runaway recursive trees. Turn recursion on only when you've watched a flat fleet behave.
Where the files liveAgents are markdown with frontmatter in .github/agents/*.agent.md. The useful frontmatter keys are tools (what it may touch), agents (an allowlist of who it may delegate to), user-invocable: false (hide a worker from the picker), and disable-model-invocation: true (stop it being auto-recruited). Because it's a file, it reviews and versions like anything else in the repo.
Memory

The Hermes loop, ported to Copilot

Nous Research's Hermes agent keeps a small curated memory as plain markdown — MEMORY.md for environment facts and lessons, USER.md for how you like to work — in ~/.hermes/memories/. After each turn a background review quietly decides whether anything is worth keeping. That is the mechanism you want. You can build it on Copilot today.

Hermes does thisDetail worth stealingYour Copilot equivalent
Two memory files2,200 chars for lessons, 1,375 for the user profile — hard caps, roughly 800 and 500 tokensAGENTS.md (norms + code map) and a short learnings.md
Frozen snapshot at session startMid-session writes persist to disk but don't change the running promptSame reality: instruction files are read at session start. Today's lesson lands tomorrow.
Background self-improvement reviewRuns after each turn, and can run on a cheaper auxiliary modelA sessionEnd hook that distils corrections — on Sonnet, not Opus
write_approval gateStaged writes reviewed with /memory pending before they touch your profileThe memory file is in git. The pull request is the approval gate.
Skills that self-improveCompleted workflows get written up as reusable procedure docs.github/skills/<name>/SKILL.md — read by the CLI, the app, the cloud agent and code review
Step 1
It gets it wrong
Wrong folder convention, wrong measure naming, wrong refresh order.
Step 2
You correct it once
And add four words: "write that down".
Step 3
It appends one line
Imperative, specific, dated. To Local norms — not a paragraph of reflection.
Step 4
Tomorrow it starts there
Same mistake doesn't get made twice. That is the entire product.
The insight that makes this workAs one practitioner puts it: "If the model weights are not changing mid-week, improvement has to come from the environment you wrap around the agent." You are not training anything. You are maintaining a very short document that a very capable reader consults before every job.
The failure mode is bloat, not forgettingInstruction files past roughly a thousand words get skimmed; GitHub's own guidance caps custom instructions at about two pages. So borrow Hermes' hard limit: cap the learnings file, and run a weekly compaction pass — merge duplicates, delete anything about code that no longer exists, promote anything that's now a permanent rule up into AGENTS.md. A memory file nobody prunes becomes a memory file nobody reads.
Power BI

Analytics work: what to hand it, what to keep

Semantic models are the hardest thing on this page to automate safely, because the file format punishes small errors and the failure is silent — a number that is wrong but renders fine. The community consensus is unusually clear.

TaskHand it over?Why
Summarise / search an unfamiliar modelYesFastest reliable win. Reading metadata is what agents are best at here.
Backfill descriptions on tables, columns, measuresYesBulk, low-risk, tedious, and it improves every future agent run on the model.
Refactor / move existing measures, display foldersYesProven in the field — with checkpoints and a repo you can revert.
Formatting and labels across PBIR report JSONYesScale work no human enjoys. Reopen in Desktop afterwards, always.
Generate whole new TMDL files from scratchNoHigh error rate. TMDL and PBIR are sparse in training data; agents mix TMDL, DAX, M and SQL syntax.
Rename a table or measure with dependentsNoRenames don't propagate through dependent expressions — agents routinely miss the downstream break.
Anything pointed at a .pbixNoOpaque binary, no useful diff. Convert to PBIP first or don't start.
Writing to a system of recordNoFinance rule, not a technical one: agents draft, reconcile, flag and explain. Humans review, approve and post.
Four gotchas that cost a whole afternoonIndentation in TMDL is structural — one bad indent breaks the parse, and agents mangle multi-line DAX continuations. Fabric Git sync is not automatic on push: someone has to update from the Source control pane. PBIR JSON can capture slicer values, filter conditions and example data — check before that repo goes anywhere shared. And credits go fast: one practitioner's single measure-reorganisation run consumed about 35% of a month's free-tier credits.
The setup that makes all of this safePBIP + TMDL + PBIR committed to git, with the repo as the source of truth and the Fabric workspace as the runtime. Best Practice Analyzer wired into CI so the agent's mistakes fail a check rather than reach a report. Tabular Editor open to validate after a session. MCP servers switched on only for the bulk job that needs them, then off. That's it — four things, and they turn silent failure into a red build.
Automations worth scheduling in a finance shopDaily: refresh-failure triage → an issue naming the failing table and the last good run. On PR: BPA + a plain-English note on what a measure change does to reported figures. Weekly: description backfill on anything added since Monday, plus the memory-file compaction pass. Monthly close: variance commentary drafted from numbers a script pulled — never numbers the model produced from memory — landing as a draft for you to edit, sign and send.
Kit

Copy-paste kit

Six blocks. Paste, adjust the names, commit. The first two are the highest-leverage files you will write this quarter.

File

AGENTS.md — the skeleton that survives contact

# AGENTS.md

## Commands
- Validate model:   pwsh ./scripts/validate-model.ps1
- Run BPA:          pwsh ./scripts/run-bpa.ps1 -Path ./Sales.SemanticModel
- Tests:            pytest -q
- Format check:     ruff check .
(Run the validate + BPA pair before claiming any model change is done.)

## Stack
Power BI Project (PBIP). Semantic model as TMDL, report as PBIR.
Python 3.11 + semantic-link-labs for notebook-side automation.
Fabric workspace is the runtime. This repo is the source of truth.

## Code map
- Sales.SemanticModel/definition/tables/*.tmdl   measures + columns
- Sales.Report/definition/pages/*                report layout
- scripts/                                       validation + deploy
If this map is wrong or stale, fix it in this file as part of your change.

## Local norms
- Measure names: Title Case With Spaces. No abbreviations except FX, YTD, QTD.
- Every new measure gets a description and a display folder. No exceptions.
- Never edit a .pbix. If one appears, stop and tell me.
- Do not modify tests to make them pass.
- Currency measures format "#,##0;(#,##0)" — parentheses for negatives, finance house style.

## Boundaries
- Never commit secrets, connection strings, or workspace IDs.
- Never touch main directly. Branch, then open a pull request.
- Never rename a table, column or measure that has dependents without listing
  every dependent expression first and showing me the list.

## Self-update rule
When I correct how work is done in this repo, append the correction to
"Local norms" as one imperative line before you continue. Keep this file
under two pages: merge duplicates, delete rules about code that no longer
exists. If you are unsure whether a correction is durable, put it in
docs/learnings.md instead and leave this file alone.
Prompt

The end-of-day harvest — run it in the last five minutes

Review this session's conversation only. Find every place I corrected you —
naming, ordering, tools, conventions, things you assumed that were wrong.

For each one, decide:
  DURABLE  → true next week too. Append one imperative line to
             "Local norms" in AGENTS.md.
  LOCAL    → true only for this task. Append to docs/learnings.md
             under today's date.
  NOISE    → a one-off. Drop it.

Rules for what you write:
- One line each. Imperative. No hedging, no "consider", no explanation.
- No duplicates: if a rule already covers it, sharpen the existing line
  instead of adding a new one.
- If AGENTS.md is over two pages after your edit, compact it in the same
  commit — merge overlapping rules, delete anything about code that no
  longer exists.

Then show me the diff and stop. Do not commit.
File

.github/hooks/hooks.json — make the harvest automatic

{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "command",
        "bash": "cat docs/learnings.md 2>/dev/null | tail -40",
        "powershell": "Get-Content docs/learnings.md -Tail 40 -EA SilentlyContinue",
        "timeoutSec": 5
      }
    ],
    "sessionEnd": [
      {
        "type": "command",
        "bash": "./scripts/harvest-learnings.sh",
        "powershell": "./scripts/harvest-learnings.ps1",
        "timeoutSec": 30
      }
    ]
  }
}
What goes in that scriptOne line: a headless Copilot call with the harvest prompt above, on a cheap fast model, writing to docs/learnings.md. That is exactly Hermes' background review — a small model quietly deciding what was worth keeping. Keep hooks fast; they block the agent, and the guidance is to stay under about five seconds where you can, so do the heavy version as a scheduled weekly job instead.
Command

The overnight run

# 1. plan first — read this before you go anywhere
copilot -p "Plan only, no edits: add descriptions to every measure in
Sales.SemanticModel missing one. List files touched and the validation
command you'll run." --model claude-sonnet-5 -s

# 2. then let it run, capped, with only the tools it needs
copilot --autopilot \
  --max-autopilot-continues 12 \
  --allow-tool 'shell(pytest)' --allow-tool 'shell(pwsh ./scripts/run-bpa.ps1)' \
  --allow-tool 'write' --allow-tool 'read' \
  --no-ask-user --model claude-sonnet-5 -s \
  -p "Execute the plan in plan.md. After each file, run the BPA script.
      Stop and write BLOCKED.md if BPA fails twice on the same file.
      When green, commit to branch feat/measure-descriptions and open a PR."
File

.github/agents/close-pack.agent.md — a coordinator worth having

---
name: 'Close Pack Coordinator'
description: 'Runs the month-end reporting checks end to end and reports what needs a human.'
tools: ['read', 'search', 'edit', 'runCommands', 'agent']
agents: ['Model Validator', 'Variance Writer', 'Number Checker']
user-invocable: true
---

You coordinate. You do not write DAX and you do not write commentary yourself.

Sequence:
1. Delegate to Model Validator: run BPA + the refresh check. If it fails,
   stop everything and report. A broken model makes the rest meaningless.
2. Delegate to Variance Writer: draft commentary for every variance over
   the threshold in config/thresholds.json. Numbers come from
   scripts/pull-actuals.py output ONLY. Never state a figure you did not
   read from that file.
3. Delegate to Number Checker: independently re-derive every figure quoted
   in the draft against the same file. Flag every mismatch. Do not fix them.

Output one markdown file: docs/close/YYYY-MM.md, with a "NEEDS A HUMAN"
section at the top listing mismatches, missing data and anything you
guessed at. If that section is empty, say so explicitly — do not omit it.

Never post, send, email or write to any system of record. You produce a
draft. A person signs it.
Prompt

The model-refactor prompt, with real checkpoints

The semantic model at  has measures spread across
several tables. Move them into a dedicated measure table with display
folders.

Structure I want — be exact, do not improvise a hierarchy:
  Averages & Aggregations/  → Cost, Internet, Reseller as SUBFOLDERS
  Margins/                  → flat
  Time Intelligence/        → YTD, QTD, PY as subfolders

Before you change anything:
1. Inventory every measure and its current home. Show me the list.
2. Show me the target mapping. Wait for my yes.
3. Then move in batches of ten, validating after each batch.

Rules:
- This runs against a live model, so checkpoint before each batch and
  stop on the first validation failure.
- Do not rename any measure. Moving only.
- Do not create, delete or edit measure expressions.
- If a measure's home is ambiguous, put it in a NEEDS DECISION folder and
  keep going. Do not guess.

Finish by listing every measure in NEEDS DECISION and what you'd suggest.
Cost

Credits, models, and the throttle nobody plans for

Copilot moved to usage-based AI credits on 1 June 2026 — one credit is one US cent, spent against each model's token rate. Which means unattended runs are now a budget decision, and model choice is the biggest lever you have.

JobReach forReasoning
The long loop: refactors, backfills, test writing, docsSonnet classSonnet 5 lands near the top of agentic coding benchmarks at a fraction of the flagship rate. This is where 90% of your unattended hours should go.
The hard hour: root-causing a failure nothing else cracked, gnarly modelling decisions, security reviewOpus classWorth it in an interactive session where you're watching. Putting the most expensive model inside an uncapped loop is how people wake up to an empty balance.
The janitor: harvesting learnings, summarising sessions, triaging refresh failuresFast / cheap tierExactly what Hermes does with its background reviewer — small model, narrow job, runs constantly.
Budget for the throttle, not just the creditsRate limits bite hardest exactly when you're doing what this page describes — concentrated, parallel, long-running sessions. Three defences: put long jobs on cloud sessions and scheduled automations so they run on their own clock rather than competing with your interactive work; keep MCP servers off unless the current task needs them, since they tax every request; and always set --model explicitly, so a fallback to a weaker model shows up in your logs instead of silently in your output.
Ladder

Are you actually doing this?

Ten things, roughly in the order they pay off. Saved in this browser — come back and tick as you go.

Practice ladder

0 / 10
If you only build one thing this weekNumber 8. Everything else on this page is leverage on top of a verification command; without one, more autonomy just means finding out later. With one, every rung of the dial gets safer at the same time.