Repository: actions/stale
Pull request #330 (2021-02-23 05:05:51)

Bump @typescript-eslint/parser from 4.15.1 to 4.15.2
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.15.1 to 4.15.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases"><code>@​typescript-eslint/parser's releases</code></a>.</em></p>
<blockquote>
<h2>v4.15.2</h2>
<h2><a href="https://github.com/typescript-eslint/typescript-eslint/compare/v4.15.1...v4.15.2">4.15.2</a> (2021-02-22)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>typescript-estree:</strong> correct issues in AST definition (<a href="https://github-redirect.dependabot.com/typescript-eslint/typescript-eslint/issues/3083">#3083</a>) (<a href="https://github.com/typescript-eslint/typescript-eslint/commit/509a11749f85400a01e9fecfecd12871ce562d3d">509a117</a>)</li>
<li>add missing intrinsic keyword node to AST (<a href="https://github-redirect.dependabot.com/typescript-eslint/typescript-eslint/issues/3081">#3081</a>) (<a href="https://github.com/typescript-eslint/typescript-eslint/commit/409bf0bb3e2ac4d8782408d436ebdefb42dba38b">409bf0b</a>)</li>
<li><strong>eslint-plugin:</strong> [no-var-requires] report when used in type assertion (<a href="https://github-redirect.dependabot.com/typescript-eslint/typescript-eslint/issues/3074">#3074</a>) (<a href="https://github.com/typescript-eslint/typescript-eslint/commit/763a2520bfea09c3b6252ea36bc3ff10b05eca6c">763a252</a>)</li>
<li>correct test names on windows for semantic-diagnostics-enabled (<a href="https://github-redirect.dependabot.com/typescript-eslint/typescript-eslint/issues/3060">#3060</a>) (<a href="https://github.com/typescript-eslint/typescript-eslint/commit/885780d4a2b07e418256b7323d76b18453c14a50">885780d</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md"><code>@​typescript-eslint/parser's changelog</code></a>.</em></p>
<blockquote>
<h2><a href="https://github.com/typescript-eslint/typescript-eslint/compare/v4.15.1...v4.15.2">4.15.2</a> (2021-02-22)</h2>
<p><strong>Note:</strong> Version bump only for package @typescript-eslint/parser</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/fc774f637782f8815616592d6d18be933224c4a2"><code>fc774f6</code></a> chore: publish v4.15.2</li>
<li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v4.15.2/packages/parser">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=4.15.1&new-version=4.15.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 34b5a69..bfe57d6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,3 +17,29 @@ Run the tests :heavy_check_mark:
 ```bash
 $ npm test
 ```
+
+Run the tests and display only the first failing tests :heavy_check_mark:
+
+```bash
+$ npm test:only-errors
+```
+
+Run the tests with the watch mode :heavy_check_mark:
+
+```bash
+$ npm test:watch
+```
+
+Run the linter and fix (almost) every issue for you :heavy_check_mark:
+
+```bash
+$ npm lint:all:fix
+```
+
+### Before creating a PR
+
+Build, lint, package and test everything.
+
+```bash
+$ npm all
+```
diff --git a/README.md b/README.md
index 5c1852e..97b4557 100644
--- a/README.md
+++ b/README.md
@@ -17,19 +17,15 @@ Warns and then closes issues and PRs that have had no activity for a specified a
 | `stale-pr-message`            | Message to post on the stale PR.                                                                                | Optional |
 | `close-issue-message`         | Message to post on the stale issue while closing it.                                                            | Optional |
 | `close-pr-message`            | Message to post on the stale PR while closing it.                                                               | Optional |
-| `stale-issue-label`           | Label to apply on the stale issue. _Defaults to **stale**_                                                      | Optional |
-| `close-issue-label`           | Label to apply on closing issue.                                                                                | Optional |
-| `stale-pr-label`              | Label to apply on the stale PR.                                                                                 | Optional |
-| `close-pr-label`              | Label to apply on the closing PR.                                                                               | Optional |
+| `stale-issue-label`           | Label to apply on the stale issue. _Defaults to **Stale**_                                                      | Optional |
+| `close-issue-label`           | Label to apply on closing issue (automatically removed if no longer closed nor locked).                         | Optional |
+| `stale-pr-label`              | Label to apply on the stale PR. _Defaults to **Stale**_                                                         | Optional |
+| `close-pr-label`              | Label to apply on the closing PR (automatically removed if no longer closed nor locked).                        | Optional |
 | `exempt-issue-labels`         | Labels on an issue exempted from being marked as stale.                                                         | Optional |
 | `exempt-pr-labels`            | Labels on the PR exempted from being marked as stale.                                                           | Optional |
-| `exempt-milestones`           | Milestones on an issue or a PR exempted from being marked as stale.                                             | Optional |
-| `exempt-issue-milestones`     | Milestones on an issue exempted from being marked as stale (override `exempt-milestones`).                      | Optional |
-| `exempt-pr-milestones`        | Milestones on the PR exempted from being marked as stale (override `exempt-milestones`).                        | Optional |
-| `exempt-all-milestones`       | Exempt all issues and PRs with milestones from being marked as stale. (priority over `exempt-milestones` rules) | Optional |
-| `exempt-all-issue-milestones` | Exempt all issues with milestones from being marked as stale. (override `exempt-all-milestones`).               | Optional |
-| `exempt-all-pr-milestones`    | Exempt all PRs with milestones from being marked as stale. (override `exempt-all-milestones`).                  | Optional |
 | `only-labels`                 | Only labels checked for stale issue/PR.                                                                         | Optional |
+| `only-issue-labels`           | Only labels checked for stale issue (override `only-labels`).                                                   | Optional |
+| `only-pr-labels`              | Only labels checked for stale PR (override `only-labels`).                                                      | Optional |
 | `operations-per-run`          | Maximum number of operations per run (GitHub API CRUD related). _Defaults to **30**_                            | Optional |
 | `remove-stale-when-updated`   | Remove stale label from issue/PR on updates or comments. _Defaults to **true**_                                 | Optional |
 | `debug-only`                  | Dry-run on action. _Defaults to **false**_                                                                      | Optional |
@@ -38,10 +34,22 @@ Warns and then closes issues and PRs that have had no activity for a specified a
 | `skip-stale-pr-message`       | Skip adding stale message on stale PR. _Defaults to **false**_                                                  | Optional |
 | `start-date`                  | The date used to skip the stale action on issue/PR created before it (ISO 8601 or RFC 2822).                    | Optional |
 | `delete-branch`               | Delete the git branch after closing a stale pull request. _Defaults to **false**_                               | Optional |
+| `exempt-milestones`           | Milestones on an issue or a PR exempted from being marked as stale.                                             | Optional |
+| `exempt-issue-milestones`     | Milestones on an issue exempted from being marked as stale (override `exempt-milestones`).                      | Optional |
+| `exempt-pr-milestones`        | Milestones on the PR exempted from being marked as stale (override `exempt-milestones`).                        | Optional |
+| `exempt-all-milestones`       | Exempt all issues and PRs with milestones from being marked as stale. (priority over `exempt-milestones` rules) | Optional |
+| `exempt-all-issue-milestones` | Exempt all issues with milestones from being marked as stale. (override `exempt-all-milestones`).               | Optional |
+| `exempt-all-pr-milestones`    | Exempt all PRs with milestones from being marked as stale. (override `exempt-all-milestones`).                  | Optional |
+| `exempt-assignees`            | Assignees on an issue or a PR exempted from being marked as stale.                                              | Optional |
+| `exempt-issue-assignees`      | Assignees on an issue exempted from being marked as stale (override `exempt-assignees`).                        | Optional |
+| `exempt-pr-assignees`         | Assignees on the PR exempted from being marked as stale (override `exempt-assignees`).                          | Optional |
+| `exempt-all-assignees`        | Exempt all issues and PRs with assignees from being marked as stale. (priority over `exempt-assignees` rules)   | Optional |
+| `exempt-all-issue-assignees`  | Exempt all issues with assignees from being marked as stale. (override `exempt-all-assignees`).                 | Optional |
+| `exempt-all-pr-assignees`     | Exempt all PRs with assignees from being marked as stale. (override `exempt-all-assignees`).                    | Optional |
 
 ### Usage
 
-See [action.yml](./action.yml) For comprehensive list of options.
+See also [action.yml](./action.yml) for a comprehensive list of all the options.
 
 Basic:
 
@@ -203,6 +211,41 @@ jobs:
           exempt-all-pr-milestones: true
 ```
 
+Avoid stale for specific assignees:
+
+```yaml
+name: 'Close stale issues and PRs'
+on:
+  schedule:
+    - cron: '30 1 * * *'
+
+jobs:
+  stale:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/stale@v3
+        with:
+          exempt-issue-assignees: 'marco,polo'
+          exempt-pr-assignees: 'marco'
+```
+
+Avoid stale for all PR with assignees:
+
+```yaml
+name: 'Close stale issues and PRs'
+on:
+  schedule:
+    - cron: '30 1 * * *'
+
+jobs:
+  stale:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/stale@v3
+        with:
+          exempt-all-pr-assignees: true
+```
+
 ### Debugging
 
 To see the debug output from this action, you must set the secret `ACTIONS_STEP_DEBUG` to `true` in your repository.  
diff --git a/action.yml b/action.yml
index 4847e78..211470c 100644
--- a/action.yml
+++ b/action.yml
@@ -88,6 +88,14 @@ inputs:
     description: 'Only issues or pull requests with all of these labels are checked if stale. Defaults to `[]` (disabled) and can be a comma-separated list of labels.'
     default: ''
     required: false
+  only-issue-labels:
+    description: 'Only issues with all of these labels are checked if stale. Defaults to `[]` (disabled) and can be a comma-separated list of labels. Override "only-labels" option regarding only the issues.'
+    default: ''
+    required: false
+  only-pr-labels:
+    description: 'Only pull requests with all of these labels are checked if stale. Defaults to `[]` (disabled) and can be a comma-separated list of labels. Override "only-labels" option regarding only the pull requests.'
+    default: ''
+    required: false
   operations-per-run:
     description: 'The maximum number of operations per run, used to control rate limiting (GitHub API CRUD related).'
     default: '30'
@@ -120,6 +128,30 @@ inputs:
     description: 'The date used to skip the stale action on issue/pull request created before it (ISO 8601 or RFC 2822).'
     default: ''
     required: false
+  exempt-assignees:
+    description: 'The assignees which exempt an issue or a pull request from being marked as stale. Separate multiple assignees with commas (eg. "user1,user2")'
+    default: ''
+    required: false
+  exempt-issue-assignees:
+    description: 'The assignees which exempt an issue from being marked as stale. Separate multiple assignees with commas (eg. "user1,user2"). Override "exempt-assignees" option regarding only the issues.'
+    default: ''
+    required: false
+  exempt-pr-assignees:
+    description: 'The assignees which exempt a pull request from being marked as stale. Separate multiple assignees with commas (eg. "user1,user2"). Override "exempt-assignees" option regarding only the pull requests.'
+    default: ''
+    required: false
+  exempt-all-assignees:
+    description: 'Exempt all issues and pull requests with assignees from being marked as stale. Default to false.'
+    default: 'false'
+    required: false
+  exempt-all-issue-assignees:
+    description: 'Exempt all issues with assignees from being marked as stale. Override "exempt-all-assignees" option regarding only the issues.'
+    default: ''
+    required: false
+  exempt-all-pr-assignees:
+    description: 'Exempt all pull requests with assignees from being marked as stale. Override "exempt-all-assignees" option regarding only the pull requests.'
+    default: ''
+    required: false
 runs:
   using: 'node12'
   main: 'dist/index.js'
diff --git a/dist/index.js b/dist/index.js
index ad4c58d..f1c1bdb 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -2,6 +2,146 @@ module.exports =
 /******/ (() => { // webpackBootstrap
 /******/ 	var __webpack_modules__ = ({
 
+/***/ 7236:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Assignees = void 0;
+const lodash_deburr_1 = __importDefault(__nccwpck_require__(1601));
+const words_to_list_1 = __nccwpck_require__(1883);
+const issue_logger_1 = __nccwpck_require__(2984);
+class Assignees {
+    constructor(options, issue) {
+        this._options = options;
+        this._issue = issue;
+        this._issueLogger = new issue_logger_1.IssueLogger(issue);
+    }
+    static _cleanAssignee(assignee) {
+        return lodash_deburr_1.default(assignee.toLowerCase());
+    }
+    shouldExemptAssignees() {
+        if (!this._issue.hasAssignees) {
+            this._issueLogger.info('This $$type has no assignee');
+            this._logSkip();
+            return false;
+        }
+        if (this._shouldExemptAllAssignees()) {
+            this._issueLogger.info('Skipping $$type because it has an exempt assignee');
+            return true;
+        }
+        const exemptAssignees = this._getExemptAssignees();
+        if (exemptAssignees.length === 0) {
+            this._issueLogger.info(`No option was specified to skip the stale process for this $$type`);
+            this._logSkip();
+            return false;
+        }
+        this._issueLogger.info(`Found ${exemptAssignees.length} assignee${exemptAssignees.length > 1 ? 's' : ''} on this $$type`);
+        const hasExemptAssignee = exemptAssignees.some((exemptAssignee) => this._hasAssignee(exemptAssignee));
+        if (!hasExemptAssignee) {
+            this._issueLogger.info('No assignee on this $$type can exempt the stale process');
+            this._logSkip();
+        }
+        else {
+            this._issueLogger.info('Skipping this $$type because it has an exempt assignee');
+        }
+        return hasExemptAssignee;
+    }
+    _getExemptAssignees() {
+        return this._issue.isPullRequest
+            ? this._getExemptPullRequestAssignees()
+            : this._getExemptIssueAssignees();
+    }
+    _getExemptIssueAssignees() {
+        if (this._options.exemptIssueAssignees === '') {
+            this._issueLogger.info('The option "exemptIssueAssignees" is disabled. No specific assignee can skip the stale process for this $$type');
+            if (this._options.exemptAssignees === '') {
+                this._issueLogger.info('The option "exemptAssignees" is disabled. No specific assignee can skip the stale process for this $$type');
+                return [];
+            }
+            const exemptAssignees = words_to_list_1.wordsToList(this._options.exemptAssignees);
+            this._issueLogger.info(`The option "exemptAssignees" is set. ${exemptAssignees.length} assignee${exemptAssignees.length === 1 ? '' : 's'} can skip the stale process for this $$type`);
+            return exemptAssignees;
+        }
+        const exemptAssignees = words_to_list_1.wordsToList(this._options.exemptIssueAssignees);
+        this._issueLogger.info(`The option "exemptIssueAssignees" is set. ${exemptAssignees.length} assignee${exemptAssignees.length === 1 ? '' : 's'} can skip the stale process for this $$type`);
+        return exemptAssignees;
+    }
+    _getExemptPullRequestAssignees() {
+        if (this._options.exemptPrAssignees === '') {
+            this._issueLogger.info('The option "exemptPrAssignees" is disabled. No specific assignee can skip the stale process for this $$type');
+            if (this._options.exemptAssignees === '') {
+                this._issueLogger.info('The option "exemptAssignees" is disabled. No specific assignee can skip the stale process for this $$type');
+                return [];
+            }
+            const exemptAssignees = words_to_list_1.wordsToList(this._options.exemptAssignees);
+            this._issueLogger.info(`The option "exemptAssignees" is set. ${exemptAssignees.length} assignee${exemptAssignees.length === 1 ? '' : 's'} can skip the stale process for this $$type`);
+            return exemptAssignees;
+        }
+        const exemptAssignees = words_to_list_1.wordsToList(this._options.exemptPrAssignees);
+        this._issueLogger.info(`The option "exemptPrAssignees" is set. ${exemptAssignees.length} assignee${exemptAssignees.length === 1 ? '' : 's'} can skip the stale process for this $$type`);
+        return exemptAssignees;
+    }
+    _hasAssignee(assignee) {
+        const cleanAssignee = Assignees._cleanAssignee(assignee);
+        return this._issue.assignees.some((issueAssignee) => {
+            const isSameAssignee = cleanAssignee === Assignees._cleanAssignee(issueAssignee.login);
+            if (isSameAssignee) {
+                this._issueLogger.info(`@${issueAssignee.login} is assigned on this $$type and is an exempt assignee`);
+            }
+            return isSameAssignee;
+        });
+    }
+    _shouldExemptAllAssignees() {
+        return this._issue.isPullRequest
+            ? this._shouldExemptAllPullRequestAssignees()
+            : this._shouldExemptAllIssueAssignees();
+    }
+    _shouldExemptAllIssueAssignees() {
+        if (this._options.exemptAllIssueAssignees === true) {
+            this._issueLogger.info('The option "exemptAllIssueAssignees" is enabled. Any assignee on this $$type will skip the stale process');
+            return true;
+        }
+        else if (this._options.exemptAllIssueAssignees === false) {
+            this._issueLogger.info('The option "exemptAllIssueAssignees" is disabled. Only some specific assignees on this $$type will skip the stale process');
+            return false;
+        }
+        this._logExemptAllAssigneesOption();
+        return this._options.exemptAllAssignees;
+    }
+    _shouldExemptAllPullRequestAssignees() {
+        if (this._options.exemptAllPrAssignees === true) {
+            this._issueLogger.info('The option "exemptAllPrAssignees" is enabled. Any assignee on this $$type will skip the stale process');
+            return true;
+        }
+        else if (this._options.exemptAllPrAssignees === false) {
+            this._issueLogger.info('The option "exemptAllPrAssignees" is disabled. Only some specific assignees on this $$type will skip the stale process');
+            return false;
+        }
+        this._logExemptAllAssigneesOption();
+        return this._options.exemptAllAssignees;
+    }
+    _logExemptAllAssigneesOption() {
+        if (this._options.exemptAllAssignees) {
+            this._issueLogger.info('The option "exemptAllAssignees" is enabled. Any assignee on this $$type will skip the stale process');
+        }
+        else {
+            this._issueLogger.info('The option "exemptAllAssignees" is disabled. Only some specific assignees on this $$type will skip the stale process');
+        }
+    }
+    _logSkip() {
+        this._issueLogger.info('Skip the assignees checks');
+    }
+}
+exports.Assignees = Assignees;
+
+
+/***/ }),
+
 /***/ 4783:
 /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
 
@@ -23,10 +163,18 @@ class Issue {
         this.state = issue.state;
         this.locked = issue.locked;
         this.milestone = issue.milestone;
-        this.isPullRequest = is_pull_request_1.isPullRequest(this);
-        this.staleLabel = this._getStaleLabel();
+        this.assignees = issue.assignees;
         this.isStale = is_labeled_1.isLabeled(this, this.staleLabel);
     }
+    get isPullRequest() {
+        return is_pull_request_1.isPullRequest(this);
+    }
+    get staleLabel() {
+        return this._getStaleLabel();
+    }
+    get hasAssignees() {
+        return this.assignees.length > 0;
+    }
     _getStaleLabel() {
         return this.isPullRequest
             ? this._options.stalePrLabel
@@ -63,6 +211,7 @@ const is_labeled_1 = __nccwpck_require__(6792);
 const is_pull_request_1 = __nccwpck_require__(5400);
 const should_mark_when_stale_1 = __nccwpck_require__(2461);
 const words_to_list_1 = __nccwpck_require__(1883);
+const assignees_1 = __nccwpck_require__(7236);
 const issue_1 = __nccwpck_require__(4783);
 const issue_logger_1 = __nccwpck_require__(2984);
 const logger_1 = __nccwpck_require__(6212);
@@ -115,7 +264,7 @@ class IssuesProcessor {
             }
             for (const issue of issues.values()) {
                 const issueLogger = new issue_logger_1.IssueLogger(issue);
-                issueLogger.info(`Found issue: issue #${issue.number} last updated ${issue.updated_at} (is pr? ${issue.isPullRequest})`);
+                issueLogger.info(`Found this $$type last updated ${issue.updated_at}`);
                 // calculate string based messages for this issue
                 const staleMessage = issue.isPullRequest
                     ? this.options.stalePrMessage
@@ -136,25 +285,39 @@ class IssuesProcessor {
                 const daysBeforeStale = issue.isPullRequest
                     ? this._getDaysBeforePrStale()
                     : this._getDaysBeforeIssueStale();
-                if (issue.isPullRequest) {
-                    issueLogger.info(`Days before pull request stale: ${daysBeforeStale}`);
+                const onlyLabels = words_to_list_1.wordsToList(this._getOnlyLabels(issue));
+                if (onlyLabels.length > 0) {
+                    issueLogger.info(`The option "onlyLabels" was specified to only processed the issues and pull requests with all those labels (${onlyLabels.length})`);
+                    const hasAllWhitelistedLabels = onlyLabels.every((label) => {
+                        return is_labeled_1.isLabeled(issue, label);
+                    });
+                    if (!hasAllWhitelistedLabels) {
+                        issueLogger.info(`Skipping this $$type because it doesn't have all the required labels`);
+                        continue; // Don't process issues without all of the required labels
+                    }
+                    else {
+                        issueLogger.info(`All the required labels are present on this $$type. Continuing the process`);
+                    }
                 }
                 else {
-                    issueLogger.info(`Days before issue stale: ${daysBeforeStale}`);
+                    issueLogger.info(`The option "onlyLabels" was not specified. Continuing the process for this $$type`);
                 }
+                issueLogger.info(`Days before $$type stale: ${daysBeforeStale}`);
                 const shouldMarkAsStale = should_mark_when_stale_1.shouldMarkWhenStale(daysBeforeStale);
                 if (!staleMessage && shouldMarkAsStale) {
-                    issueLogger.info(`Skipping ${issueType} due to empty stale message`);
+                    issueLogger.info(`Skipping $$type due to empty stale message`);
                     continue;
                 }
                 if (issue.state === 'closed') {
-                    issueLogger.info(`Skipping ${issueType} because it is closed`);
+                    issueLogger.info(`Skipping $$type because it is closed`);
                     continue; // don't process closed issues
                 }
                 if (issue.locked) {
-                    issueLogger.info(`Skipping ${issueType} because it is locked`);
+                    issueLogger.info(`Skipping $$type because it is locked`);
                     continue; // don't process locked issues
                 }
+                // Try to remove the close label when not close/locked issue or PR
+                yield this._removeCloseLabel(issue, closeLabel);
                 if (this.options.startDate) {
                     const startDate = new Date(this.options.startDate);
                     const createdAt = new Date(issue.created_at);
@@ -164,17 +327,17 @@ class IssuesProcessor {
                     if (!is_valid_date_1.isValidDate(createdAt)) {
                         throw new Error(`Invalid issue field: "created_at". Expected a valid date`);
                     }
-                    issueLogger.info(`Issue created the ${get_humanized_date_1.getHumanizedDate(createdAt)} (${issue.created_at})`);
+                    issueLogger.info(`$$type created the ${get_humanized_date_1.getHumanizedDate(createdAt)} (${issue.created_at})`);
                     if (!is_date_more_recent_than_1.isDateMoreRecentThan(createdAt, startDate)) {
-                        issueLogger.info(`Skipping ${issueType} because it was created before the specified start date`);
+                        issueLogger.info(`Skipping $$type because it was created before the specified start date`);
                         continue; // don't process issues which were created before the start date
                     }
                 }
                 if (issue.isStale) {
-                    issueLogger.info(`This issue has a stale label`);
+                    issueLogger.info(`This $$type has a stale label`);
                 }
                 else {
-                    issueLogger.info(`This issue hasn't a stale label`);
+                    issueLogger.info(`This $$type hasn't a stale label`);
                 }
                 const exemptLabels = words_to_list_1.wordsToList(issue.isPullRequest
                     ? this.options.exemptPrLabels
@@ -184,19 +347,23 @@ class IssuesProcessor {
                         issueLogger.info(`An exempt label was added after the stale label.`);
                         yield this._removeStaleLabel(issue, staleLabel);
                     }
-                    issueLogger.info(`Skipping ${issueType} because it has an exempt label`);
+                    issueLogger.info(`Skipping $$type because it has an exempt label`);
                     continue; // don't process exempt issues
                 }
                 const milestones = new milestones_1.Milestones(this.options, issue);
                 if (milestones.shouldExemptMilestones()) {
-                    issueLogger.info(`Skipping ${issueType} because it has an exempt milestone`);
+                    issueLogger.info(`Skipping $$type because it has an exempted milestone`);
                     continue; // don't process exempt milestones
                 }
+                const assignees = new assignees_1.Assignees(this.options, issue);
+                if (assignees.shouldExemptAssignees()) {
+                    continue; // don't process exempt assignees
+                }
                 // should this issue be marked stale?
                 const shouldBeStale = !IssuesProcessor._updatedSince(issue.updated_at, daysBeforeStale);
                 // determine if this issue needs to be marked stale first
                 if (!issue.isStale && shouldBeStale && shouldMarkAsStale) {
-                    issueLogger.info(`Marking ${issueType} stale because it was last updated on ${issue.updated_at} and it does not have a stale label`);
+                    issueLogger.info(`Marking $$type stale because it was last updated on ${issue.updated_at} and it does not have a stale label`);
                     yield this._markStale(issue, staleMessage, staleLabel, skipMessage);
                     issue.isStale = true; // this issue is now considered stale
                 }
@@ -205,7 +372,7 @@ class IssuesProcessor {
                 }
                 // process the issue if it was marked stale
                 if (issue.isStale) {
-                    issueLogger.info(`Found a stale ${issueType}`);
+                    issueLogger.info(`Found a stale $$type`);
                     yield this._processStaleIssue(issue, issueType, staleLabel, actor, closeMessage, closeLabel);
                 }
             }
@@ -222,21 +389,16 @@ class IssuesProcessor {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
             const markedStaleOn = (yield this._getLabelCreationDate(issue, staleLabel)) || issue.updated_at;
-            issueLogger.info(`Issue #${issue.number} marked stale on: ${markedStaleOn}`);
+            issueLogger.info(`$$type marked stale on: ${markedStaleOn}`);
             const issueHasComments = yield this._hasCommentsSince(issue, markedStaleOn, actor);
-            issueLogger.info(`Issue #${issue.number} has been commented on: ${issueHasComments}`);
+            issueLogger.info(`$$type has been commented on: ${issueHasComments}`);
             const isPr = is_pull_request_1.isPullRequest(issue);
             const daysBeforeClose = isPr
                 ? this._getDaysBeforePrClose()
                 : this._getDaysBeforeIssueClose();
-            if (isPr) {
-                issueLogger.info(`Days before pull request close: ${daysBeforeClose}`);
-            }
-            else {
-                issueLogger.info(`Days before issue close: ${daysBeforeClose}`);
-            }
+            issueLogger.info(`Days before $$type close: ${daysBeforeClose}`);
             const issueHasUpdate = IssuesProcessor._updatedSince(issue.updated_at, daysBeforeClose);
-            issueLogger.info(`Issue #${issue.number} has been updated: ${issueHasUpdate}`);
+            issueLogger.info(`$$type has been updated: ${issueHasUpdate}`);
             // should we un-stale this issue?
             if (this.options.removeStaleWhenUpdated && issueHasComments) {
                 yield this._removeStaleLabel(issue, staleLabel);
@@ -246,16 +408,16 @@ class IssuesProcessor {
                 return; // nothing to do because we aren't closing stale issues
             }
             if (!issueHasComments && !issueHasUpdate) {
-                issueLogger.info(`Closing ${issueType} because it was last updated on ${issue.updated_at}`);
+                issueLogger.info(`Closing $$type because it was last updated on ${issue.updated_at}`);
                 yield this._closeIssue(issue, closeMessage, closeLabel);
                 if (this.options.deleteBranch && issue.pull_request) {
-                    issueLogger.info(`Deleting branch for #${issue.number} as delete-branch option was specified`);
+                    issueLogger.info(`Deleting branch for as delete-branch option was specified`);
                     yield this._deleteBranch(issue);
                     this.deletedBranchIssues.push(issue);
                 }
             }
             else {
-                issueLogger.info(`Stale ${issueType} is not old enough to close yet (hasComments? ${issueHasComments}, hasUpdate? ${issueHasUpdate})`);
+                issueLogger.info(`Stale $$type is not old enough to close yet (hasComments? ${issueHasComments}, hasUpdate? ${issueHasUpdate})`);
             }
         });
     }
@@ -263,7 +425,7 @@ class IssuesProcessor {
     _hasCommentsSince(issue, sinceDate, actor) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Checking for comments on issue #${issue.number} since ${sinceDate}`);
+            issueLogger.info(`Checking for comments on $$type since ${sinceDate}`);
             if (!sinceDate) {
                 return true;
             }
@@ -317,7 +479,6 @@ class IssuesProcessor {
                     owner: github_1.context.repo.owner,
                     repo: github_1.context.repo.repo,
                     state: 'open',
-                    labels: this.options.onlyLabels,
                     per_page: 100,
                     direction: this.options.ascending ? 'asc' : 'desc',
                     page
@@ -334,7 +495,7 @@ class IssuesProcessor {
     _markStale(issue, staleMessage, staleLabel, skipMessage) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Marking issue #${issue.number} as stale`);
+            issueLogger.info(`Marking $$type as stale`);
             this.staleIssues.push(issue);
             this._operationsLeft -= 2;
             // if the issue is being marked stale, the updated date should be changed to right now
@@ -374,7 +535,7 @@ class IssuesProcessor {
     _closeIssue(issue, closeMessage, closeLabel) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Closing issue #${issue.number} for being stale`);
+            issueLogger.info(`Closing $$type for being stale`);
             this.closedIssues.push(issue);
             this._operationsLeft -= 1;
             if (this.options.debugOnly) {
@@ -415,7 +576,7 @@ class IssuesProcessor {
                 });
             }
             catch (error) {
-                issueLogger.error(`Error updating an issue: ${error.message}`);
+                issueLogger.error(`Error updating this $$type: ${error.message}`);
             }
         });
     }
@@ -432,7 +593,7 @@ class IssuesProcessor {
                 return pullRequest.data;
             }
             catch (error) {
-                issueLogger.error(`Error getting pull request ${issue.number}: ${error.message}`);
+                issueLogger.error(`Error getting this $$type: ${error.message}`);
             }
         });
     }
@@ -440,17 +601,17 @@ class IssuesProcessor {
     _deleteBranch(issue) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Delete branch from closed issue #${issue.number} - ${issue.title}`);
+            issueLogger.info(`Delete branch from closed $$type - ${issue.title}`);
             if (this.options.debugOnly) {
                 return;
             }
             const pullRequest = yield this._getPullRequest(issue);
             if (!pullRequest) {
-                issueLogger.info(`Not deleting branch as pull request not found for issue ${issue.number}`);
+                issueLogger.info(`Not deleting branch as pull request not found for this $$type`);
                 return;
             }
             const branch = pullRequest.head.ref;
-            issueLogger.info(`Deleting branch ${branch} from closed issue #${issue.number}`);
+            issueLogger.info(`Deleting branch ${branch} from closed $$type`);
             this._operationsLeft -= 1;
             try {
                 yield this.client.git.deleteRef({
@@ -460,7 +621,7 @@ class IssuesProcessor {
                 });
             }
             catch (error) {
-                issueLogger.error(`Error deleting branch ${branch} from issue #${issue.number}: ${error.message}`);
+                issueLogger.error(`Error deleting branch ${branch} from $$type: ${error.message}`);
             }
         });
     }
@@ -468,7 +629,7 @@ class IssuesProcessor {
     _removeLabel(issue, label) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Removing label "${label}" from issue #${issue.number}`);
+            issueLogger.info(`Removing label "${label}" from $$type`);
             this.removedLabelIssues.push(issue);
             this._operationsLeft -= 1;
             // @todo remove the debug only to be able to test the code below
@@ -493,7 +654,7 @@ class IssuesProcessor {
     _getLabelCreationDate(issue, label) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Checking for label on issue #${issue.number}`);
+            issueLogger.info(`Checking for label on $$type`);
             this._operationsLeft -= 1;
             const options = this.client.issues.listEvents.endpoint.merge({
                 owner: github_1.context.repo.owner,
@@ -531,13 +692,40 @@ class IssuesProcessor {
             ? this.options.daysBeforeClose
             : this.options.daysBeforePrClose;
     }
+    _getOnlyLabels(issue) {
+        if (issue.isPullRequest) {
+            if (this.options.onlyPrLabels !== '') {
+                return this.options.onlyPrLabels;
+            }
+        }
+        else {
+            if (this.options.onlyIssueLabels !== '') {
+                return this.options.onlyIssueLabels;
+            }
+        }
+        return this.options.onlyLabels;
+    }
     _removeStaleLabel(issue, staleLabel) {
         return __awaiter(this, void 0, void 0, function* () {
             const issueLogger = new issue_logger_1.IssueLogger(issue);
-            issueLogger.info(`Issue #${issue.number} is no longer stale. Removing stale label.`);
+            issueLogger.info(`The $$type is no longer stale. Removing the stale label...`);
             return this._removeLabel(issue, staleLabel);
         });
     }
+    _removeCloseLabel(issue, closeLabel) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const issueLogger = new issue_logger_1.IssueLogger(issue);
+            issueLogger.info(`The $$type is not closed nor locked. Trying to remove the close label...`);
+            if (!closeLabel) {
+                issueLogger.info(`There is no close label on this $$type. Skip`);
+                return Promise.resolve();
+            }
+            if (is_labeled_1.isLabeled(issue, closeLabel)) {
+                issueLogger.info(`The $$type has a close label "${closeLabel}". Removing the close label...`);
+                return this._removeLabel(issue, closeLabel);
+            }
+        });
+    }
 }
 exports.IssuesProcessor = IssuesProcessor;
 
@@ -571,18 +759,39 @@ var __importStar = (this && this.__importStar) || function (mod) {
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 exports.IssueLogger = void 0;
 const core = __importStar(__nccwpck_require__(2186));
+/**
+ * @description
+ * Each log will prefix the message with the issue number
+ *
+ * @example
+ * warning('No stale') => "[#123] No stale"
+ *
+ * Each log method can have special tokens:
+ * - $$type => will replace this by either "pull request" or "issue" depending of the type of issue
+ *
+ * @example
+ * warning('The $$type will stale') => "The pull request will stale"
+ */
 class IssueLogger {
     constructor(issue) {
         this._issue = issue;
     }
     warning(message) {
-        core.warning(this._prefixWithIssueNumber(message));
+        core.warning(this._format(message));
     }
     info(message) {
-        core.info(this._prefixWithIssueNumber(message));
+        core.info(this._format(message));
     }
     error(message) {
-        core.error(this._prefixWithIssueNumber(message));
+        core.error(this._format(message));
+    }
+    _replaceTokens(message) {
+        return this._replaceTypeToken(message);
+    }
+    _replaceTypeToken(message) {
+        return message
+            .replace(/^\$\$type/, this._issue.isPullRequest ? 'Pull request' : 'Issue')
+            .replace(/\$\$type/g, this._issue.isPullRequest ? 'pull request' : 'issue');
     }
     _prefixWithIssueNumber(message) {
         return `[#${this._getIssueNumber()}] ${message}`;
@@ -590,6 +799,9 @@ class IssueLogger {
     _getIssueNumber() {
         return this._issue.number;
     }
+    _format(message) {
+        return this._prefixWithIssueNumber(this._replaceTokens(message));
+    }
 }
 exports.IssueLogger = IssueLogger;
 
@@ -656,8 +868,8 @@ class Milestones {
         this._options = options;
         this._issue = issue;
     }
-    static _cleanMilestone(label) {
-        return lodash_deburr_1.default(label.toLowerCase());
+    static _cleanMilestone(milestone) {
+        return lodash_deburr_1.default(milestone.toLowerCase());
     }
     shouldExemptMilestones() {
         if (this._shouldExemptAllMilestones()) {
@@ -987,6 +1199,8 @@ function _getAndValidateArgs() {
         closePrLabel: core.getInput('close-pr-label'),
         exemptPrLabels: core.getInput('exempt-pr-labels'),
         onlyLabels: core.getInput('only-labels'),
+        onlyIssueLabels: core.getInput('only-issue-labels'),
+        onlyPrLabels: core.getInput('only-pr-labels'),
         operationsPerRun: parseInt(core.getInput('operations-per-run', { required: true })),
         removeStaleWhenUpdated: !(core.getInput('remove-stale-when-updated') === 'false'),
         debugOnly: core.getInput('debug-only') === 'true',
@@ -1002,7 +1216,13 @@ function _getAndValidateArgs() {
         exemptPrMilestones: core.getInput('exempt-pr-milestones'),
         exemptAllMilestones: core.getInput('exempt-all-milestones') === 'true',
         exemptAllIssueMilestones: _toOptionalBoolean('exempt-all-issue-milestones'),
-        exemptAllPrMilestones: _toOptionalBoolean('exempt-all-pr-milestones')
+        exemptAllPrMilestones: _toOptionalBoolean('exempt-all-pr-milestones'),
+        exemptAssignees: core.getInput('exempt-assignees'),
+        exemptIssueAssignees: core.getInput('exempt-issue-assignees'),
+        exemptPrAssignees: core.getInput('exempt-pr-assignees'),
+        exemptAllAssignees: core.getInput('exempt-all-assignees') === 'true',
+        exemptAllIssueAssignees: _toOptionalBoolean('exempt-all-issue-assignees'),
+        exemptAllPrAssignees: _toOptionalBoolean('exempt-all-pr-assignees')
     };
     for (const numberInput of [
         'days-before-stale',
@@ -1033,7 +1253,7 @@ function _toOptionalBoolean(argumentName) {
     }
     return undefined;
 }
-_run();
+void _run();
 
 
 /***/ }),
diff --git a/package-lock.json b/package-lock.json
index f3cce27..a7e4798 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1568,9 +1568,9 @@
       }
     },
     "@octokit/openapi-types": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-4.0.3.tgz",
-      "integrity": "sha512-CXCe1Zzc/WhjpuAEgoUktAinZJ02l6W8q1hDkwBtaonEtO6cjo/3Pyb2J1t5y2q/SvjESDJ77xZ9UVHqQVvihw=="
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.2.0.tgz",
+      "integrity": "sha512-MInMij2VK5o96Ei6qaHjxBglSZWOXQs9dTZfnGX2Xnr2mhA+yk9L/QCH4RcJGISJJCBclLHuY3ytq+iRgDfX7w=="
     },
     "@octokit/plugin-paginate-rest": {
       "version": "2.2.4",
@@ -1620,14 +1620,14 @@
       }
     },
     "@octokit/rest": {
-      "version": "18.1.1",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.1.1.tgz",
-      "integrity": "sha512-ZcCHMyfGT1qtJD72usigAfUQ6jU89ZUPFb2AOubR6WZ7/RRFVZUENVm1I2yvJBUicqTujezPW9cY1+o3Mb4rNA==",
+      "version": "18.3.0",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.3.0.tgz",
+      "integrity": "sha512-R45oBVhnq3HAOGVtC6lHY7LX7TGWqbbcD4KvBHoT4QIjgJzfqKag3m/DUJwLnp8xrokz1spZmspTIXiDeQqJSA==",
       "requires": {
         "@octokit/core": "^3.2.3",
         "@octokit/plugin-paginate-rest": "^2.6.2",
         "@octokit/plugin-request-log": "^1.0.2",
-        "@octokit/plugin-rest-endpoint-methods": "4.10.3"
+        "@octokit/plugin-rest-endpoint-methods": "4.13.0"
       },
       "dependencies": {
         "@octokit/auth-token": {
@@ -1662,19 +1662,19 @@
           }
         },
         "@octokit/plugin-paginate-rest": {
-          "version": "2.9.1",
-          "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.9.1.tgz",
-          "integrity": "sha512-8wnuWGjwDIEobbBet2xAjZwgiMVTgIer5wBsnGXzV3lJ4yqphLU2FEMpkhSrDx7y+WkZDfZ+V+1cFMZ1mAaFag==",
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.11.0.tgz",
+          "integrity": "sha512-7L9xQank2G3r1dGqrVPo1z62V5utbykOUzlmNHPz87Pww/JpZQ9KyG5CHtUzgmB4n5iDRKYNK/86A8D98HP0yA==",
           "requires": {
-            "@octokit/types": "^6.8.0"
+            "@octokit/types": "^6.11.0"
           }
         },
         "@octokit/plugin-rest-endpoint-methods": {
-          "version": "4.10.3",
-          "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.10.3.tgz",
-          "integrity": "sha512-CsNQeVY34Vs9iea2Z9/TCPlebxv6KpjO9f1BUPz+14qundTSYT9kgf8j5wA1k37VstfBQ4xnuURYdnbGzJBJXw==",
+          "version": "4.13.0",
+          "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.0.tgz",
+          "integrity": "sha512-Ofusy7BwHkU7z4TNsVdf7wm5W3KR625KqlQj4AiWPnBvclmZU0Y2bVK8b8Mz8nW7sEX9TJcCdX6KeaincE/cLw==",
           "requires": {
-            "@octokit/types": "^6.8.3",
+            "@octokit/types": "^6.11.0",
             "deprecation": "^2.3.1"
           }
         },
@@ -1694,12 +1694,11 @@
           }
         },
         "@octokit/types": {
-          "version": "6.8.4",
-          "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.8.4.tgz",
-          "integrity": "sha512-iKAMx//mBk74NwXdeKg8kdYO5zb1n6Ypk5uxwM96U35rJQv4Y8lMQxfzhN8QyzQHaZkxQsl28bn+MPEhiqXb7w==",
+          "version": "6.11.0",
+          "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.11.0.tgz",
+          "integrity": "sha512-RMLAmpPZf/a33EsclBazKg02NCCj4rC69V9sUgf0SuWTjmnBD2QC1nIVtJo7RJrGnwG1+aoFBb2yTrWm/8AS7w==",
           "requires": {
-            "@octokit/openapi-types": "^4.0.3",
-            "@types/node": ">= 8"
+            "@octokit/openapi-types": "^5.2.0"
           }
         },
         "is-plain-object": {
@@ -1962,41 +1961,63 @@
       }
     },
     "@typescript-eslint/parser": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz",
-      "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==",
+      "version": "4.15.2",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.2.tgz",
+      "integrity": "sha512-SHeF8xbsC6z2FKXsaTb1tBCf0QZsjJ94H6Bo51Y1aVEZ4XAefaw5ZAilMoDPlGghe+qtq7XdTiDlGfVTOmvA+Q==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "4.15.1",
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/typescript-estree": "4.15.1",
+        "@typescript-eslint/scope-manager": "4.15.2",
+        "@typescript-eslint/types": "4.15.2",
+        "@typescript-eslint/typescript-estree": "4.15.2",
         "debug": "^4.1.1"
       },
       "dependencies": {
         "@typescript-eslint/scope-manager": {
-          "version": "4.15.1",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz",
-          "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==",
+          "version": "4.15.2",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.2.tgz",
+          "integrity": "sha512-Zm0tf/MSKuX6aeJmuXexgdVyxT9/oJJhaCkijv0DvJVT3ui4zY6XYd6iwIo/8GEZGy43cd7w1rFMiCLHbRzAPQ==",
           "dev": true,
           "requires": {
-            "@typescript-eslint/types": "4.15.1",
-            "@typescript-eslint/visitor-keys": "4.15.1"
+            "@typescript-eslint/types": "4.15.2",
+            "@typescript-eslint/visitor-keys": "4.15.2"
           }
         },
+        "@typescript-eslint/types": {
+          "version": "4.15.2",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.2.tgz",
+          "integrity": "sha512-r7lW7HFkAarfUylJ2tKndyO9njwSyoy6cpfDKWPX6/ctZA+QyaYscAHXVAfJqtnY6aaTwDYrOhp+ginlbc7HfQ==",
+          "dev": true
+        },
         "@typescript-eslint/typescript-estree": {
-          "version": "4.15.1",
-          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz",
-          "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==",
+          "version": "4.15.2",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.2.tgz",
+          "integrity": "sha512-cGR8C2g5SPtHTQvAymEODeqx90pJHadWsgTtx6GbnTWKqsg7yp6Eaya9nFzUd4KrKhxdYTTFBiYeTPQaz/l8bw==",
           "dev": true,
           "requires": {
-            "@typescript-eslint/types": "4.15.1",
-            "@typescript-eslint/visitor-keys": "4.15.1",
+            "@typescript-eslint/types": "4.15.2",
+            "@typescript-eslint/visitor-keys": "4.15.2",
             "debug": "^4.1.1",
             "globby": "^11.0.1",
             "is-glob": "^4.0.1",
             "semver": "^7.3.2",
             "tsutils": "^3.17.1"
           }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "4.15.2",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.2.tgz",
+          "integrity": "sha512-TME1VgSb7wTwgENN5KVj4Nqg25hP8DisXxNBojM4Nn31rYaNDIocNm5cmjOFfh42n7NVERxWrDFoETO/76ePyg==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "4.15.2",
+            "eslint-visitor-keys": "^2.0.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+          "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+          "dev": true
         }
       }
     },
@@ -7140,6 +7161,67 @@
         }
       }
     },
+    "jest-silent-reporter": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/jest-silent-reporter/-/jest-silent-reporter-0.4.0.tgz",
+      "integrity": "sha512-X9pLv87dOba/Ou6E3MrT0HmszG56oZSykgyhIlcL9SErjikPObprxAz58831g4Ngl8TKwpU73pAfkPpjYaMSxg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "jest-util": "^26.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "jest-snapshot": {
       "version": "26.6.2",
       "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz",
diff --git a/package.json b/package.json
index 288ed67..a7c5123 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,8 @@
     "lint:all:fix": "npm run format && npm run lint:fix",
     "pack": "ncc build",
     "test": "jest",
+    "test:only-errors": "jest --reporters jest-silent-reporter --silent",
+    "test:watch": "jest --watch --notify --expandf",
     "all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
   },
   "repository": {
@@ -30,7 +32,7 @@
   "dependencies": {
     "@actions/core": "^1.2.6",
     "@actions/github": "^4.0.0",
-    "@octokit/rest": "^18.1.1",
+    "@octokit/rest": "^18.3.0",
     "lodash.deburr": "^4.1.0",
     "semver": "^7.3.4"
   },
@@ -40,13 +42,14 @@
     "@types/node": "^14.14.28",
     "@types/semver": "^7.3.4",
     "@typescript-eslint/eslint-plugin": "^4.15.1",
-    "@typescript-eslint/parser": "^4.15.1",
+    "@typescript-eslint/parser": "^4.15.2",
     "@vercel/ncc": "^0.27.0",
     "eslint": "^7.20.0",
     "eslint-plugin-github": "^4.0.1",
     "eslint-plugin-jest": "^24.1.5",
     "jest": "^26.6.3",
     "jest-circus": "^26.6.3",
+    "jest-silent-reporter": "^0.4.0",
     "js-yaml": "^4.0.0",
     "prettier": "^2.2.1",
     "ts-jest": "^26.5.1",
diff --git a/src/classes/assignees.spec.ts b/src/classes/assignees.spec.ts
new file mode 100644
index 0000000..26b689d
--- /dev/null
+++ b/src/classes/assignees.spec.ts
@@ -0,0 +1,594 @@
+import {DefaultProcessorOptions} from '../../__tests__/constants/default-processor-options';
+import {generateIIssue} from '../../__tests__/functions/generate-iissue';
+import {IIssue} from '../interfaces/issue';
+import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
+import {Issue} from './issue';
+import {Assignees} from './assignees';
+
+describe('Assignees', (): void => {
+  let assignees: Assignees;
+  let optionsInterface: IIssuesProcessorOptions;
+  let issue: Issue;
+  let issueInterface: IIssue;
+
+  beforeEach((): void => {
+    optionsInterface = {...DefaultProcessorOptions};
+    issueInterface = generateIIssue();
+  });
+
+  describe('shouldExemptAssignees()', (): void => {
+    describe('when the given issue is not a pull request', (): void => {
+      beforeEach((): void => {
+        issueInterface.pull_request = undefined;
+      });
+
+      describe('when the given options are not configured to exempt an assignee', (): void => {
+        beforeEach((): void => {
+          optionsInterface.exemptAssignees = '';
+        });
+
+        describe('when the given options are not configured to exempt an issue with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptIssueAssignees = '';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+        });
+
+        describe('when the given options are configured to exempt an issue with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptIssueAssignees =
+              'dummy-exempt-issue-assignee';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt issue assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt issue assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-issue-assignee'
+                }
+              ];
+            });
+
+            it('should return true', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(true);
+            });
+          });
+        });
+      });
+
+      describe('when the given options are configured to exempt an assignee', (): void => {
+        beforeEach((): void => {
+          optionsInterface.exemptAssignees = 'dummy-exempt-assignee';
+        });
+
+        describe('when the given options are not configured to exempt an issue with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptIssueAssignees = '';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-assignee'
+                }
+              ];
+            });
+
+            it('should return true', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(true);
+            });
+          });
+        });
+
+        describe('when the given options are configured to exempt an issue with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptIssueAssignees =
+              'dummy-exempt-issue-assignee';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt issue assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt issue assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-issue-assignee'
+                }
+              ];
+            });
+
+            it('should return true', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(true);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-assignee'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+        });
+      });
+    });
+
+    describe('when the given issue is a pull request', (): void => {
+      beforeEach((): void => {
+        issueInterface.pull_request = {};
+      });
+
+      describe('when the given options are not configured to exempt an assignee', (): void => {
+        beforeEach((): void => {
+          optionsInterface.exemptAssignees = '';
+        });
+
+        describe('when the given options are not configured to exempt a pull request with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptPrAssignees = '';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+        });
+
+        describe('when the given options are configured to exempt a pull request with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptPrAssignees = 'dummy-exempt-pr-assignee';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt pull request assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt pull request assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-pr-assignee'
+                }
+              ];
+            });
+
+            it('should return true', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(true);
+            });
+          });
+        });
+      });
+
+      describe('when the given options are configured to exempt an assignee', (): void => {
+        beforeEach((): void => {
+          optionsInterface.exemptAssignees = 'dummy-exempt-assignee';
+        });
+
+        describe('when the given options are not configured to exempt a pull request with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptPrAssignees = '';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-assignee'
+                }
+              ];
+            });
+
+            it('should return true', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(true);
+            });
+          });
+        });
+
+        describe('when the given options are configured to exempt a pull request with an assignee', (): void => {
+          beforeEach((): void => {
+            optionsInterface.exemptPrAssignees = 'dummy-exempt-pr-assignee';
+          });
+
+          describe('when the given issue does not have an assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt pull request assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt pull request assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-pr-assignee'
+                }
+              ];
+            });
+
+            it('should return true', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(true);
+            });
+          });
+
+          describe('when the given issue does have an assignee different than the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-login'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+
+          describe('when the given issue does have an assignee equaling the exempt assignee', (): void => {
+            beforeEach((): void => {
+              issueInterface.assignees = [
+                {
+                  login: 'dummy-exempt-assignee'
+                }
+              ];
+            });
+
+            it('should return false', (): void => {
+              expect.assertions(1);
+              issue = new Issue(optionsInterface, issueInterface);
+              assignees = new Assignees(optionsInterface, issue);
+
+              const result = assignees.shouldExemptAssignees();
+
+              expect(result).toStrictEqual(false);
+            });
+          });
+        });
+      });
+    });
+  });
+});
diff --git a/src/classes/assignees.ts b/src/classes/assignees.ts
new file mode 100644
index 0000000..af844dc
--- /dev/null
+++ b/src/classes/assignees.ts
@@ -0,0 +1,251 @@
+import deburr from 'lodash.deburr';
+import {wordsToList} from '../functions/words-to-list';
+import {IAssignee} from '../interfaces/assignee';
+import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
+import {Issue} from './issue';
+import {IssueLogger} from './loggers/issue-logger';
+
+type CleanAssignee = string;
+
+export class Assignees {
+  private static _cleanAssignee(assignee: Readonly<string>): CleanAssignee {
+    return deburr(assignee.toLowerCase());
+  }
+
+  private readonly _options: IIssuesProcessorOptions;
+  private readonly _issue: Issue;
+  private readonly _issueLogger: IssueLogger;
+
+  constructor(options: Readonly<IIssuesProcessorOptions>, issue: Issue) {
+    this._options = options;
+    this._issue = issue;
+    this._issueLogger = new IssueLogger(issue);
+  }
+
+  shouldExemptAssignees(): boolean {
+    if (!this._issue.hasAssignees) {
+      this._issueLogger.info('This $$type has no assignee');
+      this._logSkip();
+
+      return false;
+    }
+
+    if (this._shouldExemptAllAssignees()) {
+      this._issueLogger.info(
+        'Skipping $$type because it has an exempt assignee'
+      );
+
+      return true;
+    }
+
+    const exemptAssignees: string[] = this._getExemptAssignees();
+
+    if (exemptAssignees.length === 0) {
+      this._issueLogger.info(
+        `No option was specified to skip the stale process for this $$type`
+      );
+      this._logSkip();
+
+      return false;
+    }
+
+    this._issueLogger.info(
+      `Found ${exemptAssignees.length} assignee${
+        exemptAssignees.length > 1 ? 's' : ''
+      } on this $$type`
+    );
+
+    const hasExemptAssignee: boolean = exemptAssignees.some(
+      (exemptAssignee: Readonly<string>): boolean =>
+        this._hasAssignee(exemptAssignee)
+    );
+
+    if (!hasExemptAssignee) {
+      this._issueLogger.info(
+        'No assignee on this $$type can exempt the stale process'
+      );
+      this._logSkip();
+    } else {
+      this._issueLogger.info(
+        'Skipping this $$type because it has an exempt assignee'
+      );
+    }
+
+    return hasExemptAssignee;
+  }
+
+  private _getExemptAssignees(): string[] {
+    return this._issue.isPullRequest
+      ? this._getExemptPullRequestAssignees()
+      : this._getExemptIssueAssignees();
+  }
+
+  private _getExemptIssueAssignees(): string[] {
+    if (this._options.exemptIssueAssignees === '') {
+      this._issueLogger.info(
+        'The option "exemptIssueAssignees" is disabled. No specific assignee can skip the stale process for this $$type'
+      );
+
+      if (this._options.exemptAssignees === '') {
+        this._issueLogger.info(
+          'The option "exemptAssignees" is disabled. No specific assignee can skip the stale process for this $$type'
+        );
+
+        return [];
+      }
+
+      const exemptAssignees: string[] = wordsToList(
+        this._options.exemptAssignees
+      );
+
+      this._issueLogger.info(
+        `The option "exemptAssignees" is set. ${
+          exemptAssignees.length
+        } assignee${
+          exemptAssignees.length === 1 ? '' : 's'
+        } can skip the stale process for this $$type`
+      );
+
+      return exemptAssignees;
+    }
+
+    const exemptAssignees: string[] = wordsToList(
+      this._options.exemptIssueAssignees
+    );
+
+    this._issueLogger.info(
+      `The option "exemptIssueAssignees" is set. ${
+        exemptAssignees.length
+      } assignee${
+        exemptAssignees.length === 1 ? '' : 's'
+      } can skip the stale process for this $$type`
+    );
+
+    return exemptAssignees;
+  }
+
+  private _getExemptPullRequestAssignees(): string[] {
+    if (this._options.exemptPrAssignees === '') {
+      this._issueLogger.info(
+        'The option "exemptPrAssignees" is disabled. No specific assignee can skip the stale process for this $$type'
+      );
+
+      if (this._options.exemptAssignees === '') {
+        this._issueLogger.info(
+          'The option "exemptAssignees" is disabled. No specific assignee can skip the stale process for this $$type'
+        );
+
+        return [];
+      }
+
+      const exemptAssignees: string[] = wordsToList(
+        this._options.exemptAssignees
+      );
+
+      this._issueLogger.info(
+        `The option "exemptAssignees" is set. ${
+          exemptAssignees.length
+        } assignee${
+          exemptAssignees.length === 1 ? '' : 's'
+        } can skip the stale process for this $$type`
+      );
+
+      return exemptAssignees;
+    }
+
+    const exemptAssignees: string[] = wordsToList(
+      this._options.exemptPrAssignees
+    );
+
+    this._issueLogger.info(
+      `The option "exemptPrAssignees" is set. ${
+        exemptAssignees.length
+      } assignee${
+        exemptAssignees.length === 1 ? '' : 's'
+      } can skip the stale process for this $$type`
+    );
+
+    return exemptAssignees;
+  }
+
+  private _hasAssignee(assignee: Readonly<string>): boolean {
+    const cleanAssignee: CleanAssignee = Assignees._cleanAssignee(assignee);
+
+    return this._issue.assignees.some(
+      (issueAssignee: Readonly<IAssignee>): boolean => {
+        const isSameAssignee: boolean =
+          cleanAssignee === Assignees._cleanAssignee(issueAssignee.login);
+
+        if (isSameAssignee) {
+          this._issueLogger.info(
+            `@${issueAssignee.login} is assigned on this $$type and is an exempt assignee`
+          );
+        }
+
+        return isSameAssignee;
+      }
+    );
+  }
+
+  private _shouldExemptAllAssignees(): boolean {
+    return this._issue.isPullRequest
+      ? this._shouldExemptAllPullRequestAssignees()
+      : this._shouldExemptAllIssueAssignees();
+  }
+
+  private _shouldExemptAllIssueAssignees(): boolean {
+    if (this._options.exemptAllIssueAssignees === true) {
+      this._issueLogger.info(
+        'The option "exemptAllIssueAssignees" is enabled. Any assignee on this $$type will skip the stale process'
+      );
+
+      return true;
+    } else if (this._options.exemptAllIssueAssignees === false) {
+      this._issueLogger.info(
+        'The option "exemptAllIssueAssignees" is disabled. Only some specific assignees on this $$type will skip the stale process'
+      );
+
+      return false;
+    }
+
+    this._logExemptAllAssigneesOption();
+
+    return this._options.exemptAllAssignees;
+  }
+
+  private _shouldExemptAllPullRequestAssignees(): boolean {
+    if (this._options.exemptAllPrAssignees === true) {
+      this._issueLogger.info(
+        'The option "exemptAllPrAssignees" is enabled. Any assignee on this $$type will skip the stale process'
+      );
+
+      return true;
+    } else if (this._options.exemptAllPrAssignees === false) {
+      this._issueLogger.info(
+        'The option "exemptAllPrAssignees" is disabled. Only some specific assignees on this $$type will skip the stale process'
+      );
+
+      return false;
+    }
+
+    this._logExemptAllAssigneesOption();
+
+    return this._options.exemptAllAssignees;
+  }
+
+  private _logExemptAllAssigneesOption(): void {
+    if (this._options.exemptAllAssignees) {
+      this._issueLogger.info(
+        'The option "exemptAllAssignees" is enabled. Any assignee on this $$type will skip the stale process'
+      );
+    } else {
+      this._issueLogger.info(
+        'The option "exemptAllAssignees" is disabled. Only some specific assignees on this $$type will skip the stale process'
+      );
+    }
+  }
+
+  private _logSkip(): void {
+    this._issueLogger.info('Skip the assignees checks');
+  }
+}
diff --git a/src/classes/issue.spec.ts b/src/classes/issue.spec.ts
index 105c19a..8d852b2 100644
--- a/src/classes/issue.spec.ts
+++ b/src/classes/issue.spec.ts
@@ -1,3 +1,4 @@
+import {IAssignee} from '../interfaces/assignee';
 import {IIssue} from '../interfaces/issue';
 import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
 import {ILabel} from '../interfaces/label';
@@ -25,11 +26,10 @@ describe('Issue', (): void => {
       debugOnly: false,
       deleteBranch: false,
       exemptIssueLabels: '',
-      exemptIssueMilestones: '',
-      exemptMilestones: '',
       exemptPrLabels: '',
-      exemptPrMilestones: '',
       onlyLabels: '',
+      onlyIssueLabels: '',
+      onlyPrLabels: '',
       operationsPerRun: 0,
       removeStaleWhenUpdated: false,
       repoToken: '',
@@ -40,9 +40,18 @@ describe('Issue', (): void => {
       startDate: undefined,
       stalePrLabel: 'dummy-stale-pr-label',
       staleIssueLabel: 'dummy-stale-issue-label',
+      exemptMilestones: '',
+      exemptIssueMilestones: '',
+      exemptPrMilestones: '',
       exemptAllMilestones: false,
       exemptAllIssueMilestones: undefined,
-      exemptAllPrMilestones: undefined
+      exemptAllPrMilestones: undefined,
+      exemptAssignees: '',
+      exemptIssueAssignees: '',
+      exemptPrAssignees: '',
+      exemptAllAssignees: false,
+      exemptAllIssueAssignees: undefined,
+      exemptAllPrAssignees: undefined
     };
     issueInterface = {
       title: 'dummy-title',
@@ -59,7 +68,12 @@ describe('Issue', (): void => {
       locked: false,
       milestone: {
         title: 'dummy-milestone'
-      }
+      },
+      assignees: [
+        {
+          login: 'dummy-login'
+        }
+      ]
     };
     issue = new Issue(optionsInterface, issueInterface);
   });
@@ -125,42 +139,94 @@ describe('Issue', (): void => {
       } as IMilestone);
     });
 
-    describe('when the given issue pull_request is not set', (): void => {
+    it('should set the assignees with the given issue assignees', (): void => {
+      expect.assertions(1);
+
+      expect(issue.assignees).toStrictEqual([
+        {
+          login: 'dummy-login'
+        } as IAssignee
+      ]);
+    });
+
+    describe('when the given issue does not contains the stale label', (): void => {
       beforeEach((): void => {
         issueInterface.pull_request = undefined;
+        issueInterface.labels = [];
         issue = new Issue(optionsInterface, issueInterface);
       });
 
-      it('should set the isPullRequest to false', (): void => {
+      it('should set the isStale to false', (): void => {
         expect.assertions(1);
 
-        expect(issue.isPullRequest).toStrictEqual(false);
+        expect(issue.isStale).toStrictEqual(false);
       });
     });
 
-    describe('when the given issue pull_request is set', (): void => {
+    describe('when the given issue contains the stale label', (): void => {
+      beforeEach((): void => {
+        issueInterface.pull_request = undefined;
+        issueInterface.labels = [
+          {
+            name: 'dummy-stale-issue-label'
+          } as ILabel
+        ];
+        issue = new Issue(optionsInterface, issueInterface);
+      });
+
+      it('should set the isStale to true', (): void => {
+        expect.assertions(1);
+
+        expect(issue.isStale).toStrictEqual(true);
+      });
+    });
+  });
+
+  describe('get isPullRequest', (): void => {
+    describe('when the issue pull_request is not set', (): void => {
+      beforeEach((): void => {
+        issueInterface.pull_request = undefined;
+        issue = new Issue(optionsInterface, issueInterface);
+      });
+
+      it('should return false', (): void => {
+        expect.assertions(1);
+
+        const result = issue.isPullRequest;
+
+        expect(result).toStrictEqual(false);
+      });
+    });
+
+    describe('when the issue pull_request is set', (): void => {
       beforeEach((): void => {
         issueInterface.pull_request = {};
         issue = new Issue(optionsInterface, issueInterface);
       });
 
-      it('should set the isPullRequest to true', (): void => {
+      it('should return true', (): void => {
         expect.assertions(1);
 
-        expect(issue.isPullRequest).toStrictEqual(true);
+        const result = issue.isPullRequest;
+
+        expect(result).toStrictEqual(true);
       });
     });
+  });
 
-    describe('when the given issue is not a pull request', (): void => {
+  describe('get staleLabel', (): void => {
+    describe('when the issue is not a pull request', (): void => {
       beforeEach((): void => {
         issueInterface.pull_request = undefined;
         issue = new Issue(optionsInterface, issueInterface);
       });
 
-      it('should set the staleLabel with the given option staleIssueLabel', (): void => {
+      it('should return the issue stale label', (): void => {
         expect.assertions(1);
 
-        expect(issue.staleLabel).toStrictEqual('dummy-stale-issue-label');
+        const result = issue.staleLabel;
+
+        expect(result).toStrictEqual('dummy-stale-issue-label');
       });
     });
 
@@ -170,42 +236,48 @@ describe('Issue', (): void => {
         issue = new Issue(optionsInterface, issueInterface);
       });
 
-      it('should set the staleLabel with the given option stalePrLabel', (): void => {
+      it('should return the pull request stale label', (): void => {
         expect.assertions(1);
 
-        expect(issue.staleLabel).toStrictEqual('dummy-stale-pr-label');
+        const result = issue.staleLabel;
+
+        expect(result).toStrictEqual('dummy-stale-pr-label');
       });
     });
+  });
 
-    describe('when the given issue does not contains the stale label', (): void => {
+  describe('get hasAssignees', (): void => {
+    describe('when the issue has no assignee', (): void => {
       beforeEach((): void => {
-        issueInterface.pull_request = undefined;
-        issueInterface.labels = [];
+        issueInterface.assignees = [];
         issue = new Issue(optionsInterface, issueInterface);
       });
 
-      it('should set the isStale to false', (): void => {
+      it('should return false', (): void => {
         expect.assertions(1);
 
-        expect(issue.isStale).toStrictEqual(false);
+        const result = issue.hasAssignees;
+
+        expect(result).toStrictEqual(false);
       });
     });
 
-    describe('when the given issue contains the stale label', (): void => {
+    describe('when the issue has at least one assignee', (): void => {
       beforeEach((): void => {
-        issueInterface.pull_request = undefined;
-        issueInterface.labels = [
+        issueInterface.assignees = [
           {
-            name: 'dummy-stale-issue-label'
-          } as ILabel
+            login: 'dummy-login'
+          }
         ];
         issue = new Issue(optionsInterface, issueInterface);
       });
 
-      it('should set the isStale to true', (): void => {
+      it('should return true', (): void => {
         expect.assertions(1);
 
-        expect(issue.isStale).toStrictEqual(true);
+        const result = issue.hasAssignees;
+
+        expect(result).toStrictEqual(true);
       });
     });
   });
diff --git a/src/classes/issue.ts b/src/classes/issue.ts
index af6f825..d48add6 100644
--- a/src/classes/issue.ts
+++ b/src/classes/issue.ts
@@ -1,5 +1,6 @@
 import {isLabeled} from '../functions/is-labeled';
 import {isPullRequest} from '../functions/is-pull-request';
+import {IAssignee} from '../interfaces/assignee';
 import {IIssue} from '../interfaces/issue';
 import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
 import {ILabel} from '../interfaces/label';
@@ -14,11 +15,10 @@ export class Issue implements IIssue {
   updated_at: IsoDateString;
   readonly labels: ILabel[];
   readonly pull_request: Object | null | undefined;
-  readonly state: string;
+  readonly state: string | 'closed' | 'open';
   readonly locked: boolean;
   readonly milestone: IMilestone | undefined;
-  readonly isPullRequest: boolean;
-  readonly staleLabel: string;
+  readonly assignees: IAssignee[];
   isStale: boolean;
 
   constructor(
@@ -35,12 +35,23 @@ export class Issue implements IIssue {
     this.state = issue.state;
     this.locked = issue.locked;
     this.milestone = issue.milestone;
+    this.assignees = issue.assignees;
 
-    this.isPullRequest = isPullRequest(this);
-    this.staleLabel = this._getStaleLabel();
     this.isStale = isLabeled(this, this.staleLabel);
   }
 
+  get isPullRequest(): boolean {
+    return isPullRequest(this);
+  }
+
+  get staleLabel(): string {
+    return this._getStaleLabel();
+  }
+
+  get hasAssignees(): boolean {
+    return this.assignees.length > 0;
+  }
+
   private _getStaleLabel(): string {
     return this.isPullRequest
       ? this._options.stalePrLabel
diff --git a/src/classes/issues-processor.ts b/src/classes/issues-processor.ts
index f6c86bd..cbed3f5 100644
--- a/src/classes/issues-processor.ts
+++ b/src/classes/issues-processor.ts
@@ -15,6 +15,7 @@ import {IIssue} from '../interfaces/issue';
 import {IIssueEvent} from '../interfaces/issue-event';
 import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
 import {IPullRequest} from '../interfaces/pull-request';
+import {Assignees} from './assignees';
 import {Issue} from './issue';
 import {IssueLogger} from './loggers/issue-logger';
 import {Logger} from './loggers/logger';
@@ -97,9 +98,7 @@ export class IssuesProcessor {
     for (const issue of issues.values()) {
       const issueLogger: IssueLogger = new IssueLogger(issue);
 
-      issueLogger.info(
-        `Found issue: issue #${issue.number} last updated ${issue.updated_at} (is pr? ${issue.isPullRequest})`
-      );
+      issueLogger.info(`Found this $$type last updated ${issue.updated_at}`);
 
       // calculate string based messages for this issue
       const staleMessage: string = issue.isPullRequest
@@ -121,30 +120,57 @@ export class IssuesProcessor {
       const daysBeforeStale: number = issue.isPullRequest
         ? this._getDaysBeforePrStale()
         : this._getDaysBeforeIssueStale();
+      const onlyLabels: string[] = wordsToList(this._getOnlyLabels(issue));
+
+      if (onlyLabels.length > 0) {
+        issueLogger.info(
+          `The option "onlyLabels" was specified to only processed the issues and pull requests with all those labels (${onlyLabels.length})`
+        );
+
+        const hasAllWhitelistedLabels: boolean = onlyLabels.every(
+          (label: Readonly<string>): boolean => {
+            return isLabeled(issue, label);
+          }
+        );
 
-      if (issue.isPullRequest) {
-        issueLogger.info(`Days before pull request stale: ${daysBeforeStale}`);
+        if (!hasAllWhitelistedLabels) {
+          issueLogger.info(
+            `Skipping this $$type because it doesn't have all the required labels`
+          );
+          continue; // Don't process issues without all of the required labels
+        } else {
+          issueLogger.info(
+            `All the required labels are present on this $$type. Continuing the process`
+          );
+        }
       } else {
-        issueLogger.info(`Days before issue stale: ${daysBeforeStale}`);
+        issueLogger.info(
+          `The option "onlyLabels" was not specified. Continuing the process for this $$type`
+        );
       }
 
+      issueLogger.info(`Days before $$type stale: ${daysBeforeStale}`);
+
       const shouldMarkAsStale: boolean = shouldMarkWhenStale(daysBeforeStale);
 
       if (!staleMessage && shouldMarkAsStale) {
-        issueLogger.info(`Skipping ${issueType} due to empty stale message`);
+        issueLogger.info(`Skipping $$type due to empty stale message`);
         continue;
       }
 
       if (issue.state === 'closed') {
-        issueLogger.info(`Skipping ${issueType} because it is closed`);
+        issueLogger.info(`Skipping $$type because it is closed`);
         continue; // don't process closed issues
       }
 
       if (issue.locked) {
-        issueLogger.info(`Skipping ${issueType} because it is locked`);
+        issueLogger.info(`Skipping $$type because it is locked`);
         continue; // don't process locked issues
       }
 
+      // Try to remove the close label when not close/locked issue or PR
+      await this._removeCloseLabel(issue, closeLabel);
+
       if (this.options.startDate) {
         const startDate: Date = new Date(this.options.startDate);
         const createdAt: Date = new Date(issue.created_at);
@@ -164,14 +190,14 @@ export class IssuesProcessor {
         }
 
         issueLogger.info(
-          `Issue created the ${getHumanizedDate(createdAt)} (${
+          `$$type created the ${getHumanizedDate(createdAt)} (${
             issue.created_at
           })`
         );
 
         if (!isDateMoreRecentThan(createdAt, startDate)) {
           issueLogger.info(
-            `Skipping ${issueType} because it was created before the specified start date`
+            `Skipping $$type because it was created before the specified start date`
           );
 
           continue; // don't process issues which were created before the start date
@@ -179,9 +205,9 @@ export class IssuesProcessor {
       }
 
       if (issue.isStale) {
-        issueLogger.info(`This issue has a stale label`);
+        issueLogger.info(`This $$type has a stale label`);
       } else {
-        issueLogger.info(`This issue hasn't a stale label`);
+        issueLogger.info(`This $$type hasn't a stale label`);
       }
 
       const exemptLabels: string[] = wordsToList(
@@ -200,9 +226,7 @@ export class IssuesProcessor {
           await this._removeStaleLabel(issue, staleLabel);
         }
 
-        issueLogger.info(
-          `Skipping ${issueType} because it has an exempt label`
-        );
+        issueLogger.info(`Skipping $$type because it has an exempt label`);
         continue; // don't process exempt issues
       }
 
@@ -210,11 +234,17 @@ export class IssuesProcessor {
 
       if (milestones.shouldExemptMilestones()) {
         issueLogger.info(
-          `Skipping ${issueType} because it has an exempt milestone`
+          `Skipping $$type because it has an exempted milestone`
         );
         continue; // don't process exempt milestones
       }
 
+      const assignees: Assignees = new Assignees(this.options, issue);
+
+      if (assignees.shouldExemptAssignees()) {
+        continue; // don't process exempt assignees
+      }
+
       // should this issue be marked stale?
       const shouldBeStale = !IssuesProcessor._updatedSince(
         issue.updated_at,
@@ -224,7 +254,7 @@ export class IssuesProcessor {
       // determine if this issue needs to be marked stale first
       if (!issue.isStale && shouldBeStale && shouldMarkAsStale) {
         issueLogger.info(
-          `Marking ${issueType} stale because it was last updated on ${issue.updated_at} and it does not have a stale label`
+          `Marking $$type stale because it was last updated on ${issue.updated_at} and it does not have a stale label`
         );
         await this._markStale(issue, staleMessage, staleLabel, skipMessage);
         issue.isStale = true; // this issue is now considered stale
@@ -236,7 +266,7 @@ export class IssuesProcessor {
 
       // process the issue if it was marked stale
       if (issue.isStale) {
-        issueLogger.info(`Found a stale ${issueType}`);
+        issueLogger.info(`Found a stale $$type`);
         await this._processStaleIssue(
           issue,
           issueType,
@@ -271,37 +301,27 @@ export class IssuesProcessor {
     const issueLogger: IssueLogger = new IssueLogger(issue);
     const markedStaleOn: string =
       (await this._getLabelCreationDate(issue, staleLabel)) || issue.updated_at;
-    issueLogger.info(
-      `Issue #${issue.number} marked stale on: ${markedStaleOn}`
-    );
+    issueLogger.info(`$$type marked stale on: ${markedStaleOn}`);
 
     const issueHasComments: boolean = await this._hasCommentsSince(
       issue,
       markedStaleOn,
       actor
     );
-    issueLogger.info(
-      `Issue #${issue.number} has been commented on: ${issueHasComments}`
-    );
+    issueLogger.info(`$$type has been commented on: ${issueHasComments}`);
 
     const isPr: boolean = isPullRequest(issue);
     const daysBeforeClose: number = isPr
       ? this._getDaysBeforePrClose()
       : this._getDaysBeforeIssueClose();
 
-    if (isPr) {
-      issueLogger.info(`Days before pull request close: ${daysBeforeClose}`);
-    } else {
-      issueLogger.info(`Days before issue close: ${daysBeforeClose}`);
-    }
+    issueLogger.info(`Days before $$type close: ${daysBeforeClose}`);
 
     const issueHasUpdate: boolean = IssuesProcessor._updatedSince(
       issue.updated_at,
       daysBeforeClose
     );
-    issueLogger.info(
-      `Issue #${issue.number} has been updated: ${issueHasUpdate}`
-    );
+    issueLogger.info(`$$type has been updated: ${issueHasUpdate}`);
 
     // should we un-stale this issue?
     if (this.options.removeStaleWhenUpdated && issueHasComments) {
@@ -315,20 +335,20 @@ export class IssuesProcessor {
 
     if (!issueHasComments && !issueHasUpdate) {
       issueLogger.info(
-        `Closing ${issueType} because it was last updated on ${issue.updated_at}`
+        `Closing $$type because it was last updated on ${issue.updated_at}`
       );
       await this._closeIssue(issue, closeMessage, closeLabel);
 
       if (this.options.deleteBranch && issue.pull_request) {
         issueLogger.info(
-          `Deleting branch for #${issue.number} as delete-branch option was specified`
+          `Deleting branch for as delete-branch option was specified`
         );
         await this._deleteBranch(issue);
         this.deletedBranchIssues.push(issue);
       }
     } else {
       issueLogger.info(
-        `Stale ${issueType} is not old enough to close yet (hasComments? ${issueHasComments}, hasUpdate? ${issueHasUpdate})`
+        `Stale $$type is not old enough to close yet (hasComments? ${issueHasComments}, hasUpdate? ${issueHasUpdate})`
       );
     }
   }
@@ -341,9 +361,7 @@ export class IssuesProcessor {
   ): Promise<boolean> {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
-    issueLogger.info(
-      `Checking for comments on issue #${issue.number} since ${sinceDate}`
-    );
+    issueLogger.info(`Checking for comments on $$type since ${sinceDate}`);
 
     if (!sinceDate) {
       return true;
@@ -408,7 +426,6 @@ export class IssuesProcessor {
           owner: context.repo.owner,
           repo: context.repo.repo,
           state: 'open',
-          labels: this.options.onlyLabels,
           per_page: 100,
           direction: this.options.ascending ? 'asc' : 'desc',
           page
@@ -433,7 +450,7 @@ export class IssuesProcessor {
   ): Promise<void> {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
-    issueLogger.info(`Marking issue #${issue.number} as stale`);
+    issueLogger.info(`Marking $$type as stale`);
 
     this.staleIssues.push(issue);
 
@@ -481,7 +498,7 @@ export class IssuesProcessor {
   ): Promise<void> {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
-    issueLogger.info(`Closing issue #${issue.number} for being stale`);
+    issueLogger.info(`Closing $$type for being stale`);
 
     this.closedIssues.push(issue);
 
@@ -525,7 +542,7 @@ export class IssuesProcessor {
         state: 'closed'
       });
     } catch (error) {
-      issueLogger.error(`Error updating an issue: ${error.message}`);
+      issueLogger.error(`Error updating this $$type: ${error.message}`);
     }
   }
 
@@ -544,9 +561,7 @@ export class IssuesProcessor {
 
       return pullRequest.data;
     } catch (error) {
-      issueLogger.error(
-        `Error getting pull request ${issue.number}: ${error.message}`
-      );
+      issueLogger.error(`Error getting this $$type: ${error.message}`);
     }
   }
 
@@ -554,9 +569,7 @@ export class IssuesProcessor {
   private async _deleteBranch(issue: Issue): Promise<void> {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
-    issueLogger.info(
-      `Delete branch from closed issue #${issue.number} - ${issue.title}`
-    );
+    issueLogger.info(`Delete branch from closed $$type - ${issue.title}`);
 
     if (this.options.debugOnly) {
       return;
@@ -566,15 +579,13 @@ export class IssuesProcessor {
 
     if (!pullRequest) {
       issueLogger.info(
-        `Not deleting branch as pull request not found for issue ${issue.number}`
+        `Not deleting branch as pull request not found for this $$type`
       );
       return;
     }
 
     const branch = pullRequest.head.ref;
-    issueLogger.info(
-      `Deleting branch ${branch} from closed issue #${issue.number}`
-    );
+    issueLogger.info(`Deleting branch ${branch} from closed $$type`);
 
     this._operationsLeft -= 1;
 
@@ -586,7 +597,7 @@ export class IssuesProcessor {
       });
     } catch (error) {
       issueLogger.error(
-        `Error deleting branch ${branch} from issue #${issue.number}: ${error.message}`
+        `Error deleting branch ${branch} from $$type: ${error.message}`
       );
     }
   }
@@ -595,7 +606,7 @@ export class IssuesProcessor {
   private async _removeLabel(issue: Issue, label: string): Promise<void> {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
-    issueLogger.info(`Removing label "${label}" from issue #${issue.number}`);
+    issueLogger.info(`Removing label "${label}" from $$type`);
 
     this.removedLabelIssues.push(issue);
 
@@ -626,7 +637,7 @@ export class IssuesProcessor {
   ): Promise<string | undefined> {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
-    issueLogger.info(`Checking for label on issue #${issue.number}`);
+    issueLogger.info(`Checking for label on $$type`);
 
     this._operationsLeft -= 1;
 
@@ -676,6 +687,20 @@ export class IssuesProcessor {
       : this.options.daysBeforePrClose;
   }
 
+  private _getOnlyLabels(issue: Issue): string {
+    if (issue.isPullRequest) {
+      if (this.options.onlyPrLabels !== '') {
+        return this.options.onlyPrLabels;
+      }
+    } else {
+      if (this.options.onlyIssueLabels !== '') {
+        return this.options.onlyIssueLabels;
+      }
+    }
+
+    return this.options.onlyLabels;
+  }
+
   private async _removeStaleLabel(
     issue: Issue,
     staleLabel: Readonly<string>
@@ -683,9 +708,34 @@ export class IssuesProcessor {
     const issueLogger: IssueLogger = new IssueLogger(issue);
 
     issueLogger.info(
-      `Issue #${issue.number} is no longer stale. Removing stale label.`
+      `The $$type is no longer stale. Removing the stale label...`
     );
 
     return this._removeLabel(issue, staleLabel);
   }
+
+  private async _removeCloseLabel(
+    issue: Issue,
+    closeLabel: Readonly<string | undefined>
+  ): Promise<void> {
+    const issueLogger: IssueLogger = new IssueLogger(issue);
+
+    issueLogger.info(
+      `The $$type is not closed nor locked. Trying to remove the close label...`
+    );
+
+    if (!closeLabel) {
+      issueLogger.info(`There is no close label on this $$type. Skip`);
+
+      return Promise.resolve();
+    }
+
+    if (isLabeled(issue, closeLabel)) {
+      issueLogger.info(
+        `The $$type has a close label "${closeLabel}". Removing the close label...`
+      );
+
+      return this._removeLabel(issue, closeLabel);
+    }
+  }
 }
diff --git a/src/classes/loggers/issue-logger.spec.ts b/src/classes/loggers/issue-logger.spec.ts
index 27e7f90..2ff4835 100644
--- a/src/classes/loggers/issue-logger.spec.ts
+++ b/src/classes/loggers/issue-logger.spec.ts
@@ -1,3 +1,5 @@
+import {DefaultProcessorOptions} from '../../../__tests__/constants/default-processor-options';
+import {generateIIssue} from '../../../__tests__/functions/generate-iissue';
 import {Issue} from '../issue';
 import {IssueLogger} from './issue-logger';
 import * as core from '@actions/core';
@@ -5,21 +7,20 @@ import * as core from '@actions/core';
 describe('IssueLogger', (): void => {
   let issue: Issue;
   let issueLogger: IssueLogger;
+  let message: string;
 
-  beforeEach((): void => {
-    issue = {
-      number: 8
-    } as Issue;
-    issueLogger = new IssueLogger(issue);
-  });
+  let coreWarningSpy: jest.SpyInstance;
 
   describe('warning()', (): void => {
-    let message: string;
-
-    let coreWarningSpy: jest.SpyInstance;
-
     beforeEach((): void => {
       message = 'dummy-message';
+      issue = new Issue(
+        DefaultProcessorOptions,
+        generateIIssue({
+          number: 8
+        })
+      );
+      issueLogger = new IssueLogger(issue);
 
       coreWarningSpy = jest.spyOn(core, 'warning').mockImplementation();
     });
@@ -35,12 +36,17 @@ describe('IssueLogger', (): void => {
   });
 
   describe('info()', (): void => {
-    let message: string;
-
     let coreInfoSpy: jest.SpyInstance;
 
     beforeEach((): void => {
       message = 'dummy-message';
+      issue = new Issue(
+        DefaultProcessorOptions,
+        generateIIssue({
+          number: 8
+        })
+      );
+      issueLogger = new IssueLogger(issue);
 
       coreInfoSpy = jest.spyOn(core, 'info').mockImplementation();
     });
@@ -56,12 +62,17 @@ describe('IssueLogger', (): void => {
   });
 
   describe('error()', (): void => {
-    let message: string;
-
     let coreErrorSpy: jest.SpyInstance;
 
     beforeEach((): void => {
       message = 'dummy-message';
+      issue = new Issue(
+        DefaultProcessorOptions,
+        generateIIssue({
+          number: 8
+        })
+      );
+      issueLogger = new IssueLogger(issue);
 
       coreErrorSpy = jest.spyOn(core, 'error').mockImplementation();
     });
@@ -75,4 +86,82 @@ describe('IssueLogger', (): void => {
       expect(coreErrorSpy).toHaveBeenCalledWith('[#8] dummy-message');
     });
   });
+
+  it('should prefix the message with the issue number', (): void => {
+    expect.assertions(2);
+    message = 'dummy-message';
+    issue = new Issue(
+      DefaultProcessorOptions,
+      generateIIssue({
+        number: 123
+      })
+    );
+    issueLogger = new IssueLogger(issue);
+    coreWarningSpy = jest.spyOn(core, 'warning').mockImplementation();
+
+    issueLogger.warning(message);
+
+    expect(coreWarningSpy).toHaveBeenCalledTimes(1);
+    expect(coreWarningSpy).toHaveBeenCalledWith('[#123] dummy-message');
+  });
+
+  it.each`
+    pull_request      | replacement
+    ${{key: 'value'}} | ${'pull request'}
+    ${{}}             | ${'pull request'}
+    ${null}           | ${'issue'}
+    ${undefined}      | ${'issue'}
+  `(
+    'should replace the special tokens "$$type" with the corresponding type',
+    ({pull_request, replacement}): void => {
+      expect.assertions(2);
+      message = 'The $$type will stale! $$type will soon be closed!';
+      issue = new Issue(
+        DefaultProcessorOptions,
+        generateIIssue({
+          number: 8,
+          pull_request
+        })
+      );
+      issueLogger = new IssueLogger(issue);
+      coreWarningSpy = jest.spyOn(core, 'warning').mockImplementation();
+
+      issueLogger.warning(message);
+
+      expect(coreWarningSpy).toHaveBeenCalledTimes(1);
+      expect(coreWarningSpy).toHaveBeenCalledWith(
+        `[#8] The ${replacement} will stale! ${replacement} will soon be closed!`
+      );
+    }
+  );
+
+  it.each`
+    pull_request      | replacement
+    ${{key: 'value'}} | ${'Pull request'}
+    ${{}}             | ${'Pull request'}
+    ${null}           | ${'Issue'}
+    ${undefined}      | ${'Issue'}
+  `(
+    'should replace the special token "$$type" with the corresponding type with first letter as uppercase',
+    ({pull_request, replacement}): void => {
+      expect.assertions(2);
+      message = '$$type will stale';
+      issue = new Issue(
+        DefaultProcessorOptions,
+        generateIIssue({
+          number: 8,
+          pull_request
+        })
+      );
+      issueLogger = new IssueLogger(issue);
+      coreWarningSpy = jest.spyOn(core, 'warning').mockImplementation();
+
+      issueLogger.warning(message);
+
+      expect(coreWarningSpy).toHaveBeenCalledTimes(1);
+      expect(coreWarningSpy).toHaveBeenCalledWith(
+        `[#8] ${replacement} will stale`
+      );
+    }
+  );
 });
diff --git a/src/classes/loggers/issue-logger.ts b/src/classes/loggers/issue-logger.ts
index 979c231..ef4cd1a 100644
--- a/src/classes/loggers/issue-logger.ts
+++ b/src/classes/loggers/issue-logger.ts
@@ -2,6 +2,19 @@ import * as core from '@actions/core';
 import {Issue} from '../issue';
 import {Logger} from './logger';
 
+/**
+ * @description
+ * Each log will prefix the message with the issue number
+ *
+ * @example
+ * warning('No stale') => "[#123] No stale"
+ *
+ * Each log method can have special tokens:
+ * - $$type => will replace this by either "pull request" or "issue" depending of the type of issue
+ *
+ * @example
+ * warning('The $$type will stale') => "The pull request will stale"
+ */
 export class IssueLogger implements Logger {
   private readonly _issue: Issue;
 
@@ -10,15 +23,31 @@ export class IssueLogger implements Logger {
   }
 
   warning(message: Readonly<string>): void {
-    core.warning(this._prefixWithIssueNumber(message));
+    core.warning(this._format(message));
   }
 
   info(message: Readonly<string>): void {
-    core.info(this._prefixWithIssueNumber(message));
+    core.info(this._format(message));
   }
 
   error(message: Readonly<string>): void {
-    core.error(this._prefixWithIssueNumber(message));
+    core.error(this._format(message));
+  }
+
+  private _replaceTokens(message: Readonly<string>): string {
+    return this._replaceTypeToken(message);
+  }
+
+  private _replaceTypeToken(message: Readonly<string>): string {
+    return message
+      .replace(
+        /^\$\$type/,
+        this._issue.isPullRequest ? 'Pull request' : 'Issue'
+      )
+      .replace(
+        /\$\$type/g,
+        this._issue.isPullRequest ? 'pull request' : 'issue'
+      );
   }
 
   private _prefixWithIssueNumber(message: Readonly<string>): string {
@@ -28,4 +57,8 @@ export class IssueLogger implements Logger {
   private _getIssueNumber(): number {
     return this._issue.number;
   }
+
+  private _format(message: Readonly<string>): string {
+    return this._prefixWithIssueNumber(this._replaceTokens(message));
+  }
 }
diff --git a/src/classes/milestones.spec.ts b/src/classes/milestones.spec.ts
index d010fb7..91b2744 100644
--- a/src/classes/milestones.spec.ts
+++ b/src/classes/milestones.spec.ts
@@ -1,3 +1,5 @@
+import {DefaultProcessorOptions} from '../../__tests__/constants/default-processor-options';
+import {generateIIssue} from '../../__tests__/functions/generate-iissue';
 import {IIssue} from '../interfaces/issue';
 import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
 import {Issue} from './issue';
@@ -10,51 +12,8 @@ describe('Milestones', (): void => {
   let issueInterface: IIssue;
 
   beforeEach((): void => {
-    optionsInterface = {
-      ascending: false,
-      closeIssueLabel: '',
-      closeIssueMessage: '',
-      closePrLabel: '',
-      closePrMessage: '',
-      daysBeforeClose: 0,
-      daysBeforeIssueClose: 0,
-      daysBeforeIssueStale: 0,
-      daysBeforePrClose: 0,
-      daysBeforePrStale: 0,
-      daysBeforeStale: 0,
-      debugOnly: false,
-      deleteBranch: false,
-      exemptIssueLabels: '',
-      exemptPrLabels: '',
-      onlyLabels: '',
-      operationsPerRun: 0,
-      removeStaleWhenUpdated: false,
-      repoToken: '',
-      skipStaleIssueMessage: false,
-      skipStalePrMessage: false,
-      staleIssueLabel: '',
-      staleIssueMessage: '',
-      stalePrLabel: '',
-      stalePrMessage: '',
-      startDate: undefined,
-      exemptIssueMilestones: '',
-      exemptPrMilestones: '',
-      exemptMilestones: '',
-      exemptAllMilestones: false,
-      exemptAllIssueMilestones: undefined,
-      exemptAllPrMilestones: undefined
-    };
-    issueInterface = {
-      created_at: '',
-      locked: false,
-      milestone: undefined,
-      number: 0,
-      pull_request: undefined,
-      state: '',
-      title: '',
-      updated_at: '',
-      labels: []
-    };
+    optionsInterface = {...DefaultProcessorOptions};
+    issueInterface = generateIIssue();
   });
 
   describe('shouldExemptMilestones()', (): void => {
diff --git a/src/classes/milestones.ts b/src/classes/milestones.ts
index eeb9139..a891f22 100644
--- a/src/classes/milestones.ts
+++ b/src/classes/milestones.ts
@@ -6,8 +6,8 @@ import {Issue} from './issue';
 type CleanMilestone = string;
 
 export class Milestones {
-  private static _cleanMilestone(label: Readonly<string>): CleanMilestone {
-    return deburr(label.toLowerCase());
+  private static _cleanMilestone(milestone: Readonly<string>): CleanMilestone {
+    return deburr(milestone.toLowerCase());
   }
 
   private readonly _options: IIssuesProcessorOptions;
diff --git a/src/interfaces/assignee.ts b/src/interfaces/assignee.ts
new file mode 100644
index 0000000..4d5293e
--- /dev/null
+++ b/src/interfaces/assignee.ts
@@ -0,0 +1,3 @@
+export interface IAssignee {
+  login: string;
+}
diff --git a/src/interfaces/issue.ts b/src/interfaces/issue.ts
index 0df42eb..5060eb9 100644
--- a/src/interfaces/issue.ts
+++ b/src/interfaces/issue.ts
@@ -1,4 +1,5 @@
 import {IsoDateString} from '../types/iso-date-string';
+import {IAssignee} from './assignee';
 import {ILabel} from './label';
 import {IMilestone} from './milestone';
 
@@ -12,4 +13,5 @@ export interface IIssue {
   state: string;
   locked: boolean;
   milestone: IMilestone | undefined;
+  assignees: IAssignee[];
 }
diff --git a/src/interfaces/issues-processor-options.ts b/src/interfaces/issues-processor-options.ts
index 8a74cab..28027e9 100644
--- a/src/interfaces/issues-processor-options.ts
+++ b/src/interfaces/issues-processor-options.ts
@@ -19,6 +19,8 @@ export interface IIssuesProcessorOptions {
   closePrLabel: string;
   exemptPrLabels: string;
   onlyLabels: string;
+  onlyIssueLabels: string;
+  onlyPrLabels: string;
   operationsPerRun: number;
   removeStaleWhenUpdated: boolean;
   debugOnly: boolean;
@@ -33,4 +35,10 @@ export interface IIssuesProcessorOptions {
   exemptAllMilestones: boolean;
   exemptAllIssueMilestones: boolean | undefined;
   exemptAllPrMilestones: boolean | undefined;
+  exemptAssignees: string;
+  exemptIssueAssignees: string;
+  exemptPrAssignees: string;
+  exemptAllAssignees: boolean;
+  exemptAllIssueAssignees: boolean | undefined;
+  exemptAllPrAssignees: boolean | undefined;
 }
diff --git a/src/main.ts b/src/main.ts
index 7620c05..f5dd905 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -39,6 +39,8 @@ function _getAndValidateArgs(): IIssuesProcessorOptions {
     closePrLabel: core.getInput('close-pr-label'),
     exemptPrLabels: core.getInput('exempt-pr-labels'),
     onlyLabels: core.getInput('only-labels'),
+    onlyIssueLabels: core.getInput('only-issue-labels'),
+    onlyPrLabels: core.getInput('only-pr-labels'),
     operationsPerRun: parseInt(
       core.getInput('operations-per-run', {required: true})
     ),
@@ -59,7 +61,13 @@ function _getAndValidateArgs(): IIssuesProcessorOptions {
     exemptPrMilestones: core.getInput('exempt-pr-milestones'),
     exemptAllMilestones: core.getInput('exempt-all-milestones') === 'true',
     exemptAllIssueMilestones: _toOptionalBoolean('exempt-all-issue-milestones'),
-    exemptAllPrMilestones: _toOptionalBoolean('exempt-all-pr-milestones')
+    exemptAllPrMilestones: _toOptionalBoolean('exempt-all-pr-milestones'),
+    exemptAssignees: core.getInput('exempt-assignees'),
+    exemptIssueAssignees: core.getInput('exempt-issue-assignees'),
+    exemptPrAssignees: core.getInput('exempt-pr-assignees'),
+    exemptAllAssignees: core.getInput('exempt-all-assignees') === 'true',
+    exemptAllIssueAssignees: _toOptionalBoolean('exempt-all-issue-assignees'),
+    exemptAllPrAssignees: _toOptionalBoolean('exempt-all-pr-assignees')
   };
 
   for (const numberInput of [
@@ -100,4 +108,4 @@ function _toOptionalBoolean(
   return undefined;
 }
 
-_run();
+void _run();


Test patch:
diff --git a/__tests__/assignees.spec.ts b/__tests__/assignees.spec.ts
new file mode 100644
index 0000000..c60dac7
--- /dev/null
+++ b/__tests__/assignees.spec.ts
@@ -0,0 +1,413 @@
+import {Issue} from '../src/classes/issue';
+import {IssuesProcessor} from '../src/classes/issues-processor';
+import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
+import {DefaultProcessorOptions} from './constants/default-processor-options';
+import {generateIssue} from './functions/generate-issue';
+
+interface ITestData {
+  id: number;
+  isPullRequest: boolean;
+  assignees: string[];
+  exemptAllAssignees: boolean;
+  exemptAllIssueAssignees: boolean | undefined;
+  exemptAllPrAssignees: boolean | undefined;
+  exemptAssignees: string;
+  exemptIssueAssignees: string;
+  exemptPrAssignees: string;
+  shouldStale: boolean;
+  description: string;
+}
+
+describe('assignees options', (): void => {
+  let opts: IIssuesProcessorOptions;
+  let testIssueList: Issue[];
+  let processor: IssuesProcessor;
+
+  const setTestIssueList = (
+    isPullRequest: boolean,
+    assignees: string[],
+    id: number
+  ) => {
+    testIssueList = [
+      generateIssue(
+        opts,
+        id,
+        'My first issue',
+        '2020-01-01T17:00:00Z',
+        '2020-01-01T17:00:00Z',
+        isPullRequest,
+        undefined,
+        undefined,
+        undefined,
+        undefined,
+        assignees
+      )
+    ];
+  };
+
+  const setProcessor = () => {
+    processor = new IssuesProcessor(
+      opts,
+      async () => 'abot',
+      async p => (p === 1 ? testIssueList : []),
+      async () => [],
+      async () => new Date().toDateString()
+    );
+  };
+
+  beforeEach((): void => {
+    opts = {...DefaultProcessorOptions};
+  });
+
+  describe.each`
+    id      | isPullRequest | assignees       | exemptAllAssignees | exemptAllIssueAssignees | exemptAllPrAssignees | exemptAssignees | exemptIssueAssignees | exemptPrAssignees | shouldStale | description
+    ${100}  | ${false}      | ${[]}           | ${false}           | ${undefined}            | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee'}
+    ${101}  | ${false}      | ${[]}           | ${true}            | ${undefined}            | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and only exemptAllAssignees is enabled'}
+    ${102}  | ${false}      | ${[]}           | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and only exemptAllIssueAssignees is enabled'}
+    ${103}  | ${false}      | ${[]}           | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and only exemptAllPrAssignees is enabled'}
+    ${104}  | ${false}      | ${[]}           | ${true}            | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is disabled'}
+    ${105}  | ${false}      | ${[]}           | ${true}            | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is enabled'}
+    ${106}  | ${false}      | ${[]}           | ${true}            | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is disabled'}
+    ${107}  | ${false}      | ${[]}           | ${true}            | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is enabled'}
+    ${108}  | ${false}      | ${[]}           | ${false}           | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is disabled'}
+    ${109}  | ${false}      | ${[]}           | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue does not have an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is enabled'}
+    ${200}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is disabled'}
+    ${201}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is enabled'}
+    ${202}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and only exemptAllAssignees is enabled'}
+    ${203}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and only exemptAllIssueAssignees is enabled'}
+    ${204}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and only exemptAllPrAssignees is enabled'}
+    ${205}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is disabled'}
+    ${206}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is enabled'}
+    ${207}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is disabled'}
+    ${208}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is enabled'}
+    ${209}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is disabled'}
+    ${210}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is enabled'}
+    ${211}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is disabled'}
+    ${212}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is enabled'}
+    ${213}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is disabled'}
+    ${300}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${301}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${302}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAssignees has a different assignee'}
+    ${303}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees has a different assignee'}
+    ${304}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${305}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees has a different assignee'}
+    ${306}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees has a different assignee'}
+    ${307}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${308}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${309}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees has a different assignee'}
+    ${310}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees has a different assignee'}
+    ${311}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${312}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${313}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${400}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${401}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${402}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAssignees has the same assignee'}
+    ${403}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees has the same assignee'}
+    ${404}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${405}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees has the same assignee'}
+    ${406}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees has the same assignee'}
+    ${407}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${408}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${409}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees has the same assignee'}
+    ${410}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees has the same assignee'}
+    ${411}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${412}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${413}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${500}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${501}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${502}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${503}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${504}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${505}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${506}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${507}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${508}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${509}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${510}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${511}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${512}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${513}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${600}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${601}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${602}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${603}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${604}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${605}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${606}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${607}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${608}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${609}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${610}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${611}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${612}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${613}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${700}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${701}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${702}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${703}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${704}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${705}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${706}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${707}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${708}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${709}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${710}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${711}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${712}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${713}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${800}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${801}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${802}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${803}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${804}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${805}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${806}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${807}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${808}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${809}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${810}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${811}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${812}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${813}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'assignee'}     | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${900}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${901}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${902}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${903}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${904}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${905}  | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${906}  | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${907}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${908}  | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${909}  | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${910}  | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${911}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${912}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${913}  | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'bad'}             | ${''}             | ${true}     | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${1000} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1001} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1002} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1003} | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1004} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1005} | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1006} | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1007} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1008} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1009} | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1010} | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1011} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1012} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1013} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${1100} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1101} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1102} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1103} | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1104} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1105} | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1106} | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1107} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1108} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1109} | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1110} | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1111} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1112} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1113} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${1200} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1201} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1202} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1203} | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1204} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1205} | ${false}      | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1206} | ${false}      | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1207} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1208} | ${false}      | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1209} | ${false}      | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1210} | ${false}      | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1211} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1212} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1213} | ${false}      | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the issue has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${1300} | ${true}       | ${[]}           | ${false}           | ${undefined}            | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee'}
+    ${1301} | ${true}       | ${[]}           | ${true}            | ${undefined}            | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and only exemptAllAssignees is enabled'}
+    ${1302} | ${true}       | ${[]}           | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and only exemptAllIssueAssignees is enabled'}
+    ${1303} | ${true}       | ${[]}           | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and only exemptAllPrAssignees is enabled'}
+    ${1304} | ${true}       | ${[]}           | ${true}            | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is disabled'}
+    ${1305} | ${true}       | ${[]}           | ${true}            | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is enabled'}
+    ${1306} | ${true}       | ${[]}           | ${true}            | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is disabled'}
+    ${1307} | ${true}       | ${[]}           | ${true}            | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is enabled'}
+    ${1308} | ${true}       | ${[]}           | ${false}           | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is disabled'}
+    ${1309} | ${true}       | ${[]}           | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request does not have an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is enabled'}
+    ${1400} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is disabled'}
+    ${1401} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is enabled'}
+    ${1402} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and only exemptAllAssignees is enabled'}
+    ${1403} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and only exemptAllIssueAssignees is enabled'}
+    ${1404} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and only exemptAllPrAssignees is enabled'}
+    ${1405} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is disabled'}
+    ${1406} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAllIssueAssignees is enabled'}
+    ${1407} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is disabled'}
+    ${1408} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAllPrAssignees is enabled'}
+    ${1409} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is disabled'}
+    ${1410} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllIssueAssignees is enabled'}
+    ${1411} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is disabled'}
+    ${1412} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${''}           | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is enabled'}
+    ${1413} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${''}           | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled and exemptAllPrAssignees is disabled'}
+    ${1500} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${1501} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1502} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1503} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1504} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1505} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees has a different assignee'}
+    ${1506} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1507} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${1508} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1509} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees has a different assignee'}
+    ${1510} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees has a different assignee'}
+    ${1511} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${1513} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has a different assignee'}
+    ${1600} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${1601} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1602} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1603} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1604} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1605} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees has the same assignee'}
+    ${1606} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1607} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${1608} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1609} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees has the same assignee'}
+    ${1610} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1611} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${1612} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees has the same assignee'}
+    ${1613} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees has the same assignee'}
+    ${1701} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1702} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1703} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1704} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1705} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1706} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1707} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1708} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1709} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1710} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1711} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'bad'}             | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptIssueAssignees has a different assignee'}
+    ${1800} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1801} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1802} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1803} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1804} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1805} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${'assignee'}        | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1806} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1807} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1808} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${'assignee'}        | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1809} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1810} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${'assignee'}        | ${''}             | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptIssueAssignees has the same assignee'}
+    ${1900} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1901} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1902} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1903} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1904} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1905} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1906} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1907} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1908} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1909} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1910} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${1911} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled and exemptAssignees and exemptPrAssignees has a different assignee'}
+    ${2000} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2001} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2002} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2003} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2004} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2005} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2006} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2007} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2008} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2009} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2010} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'bad'}        | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has a different assignee and exemptPrAssignees has the same assignee'}
+    ${2100} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2101} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2102} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2103} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2104} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2105} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2106} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2107} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2108} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2109} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2110} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'bad'}             | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has a different assignee'}
+    ${2200} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2201} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2202} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2203} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2204} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2205} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2206} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2207} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2208} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2209} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2210} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2311} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2312} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2313} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${'assignee'}        | ${''}             | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptIssueAssignees has the same assignee'}
+    ${2300} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2301} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2302} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2303} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2304} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2305} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2306} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2307} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2308} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2309} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2310} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'bad'}          | ${true}     | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2311} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'bad'}          | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has a different assignee'}
+    ${2400} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2401} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2402} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2403} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2404} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2405} | ${true}       | ${['assignee']} | ${true}            | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2406} | ${true}       | ${['assignee']} | ${true}            | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2407} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2408} | ${true}       | ${['assignee']} | ${true}            | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is enabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2409} | ${true}       | ${['assignee']} | ${false}           | ${false}                | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2410} | ${true}       | ${['assignee']} | ${false}           | ${true}                 | ${undefined}         | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllIssueAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2411} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2412} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${true}              | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is enabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+    ${2413} | ${true}       | ${['assignee']} | ${false}           | ${undefined}            | ${false}             | ${'assignee'}   | ${''}                | ${'assignee'}     | ${false}    | ${'when the pull request has an assignee and exemptAllAssignees is disabled, exemptAllPrAssignees is disabled, exemptAssignees has the same assignee and exemptPrAssignees has the same assignee'}
+  `(
+    '$description',
+    ({
+      id,
+      isPullRequest,
+      assignees,
+      exemptAllAssignees,
+      exemptAllIssueAssignees,
+      exemptAllPrAssignees,
+      exemptAssignees,
+      exemptIssueAssignees,
+      exemptPrAssignees,
+      shouldStale
+    }: ITestData): void => {
+      beforeEach((): void => {
+        opts.exemptAllAssignees = exemptAllAssignees;
+        opts.exemptAllIssueAssignees = exemptAllIssueAssignees;
+        opts.exemptAllPrAssignees = exemptAllPrAssignees;
+        opts.exemptAssignees = exemptAssignees;
+        opts.exemptIssueAssignees = exemptIssueAssignees;
+        opts.exemptPrAssignees = exemptPrAssignees;
+        setTestIssueList(isPullRequest, assignees, id);
+        setProcessor();
+      });
+
+      test(`should${
+        shouldStale ? '' : ' not'
+      } be marked as stale`, async () => {
+        expect.assertions(3);
+
+        await processor.processIssues(1);
+
+        expect(processor.staleIssues).toHaveLength(shouldStale ? 1 : 0);
+        expect(processor.closedIssues).toHaveLength(0);
+        expect(processor.removedLabelIssues).toHaveLength(0);
+      });
+    }
+  );
+});
diff --git a/__tests__/constants/default-processor-options.ts b/__tests__/constants/default-processor-options.ts
index 941fac4..da7b7ca 100644
--- a/__tests__/constants/default-processor-options.ts
+++ b/__tests__/constants/default-processor-options.ts
@@ -19,6 +19,8 @@ export const DefaultProcessorOptions: IIssuesProcessorOptions = Object.freeze({
   closePrLabel: '',
   exemptPrLabels: '',
   onlyLabels: '',
+  onlyIssueLabels: '',
+  onlyPrLabels: '',
   operationsPerRun: 100,
   debugOnly: true,
   removeStaleWhenUpdated: false,
@@ -32,5 +34,11 @@ export const DefaultProcessorOptions: IIssuesProcessorOptions = Object.freeze({
   exemptPrMilestones: '',
   exemptAllMilestones: false,
   exemptAllIssueMilestones: undefined,
-  exemptAllPrMilestones: undefined
+  exemptAllPrMilestones: undefined,
+  exemptAssignees: '',
+  exemptIssueAssignees: '',
+  exemptPrAssignees: '',
+  exemptAllAssignees: false,
+  exemptAllIssueAssignees: undefined,
+  exemptAllPrAssignees: undefined
 });
diff --git a/__tests__/functions/generate-iissue.ts b/__tests__/functions/generate-iissue.ts
new file mode 100644
index 0000000..b3a8c59
--- /dev/null
+++ b/__tests__/functions/generate-iissue.ts
@@ -0,0 +1,19 @@
+import {IIssue} from '../../src/interfaces/issue';
+
+export function generateIIssue(
+  partialIssue?: Readonly<Partial<IIssue>>
+): IIssue {
+  return {
+    milestone: undefined,
+    assignees: [],
+    labels: [],
+    created_at: new Date().toISOString(),
+    updated_at: new Date().toISOString(),
+    number: Math.round(Math.random() * 5000),
+    pull_request: null,
+    title: 'dummy-title',
+    locked: false,
+    state: 'dummy-state',
+    ...partialIssue
+  };
+}
diff --git a/__tests__/functions/generate-issue.ts b/__tests__/functions/generate-issue.ts
index 90aabc0..3b3fe43 100644
--- a/__tests__/functions/generate-issue.ts
+++ b/__tests__/functions/generate-issue.ts
@@ -1,4 +1,5 @@
 import {Issue} from '../../src/classes/issue';
+import {IAssignee} from '../../src/interfaces/assignee';
 import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options';
 import {IsoDateString} from '../../src/types/iso-date-string';
 
@@ -12,7 +13,8 @@ export function generateIssue(
   labels: string[] = [],
   isClosed = false,
   isLocked = false,
-  milestone: string | undefined = undefined
+  milestone: string | undefined = undefined,
+  assignees: string[] = []
 ): Issue {
   return new Issue(options, {
     number: id,
@@ -29,6 +31,13 @@ export function generateIssue(
       ? {
           title: milestone
         }
-      : undefined
+      : undefined,
+    assignees: assignees.map(
+      (assignee: Readonly<string>): IAssignee => {
+        return {
+          login: assignee
+        };
+      }
+    )
   });
 }
diff --git a/__tests__/main.spec.ts b/__tests__/main.spec.ts
index 46ea62f..fcb5544 100644
--- a/__tests__/main.spec.ts
+++ b/__tests__/main.spec.ts
@@ -2112,3 +2112,111 @@ test('processing a pull request opened since 2 days and with the option "daysBef
   expect(processor.staleIssues.length).toEqual(1);
   expect(processor.closedIssues.length).toEqual(0);
 });
+
+test('processing a previously closed issue with a close label will remove the close label', async () => {
+  expect.assertions(1);
+  const opts: IIssuesProcessorOptions = {
+    ...DefaultProcessorOptions,
+    closeIssueLabel: 'close',
+    staleIssueLabel: 'stale'
+  };
+  const now: Date = new Date();
+  const oneWeekAgo: Date = new Date(now.getDate() - 7);
+  const TestIssueList: Issue[] = [
+    generateIssue(
+      opts,
+      1,
+      'An opened issue with a close label',
+      oneWeekAgo.toDateString(),
+      now.toDateString(),
+      false,
+      ['close'],
+      false,
+      false
+    )
+  ];
+  const processor = new IssuesProcessor(
+    opts,
+    async () => 'abot',
+    async p => (p === 1 ? TestIssueList : []),
+    async () => [],
+    async () => new Date().toDateString()
+  );
+
+  // process our fake issue list
+  await processor.processIssues(1);
+
+  expect(processor.removedLabelIssues).toHaveLength(1);
+});
+
+test('processing a closed issue with a close label will not remove the close label', async () => {
+  expect.assertions(1);
+  const opts: IIssuesProcessorOptions = {
+    ...DefaultProcessorOptions,
+    closeIssueLabel: 'close',
+    staleIssueLabel: 'stale'
+  };
+  const now: Date = new Date();
+  const oneWeekAgo: Date = new Date(now.getDate() - 7);
+  const TestIssueList: Issue[] = [
+    generateIssue(
+      opts,
+      1,
+      'A closed issue with a close label',
+      oneWeekAgo.toDateString(),
+      now.toDateString(),
+      false,
+      ['close'],
+      true,
+      false
+    )
+  ];
+  const processor = new IssuesProcessor(
+    opts,
+    async () => 'abot',
+    async p => (p === 1 ? TestIssueList : []),
+    async () => [],
+    async () => new Date().toDateString()
+  );
+
+  // process our fake issue list
+  await processor.processIssues(1);
+
+  expect(processor.removedLabelIssues).toHaveLength(0);
+});
+
+test('processing a locked issue with a close label will not remove the close label', async () => {
+  expect.assertions(1);
+  const opts: IIssuesProcessorOptions = {
+    ...DefaultProcessorOptions,
+    closeIssueLabel: 'close',
+    staleIssueLabel: 'stale'
+  };
+  const now: Date = new Date();
+  const oneWeekAgo: Date = new Date(now.getDate() - 7);
+  const TestIssueList: Issue[] = [
+    generateIssue(
+      opts,
+      1,
+      'A closed issue with a close label',
+      oneWeekAgo.toDateString(),
+      now.toDateString(),
+      false,
+      ['close'],
+      false,
+      true
+    )
+  ];
+  const processor = new IssuesProcessor(
+    opts,
+    async () => 'abot',
+    async p => (p === 1 ? TestIssueList : []),
+    async () => [],
+    async () => new Date().toDateString()
+  );
+
+  // process our fake issue list
+  await processor.processIssues(1);
+
+  expect(processor.removedLabelIssues).toHaveLength(0);
+});
diff --git a/__tests__/milestones.spec.ts b/__tests__/milestones.spec.ts
index d19412d..faa7c9b 100644
--- a/__tests__/milestones.spec.ts
+++ b/__tests__/milestones.spec.ts
@@ -9,7 +9,6 @@ interface ITestData {
   milestone: string;
   name: string;
   shouldStale: boolean;
-  exemptAllMilestones: boolean;
 }
 
 describe('milestones options', (): void => {
diff --git a/__tests__/only-labels.spec.ts b/__tests__/only-labels.spec.ts
new file mode 100644
index 0000000..2ca5167
--- /dev/null
+++ b/__tests__/only-labels.spec.ts
@@ -0,0 +1,1152 @@
+import {Issue} from '../src/classes/issue';
+import {IssuesProcessor} from '../src/classes/issues-processor';
+import {IIssue} from '../src/interfaces/issue';
+import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
+import {DefaultProcessorOptions} from './constants/default-processor-options';
+import {generateIssue} from './functions/generate-issue';
+
+let issuesProcessorBuilder: IssuesProcessorBuilder;
+let issuesProcessor: IssuesProcessor;
+
+describe('only-labels option', (): void => {
+  beforeEach((): void => {
+    issuesProcessorBuilder = new IssuesProcessorBuilder();
+  });
+
+  test('should stale when not set even if the issue has no label', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .emptyOnlyLabels()
+      .issuesOrPrs([{labels: []}])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(1);
+  });
+
+  test('should stale when not set even if the issue has a label', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .emptyOnlyLabels()
+      .issuesOrPrs([{labels: [{name: 'label'}]}])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(1);
+  });
+
+  test('should not stale when set and the issue has no label', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .onlyLabels('dummy-label')
+      .issuesOrPrs([{labels: []}])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(0);
+  });
+
+  test('should not stale when set and the issue has a different label', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .onlyLabels('dummy-label')
+      .issuesOrPrs([
+        {
+          labels: [
+            {
+              name: 'label'
+            }
+          ]
+        }
+      ])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(0);
+  });
+
+  test('should not stale when set and the issue has different labels', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .onlyLabels('dummy-label')
+      .issuesOrPrs([
+        {
+          labels: [
+            {
+              name: 'label-1'
+            },
+            {
+              name: 'label-2'
+            }
+          ]
+        }
+      ])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(0);
+  });
+
+  test('should stale when set and the issue has the same label', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .onlyLabels('dummy-label')
+      .issuesOrPrs([
+        {
+          labels: [
+            {
+              name: 'dummy-label'
+            }
+          ]
+        }
+      ])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(1);
+  });
+
+  test('should not stale when set and the issue has only one of the same label', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .onlyLabels('dummy-label-1,dummy-label-2')
+      .issuesOrPrs([
+        {
+          labels: [
+            {
+              name: 'dummy-label-1'
+            }
+          ]
+        }
+      ])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(0);
+  });
+
+  test('should stale when set and the issue has all the same labels', async (): Promise<void> => {
+    expect.assertions(1);
+    issuesProcessor = issuesProcessorBuilder
+      .onlyLabels('dummy-label-1,dummy-label-2')
+      .issuesOrPrs([
+        {
+          labels: [
+            {
+              name: 'dummy-label-1'
+            },
+            {
+              name: 'dummy-label-2'
+            }
+          ]
+        }
+      ])
+      .build();
+
+    await issuesProcessor.processIssues();
+
+    expect(issuesProcessor.staleIssues).toHaveLength(1);
+  });
+});
+
+describe('only-issue-labels option', (): void => {
+  beforeEach((): void => {
+    issuesProcessorBuilder = new IssuesProcessorBuilder();
+  });
+
+  describe('when the only-labels options is not set', (): void => {
+    beforeEach((): void => {
+      issuesProcessorBuilder.emptyOnlyLabels();
+    });
+
+    test('should stale when not set even if the issue has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyIssueLabels()
+        .issues([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should stale when not set even if the issue has a label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyIssueLabels()
+        .issues([{labels: [{name: 'dummy-label'}]}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the issue has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has a different label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has different labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'label-1'
+              },
+              {
+                name: 'label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the issue has the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the issue has only one of the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label-1,dummy-label-2')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the issue has all the same labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label-1,dummy-label-2')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              },
+              {
+                name: 'dummy-label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+  });
+
+  describe('when the only-labels options is set (same as only-issue-labels)', (): void => {
+    beforeEach((): void => {
+      issuesProcessorBuilder.onlyLabels('dummy-label');
+    });
+
+    test('should not stale when not set even if the issue has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyIssueLabels()
+        .issues([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when not set even if the issue has a label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyIssueLabels()
+        .issues([{labels: [{name: 'label'}]}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has a different label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has different labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'label-1'
+              },
+              {
+                name: 'label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the issue has the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the issue has only one of the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label-1,dummy-label-2')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the issue has all the same labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label-1,dummy-label-2')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              },
+              {
+                name: 'dummy-label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+  });
+
+  describe('when the only-labels options is set (different than only-issue-labels)', (): void => {
+    beforeEach((): void => {
+      issuesProcessorBuilder.onlyLabels('dummy-only-label');
+    });
+
+    test('should not stale when not set even if the issue has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyIssueLabels()
+        .issues([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when not set even if the issue has a label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyIssueLabels()
+        .issues([{labels: [{name: 'label'}]}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has a different label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the issue has different labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'label-1'
+              },
+              {
+                name: 'label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the issue has the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the issue has only one of the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label-1,dummy-label-2')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the issue has all the same labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyIssueLabels('dummy-label-1,dummy-label-2')
+        .issues([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              },
+              {
+                name: 'dummy-label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+  });
+});
+
+describe('only-pr-labels option', (): void => {
+  beforeEach((): void => {
+    issuesProcessorBuilder = new IssuesProcessorBuilder();
+  });
+
+  describe('when the only-labels options is not set', (): void => {
+    beforeEach((): void => {
+      issuesProcessorBuilder.emptyOnlyLabels();
+    });
+
+    test('should stale when not set even if the pr has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyPrLabels()
+        .prs([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should stale when not set even if the pr has a label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyPrLabels()
+        .prs([{labels: [{name: 'dummy-label'}]}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the pr has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has a different label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has different labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'label-1'
+              },
+              {
+                name: 'label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the pr has the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the pr has only one of the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label-1,dummy-label-2')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the pr has all the same labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label-1,dummy-label-2')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              },
+              {
+                name: 'dummy-label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+  });
+
+  describe('when the only-labels options is set (same as only-pr-labels)', (): void => {
+    beforeEach((): void => {
+      issuesProcessorBuilder.onlyLabels('dummy-label');
+    });
+
+    test('should not stale when not set even if the pr has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyPrLabels()
+        .prs([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when not set even if the pr has a label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyPrLabels()
+        .prs([{labels: [{name: 'label'}]}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has a different label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has different labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'label-1'
+              },
+              {
+                name: 'label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the pr has the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the pr has only one of the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label-1,dummy-label-2')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the pr has all the same labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label-1,dummy-label-2')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              },
+              {
+                name: 'dummy-label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+  });
+
+  describe('when the only-labels options is set (different than only-pr-labels)', (): void => {
+    beforeEach((): void => {
+      issuesProcessorBuilder.onlyLabels('dummy-only-label');
+    });
+
+    test('should not stale when not set even if the pr has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyPrLabels()
+        .prs([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when not set even if the pr has a label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .emptyOnlyPrLabels()
+        .prs([{labels: [{name: 'label'}]}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has no label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([{labels: []}])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has a different label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should not stale when set and the pr has different labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'label-1'
+              },
+              {
+                name: 'label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the pr has the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+
+    test('should not stale when set and the pr has only one of the same label', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label-1,dummy-label-2')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(0);
+    });
+
+    test('should stale when set and the pr has all the same labels', async (): Promise<void> => {
+      expect.assertions(1);
+      issuesProcessor = issuesProcessorBuilder
+        .onlyPrLabels('dummy-label-1,dummy-label-2')
+        .prs([
+          {
+            labels: [
+              {
+                name: 'dummy-label-1'
+              },
+              {
+                name: 'dummy-label-2'
+              }
+            ]
+          }
+        ])
+        .build();
+
+      await issuesProcessor.processIssues();
+
+      expect(issuesProcessor.staleIssues).toHaveLength(1);
+    });
+  });
+});
+
+class IssuesProcessorBuilder {
+  private _options: IIssuesProcessorOptions = {
+    ...DefaultProcessorOptions,
+    daysBeforeStale: 0
+  };
+  private _issues: Issue[] = [];
+
+  onlyLabels(labels: string): IssuesProcessorBuilder {
+    this._options.onlyLabels = labels;
+
+    return this;
+  }
+
+  onlyIssueLabels(labels: string): IssuesProcessorBuilder {
+    this._options.onlyIssueLabels = labels;
+
+    return this;
+  }
+
+  onlyPrLabels(labels: string): IssuesProcessorBuilder {
+    this._options.onlyPrLabels = labels;
+
+    return this;
+  }
+
+  emptyOnlyLabels(): IssuesProcessorBuilder {
+    return this.onlyLabels('');
+  }
+
+  emptyOnlyIssueLabels(): IssuesProcessorBuilder {
+    return this.onlyIssueLabels('');
+  }
+
+  emptyOnlyPrLabels(): IssuesProcessorBuilder {
+    return this.onlyPrLabels('');
+  }
+
+  issuesOrPrs(issues: Partial<IIssue>[]): IssuesProcessorBuilder {
+    this._issues = issues.map(
+      (issue: Readonly<Partial<IIssue>>, index: Readonly<number>): Issue =>
+        generateIssue(
+          this._options,
+          index,
+          issue.title ?? 'dummy-title',
+          issue.updated_at ?? new Date().toDateString(),
+          issue.created_at ?? new Date().toDateString(),
+          !!issue.pull_request,
+          issue.labels ? issue.labels.map(label => label.name) : []
+        )
+    );
+
+    return this;
+  }
+
+  issues(issues: Partial<IIssue>[]): IssuesProcessorBuilder {
+    this.issuesOrPrs(
+      issues.map(
+        (issue: Readonly<Partial<IIssue>>): Partial<IIssue> => {
+          return {
+            ...issue,
+            pull_request: null
+          };
+        }
+      )
+    );
+
+    return this;
+  }
+
+  prs(issues: Partial<IIssue>[]): IssuesProcessorBuilder {
+    this.issuesOrPrs(
+      issues.map(
+        (issue: Readonly<Partial<IIssue>>): Partial<IIssue> => {
+          return {
+            ...issue,
+            pull_request: {key: 'value'}
+          };
+        }
+      )
+    );
+
+    return this;
+  }
+
+  build(): IssuesProcessor {
+    return new IssuesProcessor(
+      this._options,
+      async () => 'abot',
+      async p => (p === 1 ? this._issues : []),
+      async () => [],
+      async () => new Date().toDateString()
+    );
+  }
+}