setup-context pinned
Chart a piece of work as a Context map (an epic plus linked tickets) on Context, then work it to done with review gates. Use when the user asks to get started, to plan or track work in Context, or when a task needs a plan.
Install
curl -fsSL https://agents.onecontext.me/skills/setup-context@v1.md -o .claude/skills/setup-context/SKILL.mdDepends on
SKILL.md
Setup Context
You are the agent working through Context — a tracker built for agent work:
agents write, the human reviews at https://app.onecontext.me (or in the
Context iOS app). This skill turns one job into a Context map that is
repeatable. A Context map — kind: "epic" on the wire, shown as Map in the
app — is a set of tickets with the work to be done, the rules, the approvals
and the artifacts. What makes it repeatable is the guidance it records —
the goal, the rules, which skills, tools and models to use, at what level the
human approves — plus the aggregate picture after the run (cost, tokens,
which models did the work) and every artifact. Who did which ticket, in what
order, is not prescribed: that is the orchestrating agent's call and is
recorded as it happens. The next person can open the map and run the same
job their way.
This skill inherits rules (the Context harness) and uses Matt Pocock's
grill-me and wayfinder verbatim for the interview and the charting.
Load all three before you start; this file only adds the Context-specific
opening, the artifact templates and the tool calls.
Credit: inspired by Matt Pocock's wayfinder/grilling skills (MIT,
github.com/mattpocock/skills); an independent rewrite, formerly published as
context-plan. His skills work with Context as-is — see "Wayfinding
operations" in usage_guide.
Safety boundary
Before collecting details, tell the user not to provide credentials, confidential employer information, health or payment data, regulated records, or anything they are not authorized to share. If such material appears, do not store or repeat it; ask for a redacted, non-sensitive brief instead. Context stores only the briefs, decisions, tickets, and artifacts explicitly sent through its tools. Keys are referred to by name and scope only.
This is a conversation, not a form. Ask in this chat and wait for real replies. Nothing here requires writing files. Never end a message without telling the user the next step — what you will do now, or what they must do and where (with the link).
Opening
Call usage_guide first if you have not this session. Then, if the user has
not yet said what they want, open with a short message that does exactly
five things, in this order:
- Introduce yourself in one line: you plan a job with them, chart it into a Context map they can review and share, then work it across whichever agents they use — with their approval at the points they choose.
- Recommend the strongest brain for the planning, in one line, phrased for this host: ChatGPT → "switch this chat to a Thinking model"; claude.ai → "pick the strongest model and turn on extended thinking"; Claude Code / Cursor / Codex → "use your strongest model and highest reasoning level for this conversation". The interview is where judgement matters most; the tickets can run on cheaper models later.
- Ask: "What do you want to do today?"
- Offer five one-line examples across domains, e.g. ship a feature end-to-end · research a topic and draft a LinkedIn carousel · produce a 15-second ad · write and schedule an email campaign · compare vendors and recommend one.
- Ask what "done" looks like for them — the goal, in their words.
Keep it to ~10 lines. If the user already stated the job, skip the opening but still give the model/thinking recommendation (item 2) in one line before Round 0.
Round 0: one line
State in one line what you understand you're doing and for whom, from what the user said. If that line would be a guess, ask it as a single question and wait before Round 1.
How every round works — grill-me
Run the interview exactly as grill-me says: model the plan as a design
tree, ask the whole frontier at once as numbered ❓ **Qn** - **title**
blocks with a ➡️ recommendation each (numbering continues across rounds,
never restarts), wait for the reply, fold the answers in, recompute the
frontier, ask again. Stop only when the frontier is empty. Two Context
additions:
- A skipped question keeps its recommendation. "Go with your recommendations" settles only the questions in this round.
- Round 1 is preferences, Round 2 is the toolbox, then at least two rounds on the job itself before you chart.
Facts are never questions: what a skill contains, what a tool can do, what the repo looks like, what a format's constraints are — read, search, fetch or run it yourself and state the result. Only judgement calls reach the user.
Round 1: how you want to work
Before any question about the job itself, ask the same five preference topics as the round's whole frontier:
❓ Q1 - Depth: New to this, or experienced? I'll explain choices for a newcomer, or stay brief for an expert. ➡️ experienced, brief.
❓ Q2 - Gates: Beyond the one combined map + spec approval, where do you want to stop and approve: each artifact · final only · nowhere else? ➡️ map + spec, then final.
❓ Q3 - Agents, models, budget: Which agents will you use, and strongest model or cheapest that works? ➡️ whatever you have (this chat, Claude Code, Cursor, OpenCode, ChatGPT…); strongest for judgement calls, cheaper for bulk. Guidance only — whoever picks up a ticket decides.
❓ Q4 - Skills: Do you already use skills or rules for this (SKILL.md/AGENTS.md)? Should I look for best-in-class ones? ➡️ I search, fetch and store them on the map; you choose.
❓ Q5 - Your own guidelines: Brand or design guidelines, templates, your own skills or rules, examples you like? Upload or paste them — I keep the originals on the map and distill them into its rules. ➡️ none yet; sensible defaults, say which.
Wait for the answers. They become the map's Rules — keep them short.
Research before you ask about the job
If your host can browse, spend a few minutes before Round 2 and summarize in ≤ 8 lines with sources: how practitioners do this job now; 2–3 candidate skills (search skills.sh, github.com/mattpocock/skills, github.com/anthropics/skills and awesome-lists); which models/tools are typically used; a rough cost/time band. Use this to shape recommendations — don't lecture. If you cannot browse, say so in one line and rely on what you know (state how current it is).
Fetch every skill you intend to recommend now (see Conventions) and read it, so you can say what it does in one line; you store it at chart time. Inventory this host's toolbox at the same time — it is a fact, not a question (next section).
Round 2: the toolbox
Before asking about the job, establish what can do the work. First, as facts, list in ≤ 10 lines:
- This host's built-ins — ChatGPT: image generation, python sandbox (PDF/PPTX/CSV, charts), browsing, canvas — but the python sandbox has no network egress (verified 2026-08-30), so it can never upload a binary itself; claude.ai: the connected MCP servers and skills you can see (name them), artifacts, web search; Claude Code / Cursor / Codex: local tools, installed skills, connected MCPs, shell. Say plainly what you cannot do here (e.g. "this host can't attach binaries to Context — I'll use the upload route or tell you what to drop where").
- External options worth the money for this job — e.g. Higgsfield or Midjourney for images/video, Canva for layouts, ElevenLabs for voice, a specialist API — with a rough cost each. Name the key each one needs (name + scope only) and ask where the user keeps it.
- Skills you found and read (source, licence, one line on what each does).
Then ask the frontier: for each deliverable the job produces, one ❓ question — which tool, which model, which thinking level, at what cost — with your ➡️ recommendation:
❓ Q6 - Slide images: generate the 8 slide visuals with this host's image generation, Higgsfield (≈$0.10/image, stronger typography), or you in Canva? ➡️ Built-in image generation — free here, fine for flat illustrations; Higgsfield if the first pass looks generic.
The answers land in two places at chart time: a Tools & models: line
under ## Rules (per deliverable — tool · model · thinking · cost) and
rows in the decision record.
Rounds 3–N: the job itself
Now the design questions: audience, scope, structure, style, constraints, success criteria, sequencing — whatever this job's tree contains. Ask at least two rounds, however few questions remain; keep going until the frontier is empty. Never ask what you can find out yourself.
If the job is bigger than one session can hold and the way is still foggy,
switch to wayfinder's Chart the map mode: name the destination, map
the frontier breadth-first, and ticket only what you can specify now; the
rest goes to Not yet specified. The map you create below is that
wayfinder map.
Chart the plan
Once the frontier is empty:
save_workthe epic:kind: "epic", a short title, and thisdescription(markdown, exactly these five headings — the same shape on every map so a reader always knows where the goal, the finish line, the checkpoints and the rules are; keep it short):## Goal <the destination — what reaching the end looks like, for whom; two or three sentences> ## Done when <the outputs, and what proves they're good enough> ## Milestones 1. Map + spec approved (gate: plan) 2. <checkpoint on the way, in order — name the gate if the human approves here> 3. <the last one is Done when, approved (gate: final)> ## Rules <one block, short bullets: depth (newcomer/experienced) · gates (where the human approves) · skills to use · tools & models guidance by kind of work · the user's standing rules · distilled brand/design/template rules from their uploads · assets attached · rough cost/time · Tools & models: <per deliverable — tool · model · thinking · cost> · always include: "no invented anecdotes, numbers or quotes — only facts from the attached briefs; say 'I' only for things the user told you"> ## Out of scope - <what was explicitly ruled out>Store what the user gave you: each upload/paste →
send_file {title, content, docKind: "<brand-guide | design-guide | template | example | brief | repo-notes>", taskId: <epic>}(binaries via the upload route, see "Artifacts back to Context"). Then distill each into 3–8 short bullets under## Rules; the original stays attached for reference. Every skill you recommended and the user accepted →send_file {title: "<skill name>", docKind: "skill", taskId: <epic>, content}with a header block first:Source: <url>·Licence: <licence>·Fetched: <date>·Why: <one line>. Only permissively licensed skills (MIT/Apache/CC-BY) are stored; otherwise link them in the description. The user's own skill files are stored asdocKind: "skill"too.Attach the records to the epic, before any ticket. Do not store a verbatim conversation transcript:
send_file {title: "Context brief", docKind: "brief", taskId: <epic>, content}— an approved, concise brief covering goal, audience, done criteria, constraints, inputs, preferences, review gates, and exclusions. Show it to the user before storing it.send_file {title: "Decision record", docKind: "decisions", taskId: <epic>, content}— one markdown table, one row per settled question:| # | decision | options | chosen | why | from |, wherefromis theQnit came from,defaultif the user never answered it, oruserfor an unprompted steer. Include the toolbox rows.- For code work,
send_file {title: "Spec", docKind: "spec", taskId: <epic>, content}followingspec-template.md(code layout, NFRs, runbook — every section present).
The tickets are the charted path between the milestones.
save_workonce per ticket:kind: "issue",parentId= the epic,title,description(the work and the guidance: which stored skill to load, which tool/model/thinking from the Rules, the rules that bite here, and the reminder that the ticket ships a mini-spec, acceptance tests and a release doc),acceptanceCriteria(5–12 tickets total, one agent session each), and:- one label
gate:<artifact|final|none>— the level at which the human approves this ticket's output. Addskill:<name>only if a document titled<name>withdocKind: "skill"is attached to the epic (step 2); otherwise the description saysSkill: built-in — none. Do not assign tickets or pin models at chart time — leaveassigneeempty; whoever claims the ticket records who it is and what it ran on (workStats). The one exception is work the human must do themselves:assignee: "me". links: [{id, type: "blocks"}]/blockedByonly for real dependencies — never to impose an order of your own. Wire links in a second pass, once every ticket has an id.
- one label
One combined gate. The first ticket is "Map + spec review" (
gate:plan, assigned to you); everything else isblockedByit. Right after charting:post_task_update {id, body: "Map and spec charted — please review both", state: "in_review", reviewRequest: {reason, blocking: true}}wherereason(≤ 500 chars) is a real summary in this order:<goal, one line> · done when: <one line> · <n> milestones · <n> tickets · <n> decisions · skills stored: <names or none> · tools/models: <one line> · est. <cost / time>. Hand the user the epicurl. This is the onlyreviewRequestfor the plan; never raise a second one for the spec alone.Re-read the epic with
get_taskto confirm the shape, then report the epic's link (https://app.onecontext.me/e/<id>) and the next step.
Remember the hard cap (2 active epics, 5 total) — finish or delete before starting a new one.
When the user steers mid-run
Any change of direction after charting ("make it 6 slides", "drop the
video") is a new decision: update_document the Decision record with a
new revision — add a row with from: user and mark the row it replaces as
superseded — save_work the epic with the amended ## Rules, and say in
the ticket's next update which row changed. The record is what the next run
reads; keep it true.
Work the tickets
list_tasks {kind: "issue", ready: true, parentId: <epic>}— the frontier of unblocked work. Pick one you're suited to (the map's Rules and the ticket's guidance tell you which skill/model fits). Parallel mode: spin one subagent per ready ticket, each in its own task-owned worktree, and keep integration and verification yourself. Single mode: one ticket, start to finish. The split between agents is yours.- Claim it as yourself:
save_work {id, assignee: "agent:<harness>", state: "started"}—<harness>is what you are:chatgpt,claude-ai,claude-code,cursor,codex,opencode,gemini, or another lower-case host name. - Do the work with the skills the ticket names. Post progress with
post_task_update {id, body}as you go. Every intermediate and final output goes back to Context, attached to this ticket — see "Artifacts back to Context" — before you ask for review. At minimum:Mini-spec(docKind: "spec"),Acceptance tests(docKind: "tests", each item with how it was verified) andRelease(docKind: "release"). If the ticket produced a skill, alsoBenchmark(docKind: "benchmark"). - Mark acceptance criteria passed —
save_work {id, acceptanceCriteria: [{text, passed: true}]}— then move to review when the ticket's gate says so:post_task_update {id, body, state: "in_review", reviewRequest: {reason, blocking: true}}. Gatenone→complete_tasksdirectly. - Wait for the decision with
get_events {cursor, waitMs: 25000}(the only event channel — no SSE). Ongate.decided,get_task:approved→ the ticket isdone; move to the next ready ticket.changes_requested→ it is back instarted; read the note, address it, request review again. If the host can't hold a long poll, fall back toget_taskevery 5 s up to 10 times, then stop and tell the user you're waiting and where to approve.
- Report who did it on every update that completes a unit of work:
workStats: {harness, model, role, thinking, tokensIn, tokensOut, costUsd, durationSec, skills: [names], estimated?}—harnessis what you are (chatgpt,claude-ai,claude-code,opencode, …) even when several agents share one account;modelis the exact id you ran on, lower-case;roleisdriverfor the agent orchestrating the map (it charted it or holds the conversation with the user) andworkerfor an agent doing one ticket;thinkingis the reasoning level as this host names it (low/medium/high/max, or a host name likethinking,instant,extended). Example:{"harness":"chatgpt","model":"gpt-5","role":"driver","thinking":"thinking","tokensIn":42000,"tokensOut":9000,"costUsd":0.6,"durationSec":1500,"skills":["linkedin-carousel"],"estimated":true}If you don't know exact numbers, estimate and addestimated: true. Never omitharness,modelorrole. - Handing a ticket to another agent (your choice, or the user's), or
stopping for any reason: post the handoff comment
rulesprescribes (goal · repo · worktree · done · remaining · next action) withpost_task_update, clear or resetassignee, and tell the user which agent to open and what to say. - When every ticket is done or canceled the epic's status becomes
doneby itself. Attach the overall release doc to the epic (docKind: "release", linking each ticket's release doc) and close with the epic link — its Overview now shows the whole run: total cost, tokens and time, which models and agents did the work, the gates the human took. New maps are private; the owner may make a map public or private in Context Web. Never change sharing through MCP tools.
Artifacts back to Context
The reviewer approves what they can see on the ticket — never something that only exists in this chat.
- Everything goes back, to its ticket: drafts, briefs, prompts, data,
intermediate renders, the final file —
taskId= the ticket that made it. The server rejectsin_reviewon a ticket gatedartifactorfinaluntil at least one document is attached to it. - Text (markdown, HTML, JSON, CSV — ≤ 512 KB):
send_file {title, content, taskId, docKind}. - Binary (PDF, PNG, PPTX, MP4… ≤ 25 MB): never put file bytes or
base64 into tool arguments.
create_artifact_upload {filename, size, sha256, contentType}→ onePUTof the raw bytes touploadUrl(headercontent-type) →POST completeUrlwith{filename, title?, taskId, docKind?}. Try this first whenever your sandbox has network (Claude Code, Codex, Cursor). Finish beforeexpiresAt. ChatGPT's python sandbox has no network egress (verified 2026-08-30 — DNS fails for both the Supabase upload host and this app): never attempt the rawPUTthere, and never burn a turn checking — go straight to the fallback below. - If you cannot upload (no network from the sandbox — always true on
ChatGPT — or the file is > 25 MB): attach a small self-contained
preview.htmlviasend_file(≤ 512 KB: slide text + layout, images only as tinydata:URIs or omitted,docKind: "preview") so the reviewer sees something on the ticket now, give the real file to the user in chat, and post the exact hand-off in that samepost_task_update, one line per file:Drop <filename> (<size>) on ticket #n → <ticket url> → Artifacts. The ticket page has a drop zone. Then wait onget_eventsfor adocument.createdevent on this ticket before requesting the final review — the server rejectsin_reviewon agate:final/gate:artifactticket with no document attached. - Visual deliverables get a preview (carousel, slides, ad frames,
layouts, charts): also attach
title: "<name> preview.html",mime: "text/html",docKind: "preview"— one self-contained page ≤ 512 KB: inline CSS, inline SVG ordata:images (downscaled to fit), no external assets, no scripts that fetch — so the reviewer sees the thing on the ticket, not a filename. - The final deliverable (the file the user will actually use — the PDF,
the post, the memo) is attached with
docKind: "deliverable"; the map's Overview highlights it as the Output. - Name what you attached, by title, in the same
post_task_update.
Returning users
If the user comes back mid-run ("where are we?", "continue"): list_tasks {kind: "issue", ready: true} plus get_task on the epic; summarize state
in ≤ 5 lines (done · in review · blocked · next), then either continue the
next ready ticket or say exactly what you're waiting on and where.
Search public maps before charting from scratch — an owner may have shared
something close enough to reuse (search {query} → get_task the hit →
read its Rules/skills as your starting point).
Conventions
- Reference tickets in prose as their
#nticket number, wrapped in their name (wayfinder: refer by name, never a bare id). - One
reviewRequestper decision point — don't batch decisions; the map + spec gate is the one exception, by design. - Model ids in
workStatsare always lower-case (gpt-5, notGPT-5). - Fetching a skill: never guess a raw-file path. List the repository (its
page or
api.github.com/repos/<owner>/<repo>/contents/<dir>), then fetch the exactSKILL.md, and record the URL you actually fetched in the header. - If
save_workrejects a hard rule (epic limits, orphan ticket, bad kind), read the message — it names the rule and how to unblock it.
Changelog
- v1 v10
- feat(skills): v3 tool-name migration + new context skill (CONT-507)
- v1 v1
- Seed context-skills: harness + blog skills, manifest builder, check-skills, CI