Skip to content
Open
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
2 changes: 1 addition & 1 deletion FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ A new configuration option often falls into one of three categories:
the post-script needs to consume it. This usually also requires a
schema update (`schemas/<agent>-result.schema.json`) to accommodate
whatever new field the agent uses to expose its conclusions to the
post-script. Example: the `requires_workflow_changes` flag in triage.
post-script. Example: the `block_auto_promotion` field in triage.

## 1. Decide what changes and what stays the same

Expand Down
15 changes: 12 additions & 3 deletions agents/triage.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ Before forming any clarifying question, classify it:
- Can you form a plausible root cause hypothesis from the available information?
- Could a developer start investigating without contacting the reporter?
- **Is progress blocked on other work?** Consider whether the fix depends on an unresolved issue or unmerged PR — in this repo or another. If a developer cannot meaningfully start work until some other issue is resolved, this issue has prerequisites regardless of how clear the problem description is. If the blocking work has no tracking issue yet, you can recommend creating one via the `prerequisites` action's `create` array.
- **Would resolving this issue require modifying CI/workflow files?** Scan the issue title, body, referenced files, and labels for signals that the fix involves changes under CI/pipeline configuration (e.g., `.github/workflows/`, `.gitlab-ci.yml`, `.fullsend/.github/workflows/`, or enrolled-repo shim workflows). Prefer deterministic signals — explicit path references, CI/workflow-scoped labels, mentions of CI pipeline configuration — over vague mentions of "workflow" in non-CI contexts (e.g., "user onboarding workflow"). If the fix likely requires workflow file changes, set `requires_workflow_changes: true` in `triage_summary` and include a warning in the triage comment that the code agent cannot modify workflow files under current permissions and that manual intervention (human PR/MR or maintainer action) is required.
- **Would resolving this issue require modifying CI/workflow files?** Scan the issue title, body, referenced files, and labels for signals that the fix involves changes under CI/pipeline configuration (e.g., `.github/workflows/`, `.gitlab-ci.yml`, `.fullsend/.github/workflows/`, or enrolled-repo shim workflows). Prefer deterministic signals — explicit path references, CI/workflow-scoped labels, mentions of CI pipeline configuration — over vague mentions of "workflow" in non-CI contexts (e.g., "user onboarding workflow"). If the fix likely requires workflow file changes, set `block_auto_promotion` with `blocked: true` and a reason explaining that the code agent cannot modify workflow files under current permissions and that manual intervention is required.
- **Does this issue bundle multiple independent concerns?** An issue bundles independent concerns when it lists several distinct problems, tasks, or gaps that share no blocking relationship — each could be filed, triaged, and resolved independently. Use `action: "split"` to decompose the issue into separate sub-issues. Signs of a bundled issue:
- A numbered or bulleted list of distinct items (e.g., "1. fix X, 2. add Y, 3. update Z")
- Multiple unrelated components, files, or subsystems mentioned with no dependency between them
Expand Down Expand Up @@ -364,7 +364,10 @@ Information is sufficient for a developer to investigate and fix.
"impact": "Who is affected and how",
"recommended_fix": "What a developer should investigate.",
"proposed_test_case": "Conceptual description of a test that would verify the fix — what to test, expected vs actual behavior, and edge cases to cover. Do not assume a specific test framework or file layout.",
"requires_workflow_changes": false
"block_auto_promotion": {
Comment thread
rh-hemartin marked this conversation as resolved.
"blocked": false,
"reason": "No CI/workflow file changes required"
}
},
"comment": "A triage summary comment formatted in markdown. Focus on information not already present in the issue body — omit sections that merely restate what the reporter wrote. Include the proposed test case as a fenced code block.",
"label_actions": {
Expand All @@ -383,7 +386,13 @@ Information is sufficient for a developer to investigate and fix.
}
```

**Workflow change detection (optional):** If the issue likely requires modifying CI/pipeline configuration files (`.github/workflows/`, `.gitlab-ci.yml`, `.fullsend/.github/workflows/`, or enrolled-repo shim workflows), set `requires_workflow_changes: true` in `triage_summary`. When set, the post-triage script skips auto-triggering the code agent because the code agent cannot modify workflow files under current permissions. The triage comment should warn about this limitation and note that manual intervention is required. When `requires_workflow_changes` is not set or is `false`, auto-triggering proceeds normally.
**Blocking auto-promotion:** Use the `block_auto_promotion` field in `triage_summary` to prevent the post-triage script from auto-promoting the issue to the code agent. Set `blocked: true` with a `reason` when:
- The fix requires modifying CI/pipeline configuration files (`.github/workflows/`, `.gitlab-ci.yml`, `.fullsend/.github/workflows/`, or enrolled-repo shim workflows) that the code agent cannot modify under current permissions.
- Any other condition where auto-dispatch would be premature.
Comment thread
rh-hemartin marked this conversation as resolved.

These conditions are OR-combined: if any one applies, set `blocked: true`.

When `blocked` is `true`, the post-script appends the reason to the triage comment for every category. The label change (`triaged` instead of `ready-to-code`) only applies to categories that would otherwise auto-promote (bug, documentation, performance). Categories that already route to `triaged` (feature, security, other) keep that label. When `blocked` is `false` (or omitted), auto-promotion proceeds normally for bug/documentation/performance categories.

**Label recommendations (optional, all actions):** If the `issue-labels` skill identifies labels that should be applied or removed, include them in the `label_actions` field. This field is optional for all actions. If no labels clearly apply, omit it entirely.

Expand Down
2 changes: 1 addition & 1 deletion docs/code.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ on issues (not PRs).

| Label | Meaning |
|-------|---------|
| `ready-to-code` | Triggers the code agent. Applied by the [triage](triage.md) agent for low-risk categories (bug, documentation, performance), or manually by a human for feature work after prioritization. Not applied when the triage result sets `requires_workflow_changes`, since the code agent cannot modify workflow files. |
| `ready-to-code` | Triggers the code agent. Applied by the [triage](triage.md) post-script for low-risk categories (bug, documentation, performance) when auto-promotion is not blocked, or manually by a human for feature work or workflow changes after review. |
| `ready-for-review` | Applied by the code agent after pushing a PR. In per-repo installs, triggers the [review agent](review.md) when applied to a PR. Also marks workflow state for humans and the [retro agent](retro.md). |

## Configuration
Expand Down
23 changes: 19 additions & 4 deletions docs/triage.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ These labels are managed by the triage agent based on its assessment of the issu
| Label | Meaning |
|-------|---------|
| `needs-info` | The issue lacks sufficient information. The agent posted clarifying questions. |
| `ready-to-code` | The issue is fully specified and low-risk (bug, documentation, performance). Bug and documentation categories also receive their eponymous labels (`bug`, `documentation`) automatically. Triggers the [code agent](code.md). This behavior is configurable via [Variables](#variables). Exception: when `requires_workflow_changes` is set in the triage result, `triaged` is applied instead because the code agent cannot modify workflow files. |
| `triaged` | The issue is fully specified but is a feature or other category that requires human prioritization before coding. |
| `ready-to-code` | The issue is fully specified and low-risk (bug, documentation, performance) with auto-promotion not blocked. Bug and documentation categories also receive their eponymous labels (`bug`, `documentation`) automatically. Triggers the [code agent](code.md). This behavior is configurable via [Variables](#variables). |
| `triaged` | The issue requires human review before coding: feature work, other categories, or bug/docs/performance issues where `block_auto_promotion` is set (workflow changes, etc.). |
| `duplicate` | The issue duplicates an existing one. The agent identified the original and the issue is closed automatically. |
| `blocked` | The issue depends on another issue or external condition. The agent identified the blocker. |
| `feature` | The issue is a feature request. Applied alongside `triaged` so humans can prioritize before coding begins. |
| `question` | The issue is a question rather than a bug or feature request. |
| `bug` | The issue is a confirmed bug. Applied alongside `ready-to-code` to categorize the issue. |
| `documentation` | The issue concerns documentation improvements or additions. Applied alongside `ready-to-code` to categorize the issue. |
| `bug` | The issue is a confirmed bug. Applied alongside `ready-to-code` or `triaged` to categorize the issue. |
| `documentation` | The issue concerns documentation improvements or additions. Applied alongside `ready-to-code` or `triaged` to categorize the issue. |
| `not-planned` | The issue is out of scope, invalid, or spam. The issue is closed with reason "not planned". |
| `pr-open` | An open PR or merge request already addresses this issue. Applied either by the triage agent's `in-progress` action — used when a PR/MR *fixes* the issue, as opposed to `prerequisites`/`blocked` when a PR/MR must merely land first — or by the code agent's pre-check when it finds a human PR before dispatching. No automation clears this label when the linked PR/MR is closed without merging: nothing re-triages on PR/MR close, so the issue keeps `pr-open` — and the in-progress comment stays on the issue — until triage runs again, via an issue edit or a manual `/fs-triage`. |

Expand Down Expand Up @@ -161,6 +161,21 @@ field of the triage result, following the same shape as `label_actions`. The
post-script applies the actions via `PUT /rest/api/3/issue/{key}` with
`fields.components`.

### Blocking auto-promotion

The triage result may include `block_auto_promotion` in `triage_summary`:

- `blocked: true` + `reason`: the post-script appends the reason to the
triage comment. For categories that would otherwise auto-promote, it also
applies `triaged` instead of `ready-to-code`.
- `blocked: false` + `reason`: auto-promotion proceeds normally.
- omitted: same as `blocked: false`.

Use this field when the fix requires modifying GitHub Actions or other CI
workflow files that the code agent cannot change under current permissions.
Later gates (for example effort scoring) can set the same field with their
own reason.

### Variables

| Variable | Description | Default | Valid values |
Expand Down
11 changes: 10 additions & 1 deletion schemas/triage-result.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,16 @@
"impact": { "type": "string", "minLength": 1 },
"recommended_fix": { "type": "string", "minLength": 1 },
"proposed_test_case": { "type": "string", "minLength": 1 },
"requires_workflow_changes": { "type": "boolean" }
"block_auto_promotion": {
"description": "Set blocked to true with a reason to prevent auto-promotion; set blocked to false with a reason when auto-promotion is safe.",
"type": "object",
"required": ["blocked", "reason"],
"properties": {
"blocked": { "type": "boolean" },
"reason": { "type": "string", "minLength": 1, "maxLength": 1024 }
},
"additionalProperties": false
}
},
"additionalProperties": false
},
Expand Down
Loading
Loading