Workspace context
The typed company profile and typed assets every AI action resolves against, and the purposes that require each section.
Workspace context is the typed half of the Knowledge Graph: a structured company profile plus typed assets. Assets and wiki pages are the same rows in the same store — oxygen context assets upsert and oxygen knowledge page upsert are two names for one write, and /context redirects to /knowledge.
Profile sections
Sections are merged independently, so an update touching only icp leaves the rest alone.
| Section | Fields |
|---|---|
company | name, domain, category, geography |
offering | products, value propositions, use cases |
icp | target accounts, personas, disqualifiers |
market | competitors, alternatives, segments |
gtm_stack | CRM, outbound tools, channels |
custom | tone, user preferences, constraints |
Asset types
Type defaults to other on create.
| Asset kind | Purpose |
|---|---|
playbook | Operational guides for a GTM motion |
strategy | High-level GTM approach |
campaign | Campaign brief, target segment, offers, and copy direction |
positioning | Messaging, differentiators, objections, and proof points |
brand | Brand guidelines; the canonical one is injected into AI copy generation |
voice | How you sound; the canonical one is injected into AI copy generation |
persona | Buyer or user profile |
competitor | Notes on a market rival |
message_playbook | Outreach message patterns; the canonical one backs live outreach |
research_note | Ad-hoc research output (e.g. from onboarding) |
other | Flexible supporting context |
--default (and oxygen context assets set-default) pins an asset as the canonical instance of its type, and canonical brand, voice, and positioning are injected into AI copy generation. The canonical instance of voice, brand, positioning, playbook, or message_playbook is live copy, so it changes only through an approved proposal, whether the asset is a file-backed page or not. Editing, retyping or archiving it does not save — it files an approval proposal and fails with knowledge_approval_required. --default on one of those types saves the asset unpinned and returns pin.ok: false with the proposal_id to approve (oxygen knowledge proposals approve <id>); set-default files the same pin proposal. Other types pin at once. See the approval gate. Unpinned drafts of those types edit freely.
Resolving
oxygen context resolve --purpose general --require-ready --jsonThe resolver returns a task-specific, revision-pinned bundle. Each purpose requires different sections, and --require-ready turns a gap into a conflict error instead of a partial bundle:
--purpose | Required sections |
|---|---|
onboarding | none; returns available research and current context |
general | company, offering, icp, market, gtm_stack |
lead_sourcing | company, offering, icp, market, gtm_stack |
workflow_design | company, offering, icp, gtm_stack |
outbound_copy | company, offering, icp |
qualification | offering, icp, market |
It also carries up to --max-assets assets (default 10, hard cap 50). If it returns context_missing or reports missing_required_context, fill the named sections before resuming the work that needed them.
With --purpose onboarding, the result also includes workspace, a read-only snapshot of what already runs and what is connected. campaigns counts sequences (and how many are active), workflows (and how many are enabled), signal sources, posts and agents; data counts tables, CRM records and objects, and wiki pages; access counts LinkedIn accounts that are not disconnected and sending mailboxes, and names connected integrations. It contains counts and integration names only and spends no credits. A count Oxygen could not read is null and is listed in workspace.degraded, so it is never shown as zero. It also includes plays: workspace, blank when nothing is connected or running yet (the agent then skips the warm-lead reads) and has_sources otherwise; leads, the free reads that find your warmest leads in order (open deals, unanswered interested replies, recent visitors, viewers, engagers and followers, your captured LinkedIn network, people posting about the problem, then net-new ICP matches), each with its CLI command and MCP call; the featured plays from the Recipe catalog; and the ranked catalog search.
The onboarding block holds the research brief, the GTM hypotheses (ICP, offers and opportunities, or research_note when the research page lists hypotheses without sorting them), unknowns and the cited evidence. With no hypotheses, hypothesesReason says why: no research yet, a later profile change took precedence, or the research stated none. A brief that is too long is shortened between words and ends by naming where the full text is: the company profile or the company-research Knowledge page. context.available gives each brand, positioning and voice page a state of canonical, draft or active; only canonical copy grounds AI-written copy, and context.missing names each type that has none. In the ChatGPT app, assets carry each page's summary instead of its body, and plays keeps only the hint and the featured plays.
Bootstrapping
The company domain entered at workspace creation starts one background research pass, funded by Oxygen. A company with no website enters its LinkedIn company page instead, and the pass starts from that page. It gathers LinkedIn company and website evidence, attempts a bounded match for the signup creator, and saves company facts with a cited research note. Suggested ICPs, offers, and opportunities remain separate hypotheses. Unresolved person matches do not block company research.
Your agent uses this context like a GTM consultant and takes you to a launched campaign. It first tells you in a few lines what the research found about your company, drafts your ICP and asks what you want to build first. Then it guides the Get started steps one at a time: your first leads (from your warmest people when you have connected sources, such as customers, open deals, unanswered replies, your network and engagers, or else from free searches of your ICP or a list you already have), a first sequence, the LinkedIn account or mailbox it sends from, and the launch. In a new workspace with nothing connected it skips the warm-lead search and answers in a few lines. Plays come after, to keep your list full. You can correct its assumptions as you work; corrections update durable context and take precedence over research. The oxygen-onboarding skill guides this conversation, while oxygen-knowledge carries the deeper context-bootstrap procedure.
oxygen skills install --agents codex claude-code cursor --skill '*' --json
oxygen context resolve --purpose onboarding --json
oxygen knowledge bootstrap status --jsonFor an explicit company-research rerun, oxygen knowledge bootstrap previews the provider plan, costs, and writes without spending. Manual execution requires --live --max-credits <credits> and uses workspace credits; an existing marker also requires --force. It writes company facts and separate hypotheses, preserves the offering, ICP, and market profile sections, and does not repeat the automatic creator lookup. Research does not authorize outreach or execute a suggested play.
Working with context
oxygen context profile get --json
oxygen context profile update \
--data-json '{"icp":{"segments":["B2B SaaS at $1M-$20M ARR"],"personas":["Founder","Revenue leader"]}}' \
--summary "Refine ICP" \
--json
oxygen context assets list --type playbook --json
oxygen context assets search --query "objection handling" --json
oxygen context assets upsert --type playbook --title "Outbound Q1" --body "..." --json
oxygen context assets archive <asset-id> --jsonNone of these spend credits or call a provider.
Related
- Knowledge Graph — the same store as wiki pages, with revisions, search, the link graph, and the proposal queue.
- Blueprints — a blueprint declares the context keys it expects (
required_context_keys), reported byblueprints preflight.