From 564a63a651535e7127f557f2fe6ed1a02f757aa5 Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Tue, 29 Sep 2026 19:24:42 +0100 Subject: [PATCH] Accept unsafe one-off failures in community intake The bug and v6 pre-release forms previously required reproduction steps even when a retry could cause a host outage, duplicate update, alert storm or data loss. Ask for the original sequence and safe evidence instead, and mirror the guidance in the public triage document. Contract-Neutral: Community intake wording only; release and installation contracts unchanged. Change-source: pulse-maintainer --- .github/ISSUE_TEMPLATE/bug_report.yml | 15 +++++++-------- .github/ISSUE_TEMPLATE/v6_rc_feedback.yml | 14 +++++++------- .github/scripts/issue-version-triage.test.cjs | 11 +++++++++++ docs/ISSUE_TRIAGE.md | 8 ++++++++ frontend-modern/public/docs/ISSUE_TRIAGE.md | 8 ++++++++ .../release_promotion_policy_test.py | 2 +- 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e4c42f021f..6900443bee 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: Bug report -description: Report a reproducible bug with full version details +description: Report a bug or unexpected outcome with version details title: "[Bug]: " labels: - bug @@ -9,8 +9,7 @@ body: value: | Report the version on the running instance where the bug occurs, not just the version you upgraded from. If installation failed before Pulse could start, give the exact version you tried to install, or write "unknown" and identify the installer or helper below. For container installs, include the running image tag or digest; for other installs, leave the image field blank. - If your issue is connection- or data-related, include diagnostics from: - `Settings -> Diagnostics -> Export for GitHub (sanitized)`. + If repeating the action could cause data loss, an outage, duplicate changes, or excessive notifications, do not repeat it just to fill in this form. Describe the original sequence and what you observed instead. If Pulse is running and it is safe to do so, connection- or data-related reports can include diagnostics from `Settings -> Diagnostics -> Export for GitHub (sanitized)`. Do not post secrets, tokens, private keys, or unsanitized configuration files. @@ -26,12 +25,12 @@ body: - type: textarea id: reproduce attributes: - label: To reproduce - description: Exact, minimal steps to reproduce the issue. + label: Steps or original sequence + description: Describe what happened before the failure. If repeating it is unsafe or impossible, say so; a second reproduction is not required. placeholder: | - 1. Go to ... - 2. Click ... - 3. Observe ... + 1. Before the failure, I ... + 2. I then saw ... + 3. I have not repeated it because ... validations: required: true diff --git a/.github/ISSUE_TEMPLATE/v6_rc_feedback.yml b/.github/ISSUE_TEMPLATE/v6_rc_feedback.yml index 22355d95dc..4b0f1ee88d 100644 --- a/.github/ISSUE_TEMPLATE/v6_rc_feedback.yml +++ b/.github/ISSUE_TEMPLATE/v6_rc_feedback.yml @@ -8,7 +8,7 @@ body: Use this form for actionable Pulse v6 pre-release feedback. For general impressions or smaller notes, use the pinned v6 pre-release feedback hub. - For reproducible failures, include exact version details and sanitized diagnostics when possible. + Include exact version details and sanitized evidence where available. Do not repeat an action just to fill in this form if it could cause data loss, an outage, duplicate changes, or excessive notifications; describe the original sequence instead. Do not post secrets, tokens, private keys, or unsanitized config files. @@ -114,13 +114,13 @@ body: - type: textarea id: reproduce_or_context attributes: - label: Steps to reproduce or usage context - description: If this is a bug, list exact steps. If this is workflow feedback, describe what you were trying to do. + label: Steps or original sequence / usage context + description: For a bug, describe what happened before it. If repeating it is unsafe or impossible, say so; a second reproduction is not required. For workflow feedback, describe what you were trying to do. placeholder: | - 1. Upgrade to the current v6 RC build - 2. Open ... - 3. Click ... - 4. Observe ... + 1. I upgraded to the current v6 RC build + 2. I opened ... + 3. I saw ... + 4. I have not repeated it because ... validations: required: true diff --git a/.github/scripts/issue-version-triage.test.cjs b/.github/scripts/issue-version-triage.test.cjs index 428147e76d..9e348c76e1 100644 --- a/.github/scripts/issue-version-triage.test.cjs +++ b/.github/scripts/issue-version-triage.test.cjs @@ -275,6 +275,17 @@ test("bug and pre-release forms accept truthful evidence for installs that never } }); +test("bug and pre-release forms accept unsafe one-off failures without a second run", () => { + const templateDir = path.resolve(__dirname, "../ISSUE_TEMPLATE"); + for (const name of ["bug_report.yml", "v6_rc_feedback.yml"]) { + const form = fs.readFileSync(path.join(templateDir, name), "utf8"); + assert.match(form, /do not repeat/i); + assert.match(form, /original sequence/i); + assert.match(form, /second reproduction is not required/); + assert.match(form, /data loss, an outage, duplicate changes, or excessive notifications/); + } +}); + test("older-version reports cannot trigger event or scheduled retest posting", async () => { const issue = { number: 1200, diff --git a/docs/ISSUE_TRIAGE.md b/docs/ISSUE_TRIAGE.md index a778d29cbf..e7dc060f7a 100644 --- a/docs/ISSUE_TRIAGE.md +++ b/docs/ISSUE_TRIAGE.md @@ -32,6 +32,14 @@ symptom: logs or sanitized diagnostics for connection and data failures, and screenshots or exact error text for visual failures. Do not make a reporter invent logs where none apply. +Some failures cannot safely be reproduced: an update may have changed a +container despite a failed banner, an alert storm may send more notifications, +or another run may bring down a host. Accept the original sequence, observed +result, time and sanitized evidence; do not require a second attempt before +triage. Where the installed state is uncertain, check it before suggesting +another action. A diagnostics export is useful only when Pulse is running and +collecting it is safe. + ## Required disposition Before removing `needs-decomposition` or declaring a mixed report triaged: diff --git a/frontend-modern/public/docs/ISSUE_TRIAGE.md b/frontend-modern/public/docs/ISSUE_TRIAGE.md index a778d29cbf..e7dc060f7a 100644 --- a/frontend-modern/public/docs/ISSUE_TRIAGE.md +++ b/frontend-modern/public/docs/ISSUE_TRIAGE.md @@ -32,6 +32,14 @@ symptom: logs or sanitized diagnostics for connection and data failures, and screenshots or exact error text for visual failures. Do not make a reporter invent logs where none apply. +Some failures cannot safely be reproduced: an update may have changed a +container despite a failed banner, an alert storm may send more notifications, +or another run may bring down a host. Accept the original sequence, observed +result, time and sanitized evidence; do not require a second attempt before +triage. Where the installed state is uncertain, check it before suggesting +another action. A diagnostics export is useful only when Pulse is running and +collecting it is safe. + ## Required disposition Before removing `needs-decomposition` or declaring a mixed report triaged: diff --git a/scripts/release_control/release_promotion_policy_test.py b/scripts/release_control/release_promotion_policy_test.py index 799ada8b88..935af03525 100644 --- a/scripts/release_control/release_promotion_policy_test.py +++ b/scripts/release_control/release_promotion_policy_test.py @@ -1616,7 +1616,7 @@ class ReleasePromotionPolicyTest(unittest.TestCase): template = read(".github/ISSUE_TEMPLATE/v6_rc_feedback.yml") self.assertIn("placeholder: v6.0.0-rc.N", template) self.assertIn("placeholder: rcourtman/pulse:v6.0.0-rc.N or pulse-linux-amd64", template) - self.assertIn("Upgrade to the current v6 RC build", template) + self.assertIn("I upgraded to the current v6 RC build", template) self.assertNotIn("v6.0.0-rc.1", template) def test_demo_site_copy_points_at_current_release_packet_index(self) -> None: