Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions .github/ISSUE_TEMPLATE/false-positive.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@ description: Report a TaskBound finding that should be quieter or more precise.
title: "[false positive]: "
labels: ["detector", "false-positive"]
body:
- type: input
id: evidence-link
attributes:
label: Evidence link
description: Link the PR, Action run, TaskBound report, or a redacted note that shows the finding.
placeholder: https://github.com/org/repo/pull/123
validations:
required: true
- type: input
id: team-context
attributes:
label: Team or repository context
description: Share the repo type, language, or team workflow if public; use a redacted summary if needed.
placeholder: TypeScript app with AI-agent PRs, redacted private repo, etc.
validations:
required: true
- type: textarea
id: finding
attributes:
Expand All @@ -18,9 +34,9 @@ body:
validations:
required: true
- type: textarea
id: expected
id: expected-routing
attributes:
label: Expected behavior
description: Explain whether TaskBound should ignore it, lower severity, or infer scope differently.
description: Explain whether TaskBound should ignore it, lower severity, infer scope differently, or support repo-specific policy.
validations:
required: true
29 changes: 26 additions & 3 deletions .github/ISSUE_TEMPLATE/missing-signal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@ description: Ask TaskBound to infer scope or detect another post-session drift p
title: "[signal]: "
labels: ["detector", "new-signal"]
body:
- type: input
id: evidence-link
attributes:
label: Evidence link
description: Link the PR, Action run, diff, or a redacted note that shows the missing signal.
placeholder: https://github.com/org/repo/pull/123
validations:
required: true
- type: input
id: team-context
attributes:
label: Team or repository context
description: Share the repo type, language, or team workflow if public; use a redacted summary if needed.
placeholder: Python monorepo with AI-agent PRs, redacted private repo, etc.
validations:
required: true
- type: input
id: signal
attributes:
Expand All @@ -11,9 +27,16 @@ body:
validations:
required: true
- type: textarea
id: examples
id: expected-finding
attributes:
label: Expected finding
description: Describe the stated task, the out-of-scope edits, and the finding TaskBound should have produced.
validations:
required: true
- type: textarea
id: team-impact
attributes:
label: Task and drift examples
description: Describe the stated task and the out-of-scope edits that should produce findings.
label: Team impact
description: Explain whether this is a one-off detector request or a repeated team workflow need.
validations:
required: true
5 changes: 5 additions & 0 deletions docs/TEAM_VALIDATION_PLAYBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ For each team, collect feedback tied to a real PR or install attempt:
Open a public issue when the team can share details. Use a redacted note in
issue #8 when the team cannot share repository details publicly.

False-positive and missing-signal reports should include a PR, Action run,
TaskBound report, or redacted evidence note plus team or repository context. Do
not count reports toward issue #8 when they cannot be tied to real usage or a
real install attempt.

## Evidence Protocol

Only count external evidence in issue #8.
Expand Down
23 changes: 23 additions & 0 deletions test/issue-template.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import assert from 'node:assert/strict';
import fs from 'node:fs';
import test from 'node:test';

function readTemplate(name) {
return fs.readFileSync(`.github/ISSUE_TEMPLATE/${name}`, 'utf8');
}

test('feedback issue templates collect evidence needed for validation tracking', () => {
const falsePositive = readTemplate('false-positive.yml');
const missingSignal = readTemplate('missing-signal.yml');

for (const template of [falsePositive, missingSignal]) {
assert.match(template, /id: evidence-link/);
assert.match(template, /id: team-context/);
}

assert.match(falsePositive, /id: finding/);
assert.match(falsePositive, /id: expected-routing/);

assert.match(missingSignal, /id: signal/);
assert.match(missingSignal, /id: expected-finding/);
});