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
This commit is contained in:
pulse-triage[bot] 2026-09-29 19:24:42 +01:00
parent 5d39c8623f
commit 564a63a651
6 changed files with 42 additions and 16 deletions

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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:

View file

@ -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:

View file

@ -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: