Tool-belt series · Companion to Copilot Without Babysitting
Every table, flag, checklist and copy-paste file from the field-notes page, with the essay cut out. Built for the moment at your desk when you need the answer, not the argument for it.
↪ Full field notes, quotes & sourcesFour beats. Only one of them is you typing.
My Work is the single pane — active sessions, issues, PRs, automations. Read what ran overnight before starting anything new.
Each session gets its own git worktree, created and cleaned up for you. One agent at a time wastes the architecture.
Plans and diffs land on canvases you approve. Kill a bad plan at step two — it costs the whole session at step twenty.
Whatever you said twice today goes into the memory file tonight, not "sometime." Loop is below.
Pick the lowest rung that finishes the job. Real product modes, not a metaphor.
| Lvl | Mode | What it does | Approval | Blast radius |
|---|---|---|---|---|
| 0 | Ask | Read-only questions, no edits | n/a | None |
| 1 | Plan | Writes the step list, not code | You approve the plan | None |
| 2 | Interactive (default) | Asks before every tool call | Every tool | One keystroke |
| 3 | Autopilot | Multi-step to completion, capped | Up front, once | The worktree |
| 4 | Cloud automation | Scheduled / triggered, laptop shut | The pull request | One repo, chosen tools |
copilot --autopilot --yolo --max-autopilot-continues 10 -p "…"
--yolo / --allow-all grants every tool, path and URL. Prefer --allow-tool / --allow-url scoped to the task. For unattended runs also set --no-ask-user, --model (stop a silent swap), and -s for clean output. Autopilot is sticky across tasks unless "stayInAutopilot": false in ~/.copilot/settings.json.One line each. Every line traces to a source — follow it for the full story.
Fails any one → stay in the chair. Passes all five → runs overnight, review with coffee.
copilot-setup-steps.yml installs your tooling before the agent starts. No twenty minutes lost to a missing package.main, never a live model you can't restore.--max-autopilot-continues, an iteration cap, a time box. Pick a number you'd pay for twice.Value is context isolation first, speed second. It costs a coordination layer — spend it deliberately.
| Pattern | Shape | Use it when |
|---|---|---|
| Research, then act | One agent gathers facts, a second implements | Default for unfamiliar repos/models. /research does this for you. |
| Coordinator & workers | Planner → implementer → reviewer | Multi-file work with real dependencies. Keep the orchestrator thin. |
| Multi-perspective review | Parallel reviewers: correctness, security, perf, conventions | Before a PR you can't easily unwind. |
| Fleet | /fleet decomposes, runs background sub-agents, synthesises | Genuinely independent tracks. Headless: copilot -p "/fleet …" --no-ask-user |
chat.subagents.allowInvocationsFromSubagents). Recent CLI builds let you cap parallelism/depth in /settings. Turn recursion on only after you've watched a flat fleet behave..github/agents/*.agent.md. Key keys: tools, agents (delegate allowlist), user-invocable: false, disable-model-invocation: true.A small curated memory file, self-updating. You can build this today.
| Hermes does this | Steal this | Your Copilot version |
|---|---|---|
| Two memory files | ~2,200 / ~1,375 char hard caps | AGENTS.md + short learnings.md |
| Frozen snapshot at session start | Mid-session writes land tomorrow | Same — instruction files are read at start |
| Background self-improvement review | Runs post-turn, on a cheap model | sessionEnd hook, distilled on Sonnet not Opus |
write_approval gate | Staged writes reviewed before they land | The memory file is in git — the PR is the gate |
| Skills that self-improve | Completed workflows → procedure docs | .github/skills/<name>/SKILL.md |
AGENTS.md.Semantic models punish small errors silently. The community consensus is unusually clear.
| Task | Hand it over? | Why |
|---|---|---|
| Summarise / search an unfamiliar model | Yes | Agents' strongest move here |
| Backfill descriptions | Yes | Bulk, low-risk, tedious |
| Refactor / move measures, display folders | Yes | Proven, with checkpoints + a revertable repo |
| Formatting / labels across PBIR report JSON | Yes | Scale work; reopen in Desktop after |
| Generate whole new TMDL from scratch | No | TMDL/PBIR are sparse in training data |
| Rename a table/measure with dependents | No | Renames don't propagate — breaks hide downstream |
Anything pointed at a .pbix | No | Opaque binary, no diff — convert to PBIP first |
| Writing to a system of record | No | Draft / reconcile / flag only — humans post |
Six blocks. Paste, adjust the names, commit.
# 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.
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.
{
"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
}
]
}
}
docs/learnings.md. Keep hooks under ~5 seconds — they block the agent; do the heavy version as a scheduled weekly job instead.# 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."
--- 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.
The semantic model athas 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.
Usage-based AI credits since 1 June 2026. Model choice is your biggest lever.
| Job | Reach for | Why |
|---|---|---|
| Long loop: refactors, backfills, tests, docs | Sonnet class | Near-top agentic benchmarks at a fraction of the flagship rate — 90% of unattended hours |
| Hard hour: root-cause, gnarly modelling, security review | Opus class | Worth it interactively; never inside an uncapped loop |
| Janitor: harvesting learnings, triage, summaries | Fast / cheap tier | Small model, narrow job, runs constantly |
--model explicitly, so a fallback shows up in your logs instead of silently in your output.