Classification Labels
Every pull request must carry at least one area: or type: label, and every issue should
carry exactly one type: label plus a status: label. This page is the full taxonomy behind
those rules.
What enforces what
.github/labeler.yml maps changed-file globs to labels, and the “Verify classification labels”
gate (.github/workflows/labeler.yml) fails a PR that ends up with no area: or type: label.
That gate is a required check on main — see ci.md.
PR ownership is separate: the auto-assign.yml workflow assigns the author and requests reviews
from prior committers of the PR’s changed files (base-branch history), so it needs no per-label
owner config.
For issues, area: labels are optional but encouraged when the affected area is clear — they
carry the same routing signal as on PRs. The issue-triage.yml workflow enforces the
type:/status: part: it adds status: needs triage on open when no status: label is
present, and applies status: needs author plus a one-time comment when an open issue has
zero or multiple type: labels. Closed issues are left alone so label cleanup does not re-nag.
area: (where)
area: build—scripts/**,.mango/**,apps/api/src/lib/{config,runtime-paths}.ts,tsconfig*.json,turbo.jsonc,cliff.toml, rootCargo.{toml,lock},Dockerfile*,.dockerignorearea: cli—apps/api/src/cli/**,apps/api/src/index.ts,apps/api/src/server/**,apps/api/src/lib/{server-state,mango-paths}.ts,crates/mangostudio-launcher/**area: tooling—biome.json,dprint.json,lefthook.yml,opencode.json,.editorconfig,.gitattributes,.gitmessage,.gitignore,.claude/**,.cursor/rules/**,.agents/skills/**area: db—apps/api/src/db/**area: docs—docs/**,*.mdunder any app, package, or crate,LICENSE,.github/**/*.md, issue/PR templatesarea: frontend—apps/frontend/**area: api—apps/api/**area: shared—apps/shared/**area: runtime—apps/shared/src/runtime-contract/**,apps/api/src/services/runtime-client/**,crates/mangostudio-runtime-contract/**,crates/mangostudio-runtime/**area: git—apps/api/src/modules/{git,github}/**,apps/frontend/src/features/workspace/**,apps/shared/src/{git,github}/**area: auth— auth entry points +apps/shared/src/auth/**+tests/browser-smoke/auth-flow.spec.tsarea: chat—apps/api/src/modules/{chats,messages}/**,apps/frontend/src/features/chat/**,apps/shared/src/chat/**area: generation—apps/api/src/modules/generation/**,apps/frontend/src/features/generation/**,apps/frontend/src/services/generation-service.ts,apps/shared/src/generation/**area: gallery— generated-image API + storage + frontend galleryarea: providers— provider adapters,apps/shared/src/catalog/**, model catalog hookarea: connectors— connector modules, secret store,apps/shared/src/connectors/**area: settings— app/provider/tool settings modules + frontend settingsarea: tools— tool registry, tool settings,apps/shared/src/tool-settings/**area: skills—apps/api/src/modules/skills/**,apps/frontend/src/features/settings/skills/**,apps/shared/src/skills/**area: mcp—apps/api/src/services/mcp/**,apps/api/src/modules/mcp-servers/**,crates/mangostudio-runtime/src/mcp/**,apps/frontend/src/features/settings/mcp/**,apps/shared/src/mcp/**area: i18n—apps/shared/src/i18n/**area: components—apps/frontend/src/components/**
type: (what)
type: ci—.github/{workflows,actions,labeler.yml,dependabot.yml}type: dependencies—package.json,bun.lock(also auto-applied by Dependabot for thebun,github-actions,cargo, anddockerecosystems)type: test—**/*.{test,spec}.{ts,tsx},scripts/tests/**,tests/**,playwright.config.tstype: refactor— manual, mirrors therefactorConventional Commit typetype: perf— manual, mirrors theperfConventional Commit typetype: docs— manual, mirrors thedocsConventional Commit typetype: security— manual, security-sensitive changestype: hardening— manual, defensive work closing a class of bugstype: chore— manual, maintenance that fits no other typetype: bug,type: feature,type: migration,type: question— manual / issue-template defaults
status: (issues only)
Issues carry exactly one status: label. No glob applies these — issue-triage.yml seeds the
first one and maintainers move it by hand from there.
status: needs triage— default on open (issue templates and theissue-triage.ymlbackstop)status: needs author— waiting on the reporter; also applied automatically when an open issue has zero or multipletype:labelsstatus: accepted— triaged and agreed, not startedstatus: in progress— actively being worked onstatus: blocked— accepted but waiting on something external
Adding or moving a label
Keep new labels and glob moves in sync between .github/labeler.yml, .github/dependabot.yml,
and this page. scripts/tests/labeler.unit.test.ts asserts that the area:/type: label set
documented here matches the one defined in .github/labeler.yml (plus the manual-only labels
above), so a label added to one and not the other fails the test by name. The glob text on each
bullet and the status: list are not asserted — keep those accurate by hand.
Related
- Required checks and aggregate gates:
ci.md - Contributor workflow:
../guides/contributor-quickstart.md