Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f533d87
chore: gate factory launch
hongyi-chen Aug 12, 2026
8d2ee8e
Merge branch 'main' into hyc/factory-launch
hongyi-chen Aug 12, 2026
0254fb7
Factory launch (8/18): Automation Platform rename infra + Factories t…
rachaelrenk Aug 14, 2026
f47f16b
docs(factories): add launch documentation foundation (#537)
hongyi-chen Aug 15, 2026
f52f6e9
docs: add Warp Factories to docs landing pages (#538)
hongyi-chen Aug 16, 2026
c6f4a94
docs(factories): document factory agents (#518)
hongyi-chen Aug 16, 2026
73c4f6b
Restyle the Factories "Early Access" topic badge and fix nav wrap (#543)
hongyi-chen Aug 17, 2026
c59b094
Anchor the active topic tab underline to the header divider (#545)
hongyi-chen Aug 17, 2026
9a219f1
docs(factories): document Slack integration (#525)
hongyi-chen Aug 17, 2026
e5f9c0e
docs(factories): document Jira integration (#528)
hongyi-chen Aug 17, 2026
0b29d4d
docs(factories): document the control room (#531)
hongyi-chen Aug 17, 2026
e418216
docs(factories): clarify Jira access-scoping gap is coming, not avail…
warp-agent-staging[bot] Aug 17, 2026
1c36c9b
docs(factories): document Factory MCP (#521)
hongyi-chen Aug 17, 2026
aebe7ba
docs(factories): document measurement and improvement (#522)
hongyi-chen Aug 17, 2026
908e563
docs(factories): use root-absolute links on merged factory pages (#550)
hongyi-chen Aug 17, 2026
1c835b4
Merge branch 'main' into hyc/factory-launch
hongyi-chen Aug 17, 2026
cdc0d66
docs(factories): document integrations and intake (#520)
hongyi-chen Aug 17, 2026
34a1697
docs(factories): document Linear integration (#527)
hongyi-chen Aug 17, 2026
a9c5f5a
docs(factories): document infrastructure and security (#523)
hongyi-chen Aug 17, 2026
b34470a
docs(factories): add automation filters page (#551)
hongyi-chen Aug 17, 2026
f302992
docs(factories): apply remaining Slack page review feedback (#552)
liliwilson Aug 17, 2026
0875060
docs(factories): add concise overview and workflow (#516)
hongyi-chen Aug 17, 2026
510c16c
docs: rename Oz to Automation Platform (#542)
rachaelrenk Aug 17, 2026
aab83f5
docs(factories): add quickstart (#517)
hongyi-chen Aug 17, 2026
a4cffcd
docs(factories): document definitions as code (#519)
hongyi-chen Aug 17, 2026
f3941d6
docs(factories): make sidebar group and page names consistent with th…
rachaelrenk Aug 17, 2026
3604bb0
docs(factories): full content pass over the launch stack — link fixes…
hongyi-chen Aug 17, 2026
05298c0
docs(factories): fix quickstart first-run entry point and stale forem…
hongyi-chen Aug 18, 2026
7d4f132
docs(factories): deep content pass — accuracy against product, tone, …
hongyi-chen Aug 18, 2026
1c3d96a
docs(factories): document GitHub integration (#526)
hongyi-chen Aug 18, 2026
8ebd4f8
docs(factories): alignment pass over #508 — Foreman name bridge and g…
guyscherzer8 Aug 18, 2026
4aeb6ac
docs(factories): document GitLab integration (#549)
hongyi-chen Aug 18, 2026
ab5d9ea
Merge branch 'main' into hyc/factory-launch
hongyi-chen Aug 18, 2026
8f19bf2
docs(factories): address launch review feedback (#563)
hongyi-chen Aug 18, 2026
df443f3
docs(factories): launch polish pass (#565)
hongyi-chen Aug 18, 2026
883027f
docs(factories): apply GitHub page review follow-ups from #526 (#562)
hongyi-chen Aug 18, 2026
de37a61
docs(factories): clarity sweep over the launch pages (#566)
hongyi-chen Aug 18, 2026
4e340b3
docs: copy polish pass over Warp Factories launch docs
hongyi-chen Aug 18, 2026
8558fe8
docs(factories): add section on the relation to the Automation Platfo…
hongyi-chen Aug 18, 2026
b53d5d8
docs(platform): fix outdated integration pages after warp-server audi…
liliwilson Aug 18, 2026
da0d477
docs(factories): apply Aloke's Loom review (#569)
hongyi-chen Aug 18, 2026
a279a5f
docs(factories): final copy pass for launch (#571)
hongyi-chen Aug 18, 2026
81df39c
docs(factories): call out paid GitLab plan requirement (#567)
liliwilson Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 120 additions & 16 deletions .agents/references/terminology.md

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions .agents/skills/style_lint/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ python3 .agents/skills/style_lint/style_lint.py --all --fix --create-pr
- **Deprecated terminology**: "whitelist" (→ "allowlist"), "blacklist"/"blocklist" (→ "denylist")
- **External product names**: "Github" (→ "GitHub"), "github actions" (→ "GitHub Actions"), "MacOS" (→ "macOS"), "A.I." (→ "AI")
- **Unrecognized terms** (warning): Bolded terms that look like product names but aren't in `terminology.md`. Flags candidates for glossary addition — not errors, just suggestions.
- **Warp Factories naming**: A bare capitalized "Factory" used as a proper noun. "Warp Factories" is the product and is written in full; an individual "factory" is lowercase. Sentence-, heading-, bullet-, quote-, and cell-initial capitals are positional and stay, as do frontmatter titles and labels, the shipped feature name "Factory MCP", and verbatim UI strings such as **Factory name** and **Add your Factory to your team**. Regression cases live in `test_factory_proper_noun.py`.
- **Hardcoded product name strings**: Product name strings that have a corresponding key in `src/data/vars.ts` but appear as literal text rather than variable syntax. Reports instances of known strings like "Oz CLI", "Oz web app", "oz.warp.dev", "Oz dashboard", "Oz run" (any value currently in `src/data/vars.ts`) in body prose and frontmatter. These are flagged as `⚠️ [IMPORTANT]` in PR context and reported (not auto-fixed) — they should use `{VARS.KEY}` in prose and `{{TOKEN}}` in frontmatter.

## Auto-fix behavior
Expand All @@ -72,6 +73,16 @@ When run with `--fix`:

This skill checks broader formatting and terminology. The `validate_ui_refs` skill validates UI paths and Command Palette names against the warp-internal codebase. They complement each other with no overlap. Both can run in scheduled cloud agent workflows.

## Tests

Two checks have regression suites, because both are narrow rules where the hard
part is not firing on legitimate text. Run them after touching either check:

```bash
python3 .agents/skills/style_lint/test_platform_determiner.py
python3 .agents/skills/style_lint/test_factory_proper_noun.py
```

## Dependencies

Requires Python 3.7+. Optional: `requests` (for Slack notifications), `gh` CLI (for PR creation).
Expand Down
381 changes: 365 additions & 16 deletions .agents/skills/style_lint/style_lint.py

Large diffs are not rendered by default.

100 changes: 100 additions & 0 deletions .agents/skills/style_lint/test_factory_proper_noun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#!/usr/bin/env python3
"""Regression cases for check_factory_proper_noun.

Run from the repo root:
python3 .agents/skills/style_lint/test_factory_proper_noun.py

The rule is narrow: "Warp Factories" is the product, an individual "factory" is
a lowercase common noun, and a bare capitalized "Factory" is never a proper
noun. Almost all of the difficulty is in NOT firing, because a capital F is
usually positional rather than a name -- headings, sidebar labels, bullets,
table cells, quoted terms, and link text all start with one legitimately.

The first draft of this check produced 9 hits across the docs and 8 of them
were wrong: heading-initial ("## Factory-definition pull request checks"),
list-initial link text ("* [Factory dashboard](...)"), frontmatter labels, a
quoted term at the start of a sentence, a verbatim UI string ("Add your Factory
to your team"), and a reference to Factory.ai, the company behind Droid. Each
of those is a case below. If you touch the check, run this first.
"""
import importlib.util
import pathlib
import sys

HERE = pathlib.Path(__file__).parent
spec = importlib.util.spec_from_file_location("style_lint", HERE / "style_lint.py")
style_lint = importlib.util.module_from_spec(spec)
spec.loader.exec_module(style_lint)

CASES = [
# (text, should_flag, description)
# --- genuine proper-noun uses ---
("See [Factory agents](/factories/factory-agents/) for the roles.", True,
"mid-sentence link text"),
("Every Factory gets its own Slack app.", True,
"mid-sentence, standing in for the product"),
("Runs started by the Factory are tracked.", True,
"definite article plus a capital"),
("Review the Factory metrics before deciding.", True,
"mid-sentence attributive use of the banned form"),
# --- the product name, written correctly ---
("Warp Factories is in Early Access.", False, "the product name"),
("Connect Warp Factories to your repository.", False, "product name mid-sentence"),
# --- positional capitals ---
("## Factory-definition pull request checks", False, "heading-initial"),
("### Factory agents", False, "subheading-initial"),
("* [Factory dashboard](/factories/factory-dashboard/) - the surface.", False,
"list-initial link text"),
("Factory setup doesn't choose models for you.", False, "sentence-initial"),
('"Factory dashboard" names the whole surface.', False, "quoted term, sentence-initial"),
("| **Factory definition** | The definition files |", False, "table-cell-initial"),
("The tab is read-only. Factory owners can still edit it.", False,
"initial after a sentence boundary"),
# --- sanctioned exceptions ---
("Send work through the Factory MCP.", False, "Factory MCP is the shipped feature name"),
("Enter a **Factory name**, such as `Payments`.", False, "verbatim UI field label"),
("The **Factory definition** tab lists the files.", False, "verbatim UI tab label"),
("1. In factory setup, go to **Add your Factory to your team**.", False,
"verbatim UI string, allowlisted as a phrase"),
("* **Droid** — Factory's CLI coding agent", False,
"Factory.ai, an unrelated company"),
# --- non-prose ---
("Fetch `/api/v1/Factory/source` for the definition.", False, "inline code"),
('<img alt="Factory settings page" src="x.png" />', False, "HTML attribute"),
]

FRONTMATTER_CASE = (
['---', 'title: Factory dashboard', 'sidebar:', ' label: "Factory agents"', '---',
'The factory dashboard is the web app for one factory.'],
False,
"frontmatter titles and labels are headline-style",
)


def main() -> int:
failures = 0
for text, should_flag, description in CASES:
flagged = bool(style_lint.check_factory_proper_noun(text.split("\n"), "test.mdx"))
ok = flagged == should_flag
if not ok:
failures += 1
print(f" [{'PASS' if ok else 'FAIL'}] {description:<48} flagged={flagged}")

lines, should_flag, description = FRONTMATTER_CASE
flagged = bool(style_lint.check_factory_proper_noun(lines, "test.mdx"))
ok = flagged == should_flag
if not ok:
failures += 1
print(f" [{'PASS' if ok else 'FAIL'}] {description:<48} flagged={flagged}")

total = len(CASES) + 1
print()
if failures:
print(f"{failures} of {total} cases regressed.")
return 1
print(f"All {total} cases behave correctly.")
return 0


if __name__ == "__main__":
sys.exit(main())
62 changes: 62 additions & 0 deletions .agents/skills/style_lint/test_platform_determiner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""Regression cases for check_platform_determiner.

Run from the repo root:
python3 .agents/skills/style_lint/test_platform_determiner.py

The check has to separate three referential positions (possessive,
prepositional, subject) from several attributive ones that are correctly bare.
The ordering between those tests is load-bearing and easy to get wrong: an
earlier draft applied the attributive exemption before classifying position,
which silently stopped flagging "{...} provides ..." because "provides" is
just a lowercase word to a regex. A later draft flagged "automated {...} runs"
because "runs" is in the subject-verb list even though it is a noun there.

Both bugs are covered below. If you touch the check, run this first.
"""
import importlib.util
import pathlib
import sys

HERE = pathlib.Path(__file__).parent
spec = importlib.util.spec_from_file_location("style_lint", HERE / "style_lint.py")
style_lint = importlib.util.module_from_spec(spec)
spec.loader.exec_module(style_lint)

T = "{VARS.WARP_AUTOMATION_PLATFORM}"

CASES = [
# (text, should_flag, description)
(f"Run agents with {T}.", True, "prepositional - needs the article"),
(f"{T} provides the CLI and API.", True, "clause subject - needs the article"),
(f"Connects to {T}'s backend.", True, "possessive - needs the article"),
(f"Handled by {T}, then reported.", True, "prepositional before a comma"),
(f"Run agents with the {T}.", False, "determiner already present"),
(f"Use {T} orchestration for this.", False, "attributive - modifies a noun"),
(f"An environment for automated {T} runs.", False, "attributive - 'runs' is a noun here"),
(f"Available in {T} cloud environments.", False, "attributive - modifies a noun"),
(f"Deploy on {T}-hosted infrastructure.", False, "hyphenated compound"),
(f"* **{T}** - the platform.", False, "bold term lead in a definition list"),
(f"available with the\n{T} for teams.", False, "determiner on the previous line"),
]


def main() -> int:
failures = 0
for text, should_flag, description in CASES:
flagged = bool(style_lint.check_platform_determiner(text.split("\n"), "test.mdx"))
ok = flagged == should_flag
if not ok:
failures += 1
print(f" [{'PASS' if ok else 'FAIL'}] {description:<48} flagged={flagged}")

print()
if failures:
print(f"{failures} of {len(CASES)} cases regressed.")
return 1
print(f"All {len(CASES)} cases behave correctly.")
return 0


if __name__ == "__main__":
sys.exit(main())
60 changes: 45 additions & 15 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Avoid words that are ambiguous between singular and plural.
- **Serial comma**: Always use it. "Environments, integrations, and schedules" — not "Environments, integrations and schedules."
- **Contractions**: Allowed and encouraged to match our approachable tone. Use "you're," "don't," "it's," "can't." Exception: avoid contractions in error messages or formal warnings.
- **Tense**: Use present tense to describe how things work ("Warp indexes your codebase"). Use imperative for instructions ("Configure your environment").
- **Person**: Use second person ("you") for instructions. Avoid first person plural ("we") in procedural content. First person is acceptable in conceptual or narrative text when referring to Warp as a company ("We designed Oz to...").
- **Person**: Use second person ("you") for instructions. Avoid first person plural ("we") in procedural content. First person is acceptable in conceptual or narrative text when referring to Warp as a company ("We designed the Automation Platform to...").

### Inclusive language
- Use gender-neutral pronouns ("they/them") for unknown users
Expand Down Expand Up @@ -116,7 +116,7 @@ Every description answers "what will I get from this page?" The shape of that an
- ✅ `Environments give cloud agents the same toolchain and setup on every run, no matter what triggers them.`
- ❌ `Learn about environments and why they are useful.`
- **Procedural** - Say what task the reader will complete. Start with an imperative verb.
- ✅ `Connect Slack to Oz so mentions and channel messages can trigger cloud agent runs.`
- ✅ `Connect Slack to the Automation Platform so mentions and channel messages can trigger cloud agent runs.`
- ❌ `This page explains the Slack integration setup process.`
- **Quickstart** - Say what the reader ends up with, plus the time budget. Start with an imperative verb.
- ✅ `Install the Warp Agent CLI, log in, and run your first agent conversation in about five minutes.`
Expand Down Expand Up @@ -639,7 +639,7 @@ Product feature names retain their standard capitalization. Match the exact casi
- **Codebase Context** - Warp indexes your Git-tracked codebase to help Agents understand your code.
- **Admin Panel** - Team management surface for controlling members, roles, and billing.
- **Agent Management Panel** - Interface for viewing and managing running agents (not "agent dashboard" or "agent manager").
- **Agent Memory** - Persistent, cross-harness memory layer for Oz agents that captures durable facts, decisions, and outcomes across conversations (currently in research preview). Capitalize as a feature name; use lowercase "memory store" for individual stores.
- **Agent Memory** - Persistent, cross-harness memory layer for cloud agents that captures durable facts, decisions, and outcomes across conversations (currently in research preview). Capitalize as a feature name; use lowercase "memory store" for individual stores.
- **Handoff** - Feature for moving agent work between a local Warp session and the cloud, or continuing a finished cloud run; supports local-to-cloud, cloud-to-cloud, and cloud-to-local. Capitalize as a feature name; lowercase "hand off" only as a verb.

### Capitalizing "agent"
Expand All @@ -662,24 +662,34 @@ This is the single most drifted term in the docs, so the rule is narrow on purpo
❌ "Profiles control how Warp's agents behave." (ambiguous)
❌ "Warp's agent can run commands." (ambiguous)

### Oz terminology
### Automation Platform terminology

#### Warp Agent vs Oz
Renamed from "Oz" on 2026-08-18. The `oz` CLI binary and the Oz v1 web app at `oz.warp.dev` keep the Oz name until 2026-09-15 and are not stale in the meantime. See `.agents/references/terminology.md` → "What still says Oz" for the full holdout list.

#### The article rule
"Oz" was a proper noun and read correctly bare. "Automation Platform" is a common-noun phrase, so it needs a definite article in referential positions. This is the most common mistake when writing about the platform.

- **Referential** (subject, object, possessor) takes "the": "with the Automation Platform", "The Automation Platform provides", "the Automation Platform's backend".
- **Attributive** (modifying a following noun) stays bare: "Automation Platform settings", "Automation Platform-hosted", "Automation Platform overview".

Write the name as `{VARS.WARP_AUTOMATION_PLATFORM}` in body prose or `{{WARP_AUTOMATION_PLATFORM}}` in frontmatter, never as a literal string, and keep the article outside the token. `style_lint` enforces both halves: `hardcoded-var` catches the literal, `platform-determiner` catches the missing article.

#### Warp Agent vs the Automation Platform
- **Warp Agent** — Warp's built-in agent harness. Use "Warp Agent" when specifically referring to the built-in harness, especially when contrasting with third-party agents (Claude Code, Codex, etc.), or when referencing the Settings label (**Settings** > **Agents** > **Warp Agent**).
- **Oz is the platform, not the agent.** Never introduce Oz as "Warp's agent" or equate the two. Oz runs and coordinates agents; the Warp Agent is the agent.
- **Oz** — Warp's programmable platform for running and coordinating agents at scale
- There is typically one Warp environment per user session. Oz can run many agents concurrently, across machines, repos, and teams.
- **The Automation Platform is the platform, not the agent.** Never introduce it as "Warp's agent" or equate the two. The Automation Platform runs and coordinates agents; the Warp Agent is the agent.
- **Automation Platform** — Warp's programmable platform for running and coordinating agents at scale
- There is typically one Warp environment per user session. The Automation Platform can run many agents concurrently, across machines, repos, and teams.

#### Core terms
- **agent** - A combination of agent instructions (skill or prompt), trigger (cron, webhook, manual), environment (local, cloud), profile, and host. Agents can be local or cloud. Use lowercase "agent" in most contexts; use "Warp Agent" only when referring specifically to the built-in Warp harness.
- **cloud agent** - An agent running in the cloud, from a trigger, schedule, or started from someone's local machine
- **subagent** - A child agent created by a parent agent to parallelize or delegate work
- **conversation** - An interactive execution lifecycle within the Warp Terminal, regardless of whether it's local or in the cloud
- **Oz** - Warp's programmable platform for running and coordinating agents at scale
- **Oz run** - A single execution lifecycle of an agent, including actions, outputs, and logs. Always cloud-based.
- **Automation Platform** - Warp's programmable platform for running and coordinating agents at scale
- **cloud agent run** - A single execution lifecycle of an agent, including actions, outputs, and logs. Always cloud-based. Use `{VARS.PLATFORM_RUN}`. On factory-specific pages, write "factory run" directly.
- **Environment** - The execution context for an agent, including repo access, dependencies, secrets, compute, and runtime configuration
- **Oz dashboard** - The app surface to manage all Oz runs, unified across the Warp app and web
- **Oz web app** - The web app for configuring agents and managing runs
- **cloud agent dashboard** - The app surface to manage all runs, unified across the Warp app and web. Use `{VARS.DASHBOARD}`. On factory-specific pages, write "factory dashboard" directly.
- **Oz web app** - The web app for configuring agents and managing runs. Holds the Oz name until 2026-09-15; use `{VARS.WEB_APP}`.

#### Oz CLI commands
- `oz agent run` - Run a local agent
Expand All @@ -691,9 +701,12 @@ This is the single most drifted term in the docs, so the rule is narrow on purpo
- `oz run list/get` - Get info on cloud agent runs

#### Preferred phrases
- ✅ "Ask Oz to..."
- ✅ "Oz can help you..."
- ✅ "What would you like Oz to do?"
The platform is not something you address — it runs and coordinates agents, and the agent is what you ask. The older "Ask Oz to..." phrasings worked only because "Oz" was doing double duty as both platform and assistant, which the rename ended.

- ✅ "Ask the agent to..."
- ✅ "Run an agent on the Automation Platform"
- ✅ "The Automation Platform can run this on a schedule"
- ❌ "Ask the Automation Platform to..." — you ask an agent, not a platform

#### Terms to avoid
- ❌ "Oz agent" / "Oz agents" → Use "agent" / "agents" (or "Warp Agent" / "Warp Agents" when referring to the built-in harness)
Expand All @@ -708,6 +721,23 @@ This is the single most drifted term in the docs, so the rule is narrow on purpo
- ❌ "Ambient Agents" / "ambient agents" → Use "Cloud Agents" / "cloud agents" ("ambient" is no longer a product term)
- ❌ "Agent Modality" or "agent modality" → Use "Terminal and Agent modes" (this was an internal name, not user-facing)
- ❌ "agent identity" / "agent identities" → Use "agent," "agents," or "cloud agent(s)" in user-facing copy. Use legacy API names such as `agent_identity_uid` or `/agent/identities` only when documenting the exact field, path, or compatibility behavior.
- ❌ A bare "Automation Platform" in a referential position → Add "the". See [The article rule](#the-article-rule).
- ❌ The literal string "Automation Platform" in prose → Use `{VARS.WARP_AUTOMATION_PLATFORM}` / `{{WARP_AUTOMATION_PLATFORM}}`.

### Warp Factories terminology

This works like GitHub Actions. **Warp Factories** is the product and is always written in full. An individual **factory** is a common noun and is always lowercase. A bare capitalized **Factory** is never a proper noun.

- ✅ "Warp Factories is in Early Access" (the product)
- ✅ "your factory", "each factory's agents", "factory dashboard", "factory run", "factory agents"
- ❌ "the Factory", "your Factory", "Factory runs", "Factory metrics"
- ❌ "Factories" on its own to mean the product → write "Warp Factories"

Sentence-initial capitals are positional, not proper nouns — a heading or sidebar label may begin "Factory agents" for the same reason it would begin "Cloud agents." The rule governs mid-sentence prose. `style_lint` enforces it with the `factory-proper-noun` check.

**Exceptions, quoted as they ship:** **Factory MCP** is the feature's own name (the server registers as `warp-factory`). Verbatim UI strings — **Factory name**, **Foreman name**, **Factory integrations**, **Add your Factory to your team**, "Factory running!", and the **Factory definition** sidebar label — are quoted as the app renders them.

See `.agents/references/terminology.md` → "Warp Factories terminology" for the full glossary.

### Technical terms
- **AI** (not "A.I.")
Expand Down
Loading
Loading