This is an automated email from the ASF dual-hosted git repository.

hubcio pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iggy.git


The following commit(s) were added to refs/heads/master by this push:
     new 3c4808944 chore(repo): improve issue/PR templates and trim triage docs 
(#3372)
3c4808944 is described below

commit 3c4808944820337ef15b378212a543d0bba5ed1b
Author: Hubert Gruszecki <[email protected]>
AuthorDate: Fri May 29 13:20:28 2026 +0200

    chore(repo): improve issue/PR templates and trim triage docs (#3372)
---
 .github/ISSUE_TEMPLATE/bug_report.yml      |  47 ++++++++++
 .github/ISSUE_TEMPLATE/feature_request.yml |  34 ++++++-
 .github/workflows/issue-labeler.yml        | 105 +++++++++++++++++++++
 .github/workflows/pr-triage-apply.yml      |  11 +--
 CONTRIBUTING.md                            | 145 ++++-------------------------
 PULL_REQUEST_TEMPLATE.md                   |   7 +-
 6 files changed, 209 insertions(+), 140 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml 
b/.github/ISSUE_TEMPLATE/bug_report.yml
index dc8347522..c7682e070 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -32,6 +32,38 @@ body:
     validations:
       required: true
 
+  - type: dropdown
+    id: area
+    attributes:
+      label: Affected area / component
+      description: |
+        Which part(s) of the project does this affect? Your selection is 
auto-labeled on the issue.
+      multiple: true
+      options:
+        - Iggy server
+        - Rust SDK
+        - Go SDK
+        - Java SDK
+        - Python SDK
+        - "C# SDK"
+        - Node.js SDK
+        - "C++ SDK"
+        - PHP SDK
+        - CLI
+        - Web UI
+        - Connectors
+        - MCP server
+        - Configuration
+        - Wire protocol / API
+        - Metadata
+        - Clustering / replication
+        - Performance
+        - Documentation
+        - CI / build / tooling
+        - Other / not sure
+    validations:
+      required: false
+
   - type: dropdown
     id: deployment
     attributes:
@@ -102,3 +134,18 @@ body:
         3. Observe ...
     validations:
       required: false
+
+  - type: checkboxes
+    id: contribution
+    attributes:
+      label: Contribution
+      options:
+        - label: I'm willing to submit a pull request to fix this bug
+
+  - type: checkboxes
+    id: good-first-issue
+    attributes:
+      label: Good first issue
+      description: A suggestion for triage; a maintainer decides whether to 
apply the label.
+      options:
+        - label: I think this could be a good first issue for a new contributor
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml 
b/.github/ISSUE_TEMPLATE/feature_request.yml
index 51f54294a..a6f83c461 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -34,10 +34,12 @@ body:
       required: true
 
   - type: dropdown
-    id: component
+    id: area
     attributes:
-      label: Component
-      description: Which part of the project does this affect?
+      label: Affected area / component
+      description: |
+        Which part(s) of the project does this affect? Your selection is 
auto-labeled on the issue.
+      multiple: true
       options:
         - Iggy server
         - Rust SDK
@@ -46,11 +48,20 @@ body:
         - Python SDK
         - "C# SDK"
         - Node.js SDK
+        - "C++ SDK"
+        - PHP SDK
         - CLI
         - Web UI
         - Connectors
+        - MCP server
+        - Configuration
+        - Wire protocol / API
+        - Metadata
+        - Clustering / replication
+        - Performance
         - Documentation
-        - Other
+        - CI / build / tooling
+        - Other / not sure
     validations:
       required: false
 
@@ -69,3 +80,18 @@ body:
       description: Other approaches you thought of.
     validations:
       required: false
+
+  - type: checkboxes
+    id: contribution
+    attributes:
+      label: Contribution
+      options:
+        - label: I'm willing to submit a pull request to implement this feature
+
+  - type: checkboxes
+    id: good-first-issue
+    attributes:
+      label: Good first issue
+      description: A suggestion for triage; a maintainer decides whether to 
apply the label.
+      options:
+        - label: I think this could be a good first issue for a new contributor
diff --git a/.github/workflows/issue-labeler.yml 
b/.github/workflows/issue-labeler.yml
new file mode 100644
index 000000000..8b70c3249
--- /dev/null
+++ b/.github/workflows/issue-labeler.yml
@@ -0,0 +1,105 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: Issue Labeler
+
+# Maps the "Affected area / component" dropdown from the bug/feature issue
+# forms (.github/ISSUE_TEMPLATE/) onto real repo labels, so reporters who
+# lack triage permission still get their issue categorized at creation.
+#
+# Add-only by design: it never removes labels. Reporters rarely deselect,
+# and removing would fight maintainers who labeled by hand. addLabels is
+# idempotent, so re-running on `edited` is harmless.
+#
+# SECURITY: the issue body is attacker-controlled text, but it is parsed
+# only for exact matches against the fixed AREA_LABELS allowlist below, so
+# the only labels this workflow can ever apply are the ones listed here.
+# No checkout, no exec of issue contents, no token export.
+
+on:
+  issues:
+    types: [opened, edited]
+
+permissions:
+  issues: write
+  contents: read
+
+jobs:
+  label:
+    runs-on: ubuntu-24.04-arm
+    timeout-minutes: 5
+    steps:
+      - name: Apply area labels from issue form
+        uses: actions/github-script@v9
+        with:
+          script: |
+            // Dropdown option text -> repo label. Keep in sync with the
+            // `Affected area / component` options in
+            // .github/ISSUE_TEMPLATE/{bug_report,feature_request}.yml.
+            const AREA_LABELS = {
+              'Iggy server': 'server',
+              'Rust SDK': 'rust',
+              'Go SDK': 'go',
+              'Java SDK': 'java',
+              'Python SDK': 'python',
+              'C# SDK': 'csharp',
+              'Node.js SDK': 'javascript',
+              'C++ SDK': 'C++',
+              'PHP SDK': 'php',
+              'CLI': 'tui',
+              'Web UI': 'web',
+              'Connectors': 'connectors',
+              'MCP server': 'mcp',
+              'Configuration': 'config',
+              'Wire protocol / API': 'api',
+              'Metadata': 'metadata',
+              'Clustering / replication': 'cluster',
+              'Performance': 'performance',
+              'Documentation': 'docs',
+              'CI / build / tooling': 'CI/CD',
+              // 'Other / not sure' intentionally maps to no label.
+            };
+            const HEADING = 'Affected area / component';
+
+            const body = context.payload.issue.body || '';
+            // Issue-form bodies render as `### <label>\n\n<value>`; capture
+            // the dropdown's value block, up to the next `###` or the end.
+            const esc = HEADING.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+            const section = body.match(
+              new RegExp('###[ \\t]+' + esc + '[ 
\\t]*\\n+([\\s\\S]*?)(?:\\n###|$)'),
+            );
+            // Multi-select renders the picks comma-separated on one line.
+            // Option text never contains a comma, so split on it safely.
+            const picks = (section ? section[1] : '')
+              .split(',')
+              .map(s => s.trim())
+              .filter(Boolean);
+            const labels = [...new Set(
+              picks.map(p => AREA_LABELS[p]).filter(Boolean),
+            )];
+
+            if (labels.length === 0) {
+              core.info('no mappable area selected, nothing to label');
+              return;
+            }
+            core.info(`applying labels: ${labels.join(', ')}`);
+            await github.rest.issues.addLabels({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              issue_number: context.payload.issue.number,
+              labels,
+            });
diff --git a/.github/workflows/pr-triage-apply.yml 
b/.github/workflows/pr-triage-apply.yml
index 7386ac1c4..2fa172c7a 100644
--- a/.github/workflows/pr-triage-apply.yml
+++ b/.github/workflows/pr-triage-apply.yml
@@ -221,15 +221,12 @@ jobs:
             const WELCOME_MARKER = '<!-- iggy-pr-triage-welcome -->';
             const WELCOME_BODY = [
               WELCOME_MARKER,
-              'Thanks for the pull request. It is now waiting for review, 
labeled `S-waiting-on-review`.',
+              'Thanks for the PR. It is labeled `S-waiting-on-review` and 
queued for review.',
               '',
-              'You can update that label as the review goes back and forth, 
with slash commands - each on its own line, in a regular PR comment (not an 
inline review reply):',
+              'Slash commands (own line, regular comment) move it around the 
queue:',
               '',
-              '- `/ready` - mark it `S-waiting-on-review` again, after 
addressing feedback',
-              '- `/author` - mark it `S-waiting-on-author` (maintainers, or 
anyone who has had a PR merged before)',
-              '- `/request-review @user ...` - request reviewers (`@user` or 
`@org/team`)',
-              '',
-              'Commands take up to ~90s to apply. If no reaction (👍 or 😕) 
appears on your comment, the apply step likely failed - check the repo\'s 
Actions tab for the `PR Triage Apply` run. Commands posted inside a review body 
(rather than a normal comment) cannot be reacted to, so they stay log-only.',
+              '- `/ready` - back to `S-waiting-on-review` after addressing 
feedback',
+              '- `/request-review @user-or-team` - request a reviewer',
               '',
               'See 
[CONTRIBUTING.md](https://github.com/apache/iggy/blob/master/CONTRIBUTING.md#pr-triage-commands)
 for details.',
             ].join('\n');
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index bf1928937..98155d8cd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,6 +32,12 @@ These require design discussion in the issue before coding:
 
 Authors of PRs must run the code locally. "Relying on CI" is not acceptable.
 
+### Green CI
+
+Maintainers will not start reviewing a PR while its CI is failing. Get the
+pipeline green first - a red build, lint, or test means the PR is not ready
+for review.
+
 ### Single Purpose
 
 One PR = one thing. Bug fix, refactor, feature - separate PRs. Mixed PRs will 
be closed.
@@ -104,137 +110,22 @@ Keep subject under 72 chars. Use body for details if 
needed.
 
 ## PR Triage Commands
 
-You can move a PR around the review queue by posting a slash command in the
-PR conversation. The pattern is similar to `rust-lang/triagebot`. The
-machinery lives in
-[`./.github/workflows/pr-triage-apply.yml`](./.github/workflows/pr-triage-apply.yml)
-(with a read-only collector in
-[`./.github/workflows/pr-triage-collect.yml`](./.github/workflows/pr-triage-collect.yml)
-that hops the token-permission gap for fork PRs) if you want to peek.
-
-### Commands
+Move a PR around the review queue by posting a slash command on its own
+line in a regular PR comment (not an inline review reply):
 
-| Command | Who can use it | What it does |
+| Command | Who | Effect |
 | --- | --- | --- |
-| `/request-review @user-or-team ...` | the PR author or a maintainer | 
Requests review from one or more `@user` or `@org/team` handles |
-| `/ready` | the PR author or a maintainer | Marks the PR 
`S-waiting-on-review` |
-| `/author` | a maintainer, or any returning contributor (>=1 merged PR) | 
Marks the PR `S-waiting-on-author` |
-
-A "maintainer" here means someone with write access to apache/iggy
-(in practice, the `@apache/iggy-committers` team). Automated comments from
-bots like Dependabot do not run commands.
-
-Each command has to start its own line. Leading whitespace is fine, but
-prose like `please /ready` will not match. You can put more than one command
-in a single comment: `/request-review` plus `/ready`, or `/request-review`
-plus `/author`. `/request-review` may carry several handles on one line and
-may also repeat across lines; all of them are collected and requested
-together. For `/ready` and `/author`, the last one wins, so `/ready` then
-`/author` in the same comment ends up as `S-waiting-on-author`.
-
-### Typical flow
-
-1. You open a PR. CODEOWNERS pings `@apache/iggy-committers` automatically.
-2. A maintainer reviews. Submitting a "Request changes" review moves the
-   PR to your queue automatically; they can also comment `/author`.
-3. You push fixes, then comment `/ready`. The PR moves back to the review
-   queue.
-4. Either side can comment `/request-review @somebody` to pull in a
-   specific person or team.
-
-To find PRs waiting on review, filter with
-`is:open is:pr label:S-waiting-on-review` on the Pulls tab.
-
-### Lifecycle automation
-
-Some labels are managed for you based on what happens to the PR:
-
-| When | What happens |
-| --- | --- |
-| You open a PR (not a draft) | Gets `S-waiting-on-review`, unless an `S-*` 
label is already set |
-| You mark a draft "Ready for review" | Gets `S-waiting-on-review`, unless an 
`S-*` label is already set |
-| You convert the PR back to a draft | Both `S-*` labels are removed |
-| The PR is closed or merged | Both `S-*` labels are removed |
-
-Reopening a PR does not re-label it. Drop a `/ready` or `/author` comment
-to put it back in a queue.
-
-Drafts are skipped by the automatic labelling, but `/ready` and `/author`
-still work on drafts if you want to signal intent before clicking "Ready
-for review".
-
-### Review state
-
-Submitting a review with "Request changes" is treated as an implicit
-`/author`: the PR moves to `S-waiting-on-author`. Anyone GitHub recognizes
-as a repo contributor or above can trigger this - the same set that can
-issue an explicit `/author`. If your review body also contains an explicit
-`/ready` or `/author`, that command wins.
-
-### Tips
-
-- **One comment per command burst.** To request several reviewers at once,
-  list them on a single `/request-review` line (or several lines) in one
-  comment. Posting separate comments back-to-back can lose the middle one
-  due to how CI runs are scheduled.
-- **Edits don't re-trigger.** If you typo a command and edit the comment, it
-  will not run. Post a new comment instead.
-- **Use the main conversation, not inline review replies.** Commands posted
-  as replies on a specific line of the diff are ignored. Post them in the
-  PR's main comment thread.
-- **Suffixes don't match.** `/ready-to-merge` or `/readyish` will not flip
-  state - only `/ready` followed by a space or end-of-line counts.
-
-### When something goes wrong
-
-Commands take up to ~90s to apply: the read-only collector hands the
-event off to the write-capable apply workflow via an artifact, which
-adds latency on top of GitHub Actions scheduling. Wait for a reaction
-before re-issuing - duplicate commands can interleave.
-
-The workflow reacts on your comment so you get quick feedback: a 👍 means
-a command was applied, a 😕 means a command was recognized but you lacked
-permission to run it. A failed `/request-review` also posts a one-line
-reply naming the handles GitHub rejected. Commands posted in a review body
-(rather than a normal comment) cannot be reacted to, so they stay
-log-only.
-
-If no reaction appears within a couple of minutes, the apply run likely
-failed. Open the repo's "Actions" tab and look at the `PR Triage Apply`
-run for the comment you posted - the run log says exactly what it saw
-and why (no permission, unknown user, transient API error, etc.). The
-`PR Triage Collect` run that appears on the PR's "Checks" tab is just
-the read-only event collector; the actual labelling happens in
-`PR Triage Apply`, which is triggered via `workflow_run` and is not
-attached to the PR's checks.
-
-### Examples
-
-Mark your PR ready after addressing feedback:
-
-```text
-/ready
-```
-
-Ask the author to take another look:
+| `/ready` | author or maintainer | mark `S-waiting-on-review` |
+| `/author` | maintainer or returning contributor | mark `S-waiting-on-author` 
|
+| `/request-review @user-or-team ...` | author or maintainer | request review 
from the listed `@user` / `@org/team` handles |
 
-```text
-/author
-```
+Some labels move on their own: opening or marking a non-draft PR ready sets
+`S-waiting-on-review`; a "Request changes" review sets `S-waiting-on-author`;
+closing or converting to draft clears both.
 
-Request a specific reviewer and mark ready in one comment:
-
-```text
-/request-review @somebody
-/ready
-```
-
-Request several reviewers in one go (do this instead of posting separate
-comments). They can share one line, span multiple lines, or both:
-
-```text
-/request-review @alice @bob @apache/iggy-committers
-```
+Commands take up to ~90s. A 👍 reaction means applied, 😕 means you lacked
+permission; if neither shows up, check the `PR Triage Apply` run in the
+Actions tab.
 
 ## Close Policy
 
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
index 1d92178f0..4b3d82820 100644
--- a/PULL_REQUEST_TEMPLATE.md
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -1,10 +1,13 @@
-## Which issue does this PR close?
+## Which issue does this PR address?
 
 <!--
-We generally require a GitHub issue to be filed for all bug fixes and 
enhancements. You can link an issue to this PR using the GitHub syntax. For 
example `Closes #123` indicates that this PR will close issue #123.
+We generally require a GitHub issue for all bug fixes and enhancements. Link 
it with GitHub syntax, keep the line that applies and delete the other:
+- `Closes #123` auto-closes the issue when this PR merges (full fix).
+- `Relates to #123` links without closing (partial or related work).
 -->
 
 Closes #
+Relates to #
 
 ## Rationale
 

Reply via email to