|
| 1 | +# Title & Label Taxonomy |
| 2 | + |
| 3 | +This document is the **source of truth** for how commits, pull requests and issues |
| 4 | +are titled and labeled in this repository. It is shared across all Filigran |
| 5 | +repositories (FiligranHQ, OpenCTI-Platform, OpenAEV-Platform, XTM-One-Platform, |
| 6 | +OpenGRC-Platform) so the whole ecosystem stays consistent. |
| 7 | + |
| 8 | +The machine-readable companion — each shared label's exact name, color and |
| 9 | +description — lives in [`.github/labels.yml`](labels.yml). Keep the two in sync |
| 10 | +when adding or renaming a shared label. |
| 11 | + |
| 12 | +## 1. Title convention (Conventional Commits) |
| 13 | + |
| 14 | +Every commit, pull request and issue title follows the |
| 15 | +[Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/) |
| 16 | +specification, with a GitHub issue reference appended: |
| 17 | + |
| 18 | +``` |
| 19 | +type(scope?)!?: description (#issue) |
| 20 | +``` |
| 21 | + |
| 22 | +- `type` is one of: `feat`, `fix`, `chore`, `docs`, `style`, `refactor`, `perf`, |
| 23 | + `test`, `build`, `ci`, `revert`. |
| 24 | +- `scope` is optional — a **lowercase** noun in parentheses naming the affected |
| 25 | + area, e.g. `feat(api):`, `fix(frontend):`, `docs(connectors):`. The scope |
| 26 | + **replaces** the old `[backend]` / `[frontend]` / `[component]` bracket |
| 27 | + prefixes, which are **discontinued**. |
| 28 | +- `!` is optional and marks a breaking change (e.g. `feat(api)!: ...`), optionally |
| 29 | + with a `BREAKING CHANGE:` footer. |
| 30 | +- `description` **starts with a lowercase letter** and has **no trailing period**. |
| 31 | + Preserve acronyms and proper nouns: `OpenCTI`, `OpenAEV`, `XTM One`, `OpenGRC`, |
| 32 | + `STIX`, `LLM`, `Docker`, `Redis`. |
| 33 | +- `(#issue)` is a **required reference on pull request titles** (the PR title |
| 34 | + becomes the squash-merge commit, so the reference lands on `master`/`main`). |
| 35 | + Issue titles omit it (the issue *is* the reference). |
| 36 | + |
| 37 | +Enforcement is preventive and lives at the organization (enterprise) level; the |
| 38 | +[`FiligranHQ/filigran-ci-tools` `pr-title-check`](https://github.com/FiligranHQ/filigran-ci-tools/tree/main/actions/pr-title-check) |
| 39 | +action validates the same format. **Renovate** pull requests are exempt. |
| 40 | + |
| 41 | +**Examples** |
| 42 | + |
| 43 | +``` |
| 44 | +feat(connectors): add CrowdStrike Falcon endpoint security integration (#1234) |
| 45 | +fix(frontend): correct file context limit handling (#1235) |
| 46 | +docs: update deployment guide (#1236) |
| 47 | +chore(ci): migrate dependency management to uv (#1237) |
| 48 | +feat(api)!: remove deprecated v1 endpoints (#1238) |
| 49 | +``` |
| 50 | + |
| 51 | +## 2. Type label (one per issue) |
| 52 | + |
| 53 | +The title `type` maps to a primary type label: |
| 54 | + |
| 55 | +| Title prefix | Type label | Color | |
| 56 | +|--------------|-----------------|--------| |
| 57 | +| `feat:` | `feature` | indigo | |
| 58 | +| `fix:` | `bug` | red | |
| 59 | +| `docs:` | `documentation` | blue | |
| 60 | + |
| 61 | +`chore:`, `style:`, `ci:`, `build:`, `perf:`, `refactor:`, `test:` and `revert:` |
| 62 | +are valid types; they do not each require a dedicated label (use a repository |
| 63 | +area/scope label where useful). `security` is a **label** (applied on top of the |
| 64 | +type, e.g. a `fix:` that closes a vulnerability), not a title type. |
| 65 | + |
| 66 | +## 3. Workflow & ownership labels |
| 67 | + |
| 68 | +- **Triage**: `needs triage`, `needs more info`, `solved`, `duplicate`, |
| 69 | + `wontfix`, `question`. |
| 70 | +- **Severity / size**: `critical`, `epic`, `tiny`, `regression`, |
| 71 | + `breaking-change`. |
| 72 | +- **Ownership**: `filigran team`, `community`, `community support`, |
| 73 | + `filigran support`, `partner support`, `enterprise edition`. |
| 74 | +- **Security**: `security`. |
| 75 | +- **CLA**: `cla:pending`, `cla:signed`, `cla:exempt`. |
| 76 | +- **Automation**: `dependencies`, `javascript`, `python`, `java`, `do not merge`. |
| 77 | + |
| 78 | +See [`.github/labels.yml`](labels.yml) for the exact colors and descriptions. |
| 79 | + |
| 80 | +## 4. Area / scope labels (optional, may have several) |
| 81 | + |
| 82 | +On top of the shared labels above, repositories define their own area/scope |
| 83 | +labels (e.g. `frontend`, `backend`, `connector: <name>`, `collector: <name>`, |
| 84 | +`agents`, `authentication`). They add routing context and an issue may carry |
| 85 | +more than one. They are not listed in `labels.yml`. |
| 86 | + |
| 87 | +## 5. Deprecated labels — do not use |
| 88 | + |
| 89 | +- `enhancement` — use `feature`. |
| 90 | +- `feature request` / `feature-request` — use `feature` (+ `needs triage`). |
| 91 | +- `improvement` / `nice-to-have` — use `feature` + area labels. |
| 92 | + |
| 93 | +## 6. Quick checklist for a new issue / PR |
| 94 | + |
| 95 | +- [ ] Title follows `type(scope?)!?: description` (lowercase, no trailing period) |
| 96 | +- [ ] Pull request titles end with the `(#issue)` reference |
| 97 | +- [ ] Exactly one primary type label matches the title prefix |
| 98 | +- [ ] Area labels added where useful |
| 99 | +- [ ] No deprecated labels |
| 100 | +- [ ] Commits are signed and the PR is linked to an issue |
0 commit comments