@plainconceptsplatform/workflows 0.20.2 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/index.js +0 -0
  2. package/dist/stack-defaults.js +16 -16
  3. package/dist/workflow-catalog.d.ts +1 -1
  4. package/dist/workflow-catalog.js +2 -0
  5. package/loops/actions/add-issue-labels/action.yml +50 -50
  6. package/loops/actions/agent-output.cjs +17 -17
  7. package/loops/actions/apply-agent-bundle/action.yml +24 -24
  8. package/loops/actions/apply-agent-comments/action.yml +42 -42
  9. package/loops/actions/apply-agent-labels/action.yml +55 -55
  10. package/loops/actions/apply-agent-output/action.yml +108 -108
  11. package/loops/actions/classify-route/action.yml +100 -100
  12. package/loops/actions/cleanup-artifacts/action.yml +91 -91
  13. package/loops/actions/close-agent-issues/action.yml +43 -43
  14. package/loops/actions/collect-app-errors/action.yml +297 -0
  15. package/loops/actions/collect-app-errors/group-and-redact.mjs +252 -0
  16. package/loops/actions/collect-app-errors/query-app-errors.sh +104 -0
  17. package/loops/actions/create-agent-issues/action.yml +52 -52
  18. package/loops/actions/create-issue-comment/action.yml +29 -29
  19. package/loops/actions/download-agent-output/action.yml +53 -53
  20. package/loops/actions/link-pr-to-issue/action.yml +40 -40
  21. package/loops/actions/list-open-issues/action.yml +33 -33
  22. package/loops/actions/load-issue-context/action.yml +45 -45
  23. package/loops/actions/merge-agent-pr/action.yml +49 -49
  24. package/loops/actions/push-agent-branch/action.yml +45 -45
  25. package/loops/actions/remove-issue-labels/action.yml +37 -37
  26. package/loops/actions/update-agent-issues/action.yml +58 -58
  27. package/loops/actions/validate-review-output/action.yml +35 -35
  28. package/loops/actions/validate-triage-output/action.yml +36 -36
  29. package/loops/actions/verify-app-errors/action.yml +11 -0
  30. package/loops/actions/verify-app-errors/verify-app-errors.mjs +216 -0
  31. package/loops/actions/verify-composite-actions/action.yml +9 -9
  32. package/loops/actions/verify-refine-output/action.yml +9 -9
  33. package/loops/actions/verify-route-matrix/action.yml +9 -9
  34. package/loops/actions/verify-route-matrix/verify-route-matrix.sh +233 -12
  35. package/loops/scripts/compile-agent-workflows.mjs +331 -331
  36. package/loops/templates/agentics/agentics-app-errors.yml +168 -0
  37. package/loops/templates/agentics/agentics-maintenance.yml +121 -121
  38. package/loops/templates/ci/app-ci-dotnet-next.yml +330 -330
  39. package/loops/templates/ci/app-ci-node-monorepo.yml +260 -260
  40. package/loops/templates/issues/bug_report.yml +109 -109
  41. package/loops/templates/issues/feature_request.yml +75 -75
  42. package/loops/templates/release/github-release.yml +30 -30
  43. package/loops/workflows/agent-implement.md +99 -6
  44. package/loops/workflows/agent-merge-gate.md +4 -2
  45. package/loops/workflows/authorize-bot-work.yml +105 -105
  46. package/loops/workflows/shared/opencode-ci.md +2 -2
  47. package/loops/workflows/shared/platform-defaults.md +19 -19
  48. package/loops/workflows/work-router.yml +2 -2
  49. package/package.json +9 -8
@@ -1,109 +1,109 @@
1
- name: Bug report
2
- description: Report a defect
3
- labels: ["bug"]
4
- body:
5
- - type: markdown
6
- attributes:
7
- value: |
8
- Thanks for reporting. Do **not** include real secrets or production data — use placeholders.
9
-
10
- For security vulnerabilities, contact the team directly instead of filing a public issue.
11
- - type: dropdown
12
- id: severity
13
- attributes:
14
- label: Severity
15
- options:
16
- - Production-down / data loss
17
- - Major — broken core flow
18
- - Minor — broken edge case
19
- - Cosmetic / polish
20
- validations:
21
- required: true
22
- - type: dropdown
23
- id: frequency
24
- attributes:
25
- label: Frequency
26
- description: How often does this happen?
27
- options:
28
- - Always
29
- - Intermittent
30
- - Only once
31
- validations:
32
- required: true
33
- - type: textarea
34
- id: what-happened
35
- attributes:
36
- label: What happened?
37
- description: A clear description of the bug and its impact.
38
- validations:
39
- required: true
40
- - type: textarea
41
- id: repro
42
- attributes:
43
- label: Steps to reproduce
44
- description: How can a maintainer reproduce it?
45
- placeholder: |
46
- 1. Go to ...
47
- 2. Do ...
48
- 3. See error
49
- validations:
50
- required: true
51
- - type: textarea
52
- id: expected
53
- attributes:
54
- label: Expected behavior
55
- validations:
56
- required: true
57
- - type: dropdown
58
- id: area
59
- attributes:
60
- label: Where does it occur?
61
- options:
62
- - Backend
63
- - Frontend
64
- - Both
65
- - CLI / tooling
66
- - Configuration / deployment
67
- - Documentation
68
- - Other
69
- validations:
70
- required: true
71
- - type: textarea
72
- id: acceptance
73
- attributes:
74
- label: Acceptance criteria
75
- description: How will we know it's fixed? A checklist a reviewer can verify (include the test that should turn green).
76
- placeholder: |
77
- - [ ] ...
78
- - [ ] A test that fails before the fix and passes after
79
- validations:
80
- required: false
81
- - type: textarea
82
- id: open-questions
83
- attributes:
84
- label: Open questions
85
- description: Decisions a maintainer must make before this can be planned. Leave blank if none.
86
- validations:
87
- required: false
88
- - type: textarea
89
- id: environment
90
- attributes:
91
- label: Environment
92
- description: Local vs deployed, branch/commit, OS, runtime versions if relevant.
93
- validations:
94
- required: false
95
- - type: textarea
96
- id: logs
97
- attributes:
98
- label: Logs / screenshots
99
- description: Paste relevant logs or screenshots. Redact secrets and PII.
100
- render: shell
101
- validations:
102
- required: false
103
- - type: textarea
104
- id: related
105
- attributes:
106
- label: Related links
107
- description: Links to related issues, PRs, discussions, or docs. Leave blank if none.
108
- validations:
109
- required: false
1
+ name: Bug report
2
+ description: Report a defect
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for reporting. Do **not** include real secrets or production data — use placeholders.
9
+
10
+ For security vulnerabilities, contact the team directly instead of filing a public issue.
11
+ - type: dropdown
12
+ id: severity
13
+ attributes:
14
+ label: Severity
15
+ options:
16
+ - Production-down / data loss
17
+ - Major — broken core flow
18
+ - Minor — broken edge case
19
+ - Cosmetic / polish
20
+ validations:
21
+ required: true
22
+ - type: dropdown
23
+ id: frequency
24
+ attributes:
25
+ label: Frequency
26
+ description: How often does this happen?
27
+ options:
28
+ - Always
29
+ - Intermittent
30
+ - Only once
31
+ validations:
32
+ required: true
33
+ - type: textarea
34
+ id: what-happened
35
+ attributes:
36
+ label: What happened?
37
+ description: A clear description of the bug and its impact.
38
+ validations:
39
+ required: true
40
+ - type: textarea
41
+ id: repro
42
+ attributes:
43
+ label: Steps to reproduce
44
+ description: How can a maintainer reproduce it?
45
+ placeholder: |
46
+ 1. Go to ...
47
+ 2. Do ...
48
+ 3. See error
49
+ validations:
50
+ required: true
51
+ - type: textarea
52
+ id: expected
53
+ attributes:
54
+ label: Expected behavior
55
+ validations:
56
+ required: true
57
+ - type: dropdown
58
+ id: area
59
+ attributes:
60
+ label: Where does it occur?
61
+ options:
62
+ - Backend
63
+ - Frontend
64
+ - Both
65
+ - CLI / tooling
66
+ - Configuration / deployment
67
+ - Documentation
68
+ - Other
69
+ validations:
70
+ required: true
71
+ - type: textarea
72
+ id: acceptance
73
+ attributes:
74
+ label: Acceptance criteria
75
+ description: How will we know it's fixed? A checklist a reviewer can verify (include the test that should turn green).
76
+ placeholder: |
77
+ - [ ] ...
78
+ - [ ] A test that fails before the fix and passes after
79
+ validations:
80
+ required: false
81
+ - type: textarea
82
+ id: open-questions
83
+ attributes:
84
+ label: Open questions
85
+ description: Decisions a maintainer must make before this can be planned. Leave blank if none.
86
+ validations:
87
+ required: false
88
+ - type: textarea
89
+ id: environment
90
+ attributes:
91
+ label: Environment
92
+ description: Local vs deployed, branch/commit, OS, runtime versions if relevant.
93
+ validations:
94
+ required: false
95
+ - type: textarea
96
+ id: logs
97
+ attributes:
98
+ label: Logs / screenshots
99
+ description: Paste relevant logs or screenshots. Redact secrets and PII.
100
+ render: shell
101
+ validations:
102
+ required: false
103
+ - type: textarea
104
+ id: related
105
+ attributes:
106
+ label: Related links
107
+ description: Links to related issues, PRs, discussions, or docs. Leave blank if none.
108
+ validations:
109
+ required: false
@@ -1,75 +1,75 @@
1
- name: Feature request
2
- description: Propose a small improvement or new capability
3
- labels: ["enhancement"]
4
- body:
5
- - type: markdown
6
- attributes:
7
- value: |
8
- This template is for small, well-scoped improvements — a focused
9
- enhancement, a missing convenience, a quality-of-life fix.
10
-
11
- For large features, architecture changes, or cross-cutting work,
12
- open a planning issue or an ADR instead.
13
-
14
- Do **not** include real secrets or production data — use placeholders.
15
- - type: dropdown
16
- id: scope
17
- attributes:
18
- label: Scope
19
- description: How big is this change? If it doesn't fit Small or Medium, use a planning issue instead.
20
- options:
21
- - Small — a single file or component, no refactoring
22
- - Medium — touches a few files or a feature area, may need minor refactoring
23
- validations:
24
- required: true
25
- - type: textarea
26
- id: current-behavior
27
- attributes:
28
- label: Current behavior
29
- description: How does it work today? Describe the existing behavior or limitation.
30
- validations:
31
- required: true
32
- - type: textarea
33
- id: problem
34
- attributes:
35
- label: Problem / motivation
36
- description: What user or business need does this address? Why is the current behavior a problem?
37
- validations:
38
- required: true
39
- - type: textarea
40
- id: proposal
41
- attributes:
42
- label: Proposed solution
43
- description: What would you like to happen?
44
- validations:
45
- required: true
46
- - type: textarea
47
- id: alternatives
48
- attributes:
49
- label: Alternatives considered
50
- validations:
51
- required: false
52
- - type: textarea
53
- id: acceptance
54
- attributes:
55
- label: Acceptance criteria
56
- description: A checklist a reviewer can verify when this is done (include the tests).
57
- placeholder: |
58
- - [ ] ...
59
- - [ ] Tests
60
- validations:
61
- required: false
62
- - type: textarea
63
- id: open-questions
64
- attributes:
65
- label: Open questions
66
- description: Decisions a maintainer must make before this can be planned. Leave blank if none.
67
- validations:
68
- required: false
69
- - type: textarea
70
- id: related
71
- attributes:
72
- label: Related links
73
- description: Links to related issues, PRs, discussions, or docs. Leave blank if none.
74
- validations:
75
- required: false
1
+ name: Feature request
2
+ description: Propose a small improvement or new capability
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ This template is for small, well-scoped improvements — a focused
9
+ enhancement, a missing convenience, a quality-of-life fix.
10
+
11
+ For large features, architecture changes, or cross-cutting work,
12
+ open a planning issue or an ADR instead.
13
+
14
+ Do **not** include real secrets or production data — use placeholders.
15
+ - type: dropdown
16
+ id: scope
17
+ attributes:
18
+ label: Scope
19
+ description: How big is this change? If it doesn't fit Small or Medium, use a planning issue instead.
20
+ options:
21
+ - Small — a single file or component, no refactoring
22
+ - Medium — touches a few files or a feature area, may need minor refactoring
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: current-behavior
27
+ attributes:
28
+ label: Current behavior
29
+ description: How does it work today? Describe the existing behavior or limitation.
30
+ validations:
31
+ required: true
32
+ - type: textarea
33
+ id: problem
34
+ attributes:
35
+ label: Problem / motivation
36
+ description: What user or business need does this address? Why is the current behavior a problem?
37
+ validations:
38
+ required: true
39
+ - type: textarea
40
+ id: proposal
41
+ attributes:
42
+ label: Proposed solution
43
+ description: What would you like to happen?
44
+ validations:
45
+ required: true
46
+ - type: textarea
47
+ id: alternatives
48
+ attributes:
49
+ label: Alternatives considered
50
+ validations:
51
+ required: false
52
+ - type: textarea
53
+ id: acceptance
54
+ attributes:
55
+ label: Acceptance criteria
56
+ description: A checklist a reviewer can verify when this is done (include the tests).
57
+ placeholder: |
58
+ - [ ] ...
59
+ - [ ] Tests
60
+ validations:
61
+ required: false
62
+ - type: textarea
63
+ id: open-questions
64
+ attributes:
65
+ label: Open questions
66
+ description: Decisions a maintainer must make before this can be planned. Leave blank if none.
67
+ validations:
68
+ required: false
69
+ - type: textarea
70
+ id: related
71
+ attributes:
72
+ label: Related links
73
+ description: Links to related issues, PRs, discussions, or docs. Leave blank if none.
74
+ validations:
75
+ required: false
@@ -1,30 +1,30 @@
1
- # Managed by @plainconceptsplatform/workflows. Source: loops/templates/release/github-release.yml. Update with `workflows update --force`; consumer edits may be overwritten.
2
- name: Publish GitHub release
3
-
4
- on:
5
- push:
6
- tags:
7
- - "v*"
8
-
9
- permissions:
10
- contents: write
11
-
12
- jobs:
13
- publish:
14
- name: Publish release
15
- runs-on: [self-hosted, linux, agents]
16
- timeout-minutes: 10
17
- steps:
18
- - name: Create or update GitHub release
19
- env:
20
- GH_TOKEN: ${{ github.token }}
21
- TAG: ${{ github.ref_name }}
22
- shell: bash
23
- run: |
24
- set -euo pipefail
25
-
26
- if gh release view "$TAG" >/dev/null 2>&1; then
27
- gh release edit "$TAG" --title "$TAG" --generate-notes
28
- else
29
- gh release create "$TAG" --title "$TAG" --generate-notes
30
- fi
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/templates/release/github-release.yml. Update with `workflows update --force`; consumer edits may be overwritten.
2
+ name: Publish GitHub release
3
+
4
+ on:
5
+ push:
6
+ tags:
7
+ - "v*"
8
+
9
+ permissions:
10
+ contents: write
11
+
12
+ jobs:
13
+ publish:
14
+ name: Publish release
15
+ runs-on: [self-hosted, linux, agents]
16
+ timeout-minutes: 10
17
+ steps:
18
+ - name: Create or update GitHub release
19
+ env:
20
+ GH_TOKEN: ${{ github.token }}
21
+ TAG: ${{ github.ref_name }}
22
+ shell: bash
23
+ run: |
24
+ set -euo pipefail
25
+
26
+ if gh release view "$TAG" >/dev/null 2>&1; then
27
+ gh release edit "$TAG" --title "$TAG" --generate-notes
28
+ else
29
+ gh release create "$TAG" --title "$TAG" --generate-notes
30
+ fi
@@ -16,7 +16,25 @@ env:
16
16
  # re-running a decision produces the same decision. Created idempotently where it is applied.
17
17
  STALLED_LABEL: stalled
18
18
  PR_PENDING_LABEL: pr-pending
19
- NO_PULL_REQUEST_COMMENT: "The implementation run finished without producing a pull request. Nothing was lost, but nothing landed either: the issue keeps `implement` and is flagged for a retry."
19
+ # Five ways a run ends with no pull request, and they are not the same thing. One sentence
20
+ # covered all of them, which is why three issues in two days said "nothing landed" and none of
21
+ # them could be acted on: one agent gave up in a minute, another did more work than the run that
22
+ # succeeded and never asked for a pull request, and a third was told to stop. The retry that
23
+ # follows is right for some and wasted on the rest. Each is one line: the compiler flattens a
24
+ # multi-line env value.
25
+ #
26
+ # The agent produced nothing at all. Measured on Pliny-Bot #191: the model was called, replied
27
+ # with almost nothing each time, and emitted no safe output.
28
+ NO_OUTPUT_COMMENT: "The implementation run produced nothing at all: no patch, and no request to open a pull request. That is a failed run rather than a decision, so the issue keeps `implement` and is flagged for a retry."
29
+ # The agent wrote the code and never asked for it to be published. Measured on Pliny-Bot #175,
30
+ # whose run produced more output than the run that succeeded the same hour.
31
+ PATCH_WITHOUT_REQUEST_COMMENT: "The implementation wrote code but never asked for a pull request, so nothing was published and the patch is only in the run. The work is not lost -- it is in the run's artifacts -- but it has to be asked for again. The issue keeps `implement` and is flagged for a retry."
32
+ # The agent asked, and the handler did not apply it. Different from a push that conflicted:
33
+ # there, gh-aw kept the patch as an issue and said so.
34
+ OUTPUT_NOT_APPLIED_COMMENT: "The implementation asked for a pull request and it was not applied, so the request exists in the run and nothing reached the repository. That is a failure on our side of the handoff rather than the agent's, and it is flagged for a retry."
35
+ # The agent was asked to do the work and reported there was none. A decision, not a failure:
36
+ # retrying it produces the same answer, so it is not flagged stalled and the janitor leaves it.
37
+ NOOP_COMMENT: "The implementation ran and reported there was nothing to do. That is an answer rather than a failure, so the issue is not queued for another attempt. If it is wrong, say what is missing and label it `implement` again."
20
38
  # Said when the agent DID write the code and the push failed. gh-aw pushes through the GraphQL
21
39
  # signed-commits API, which rebases onto the current parent, so a `main` that moved under a long
22
40
  # run conflicts; gh-aw keeps the work by filing the patch as an issue rather than dropping it,
@@ -299,8 +317,83 @@ jobs:
299
317
  ${{ env.IMPLEMENT_MARKER }}
300
318
  ${{ env.PUSH_CONFLICT_COMMENT }}
301
319
  [View this workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
302
- - name: Flag a run that produced no pull request
303
- if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '')
320
+ # Which of the remaining four happened, from what the agent itself reported.
321
+ #
322
+ # `output_types` and `has_patch` are the agent job's own outputs, and gh-aw gates on the
323
+ # first of them itself, so they are read here rather than invented. They are also the only
324
+ # way to tell these apart from `conclude`: the usage artifact that carries the token counts
325
+ # is uploaded by `conclusion`, and `conclusion` already depends on this job, so naming it is
326
+ # a dependency cycle that does not compile.
327
+ #
328
+ # Ordered most specific first, and each condition excludes the ones above it, so exactly one
329
+ # of the four fires. Pliny-Bot #191 is the last of them and #175 is the one before it: both
330
+ # said "nothing landed" and neither could be acted on, while #175's run had produced more
331
+ # output than the run that succeeded in the same hour.
332
+ - name: Flag a request that was not applied
333
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && contains(needs.agent.outputs.output_types, 'create_pull_request')
334
+ uses: ./.github/actions/add-issue-labels
335
+ with:
336
+ token: ${{ steps.app-token.outputs.token }}
337
+ issue-number: ${{ inputs.issue-number }}
338
+ labels: |-
339
+ ${{ env.REVIEW_LABEL }}
340
+ ${{ env.STALLED_LABEL }}
341
+ - name: Say the request was not applied
342
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && contains(needs.agent.outputs.output_types, 'create_pull_request')
343
+ uses: ./.github/actions/create-issue-comment
344
+ with:
345
+ token: ${{ steps.app-token.outputs.token }}
346
+ issue-number: ${{ inputs.issue-number }}
347
+ body: |
348
+ ${{ env.IMPLEMENT_MARKER }}
349
+ ${{ env.OUTPUT_NOT_APPLIED_COMMENT }}
350
+ [View this workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
351
+ - name: Release an issue the agent found nothing to do on
352
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && contains(needs.agent.outputs.output_types, 'noop')
353
+ uses: ./.github/actions/add-issue-labels
354
+ with:
355
+ token: ${{ steps.app-token.outputs.token }}
356
+ issue-number: ${{ inputs.issue-number }}
357
+ labels: |-
358
+ ${{ env.REVIEW_LABEL }}
359
+ - name: Take the implement label off a decided issue
360
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && contains(needs.agent.outputs.output_types, 'noop')
361
+ uses: ./.github/actions/remove-issue-labels
362
+ with:
363
+ token: ${{ steps.app-token.outputs.token }}
364
+ issue-number: ${{ inputs.issue-number }}
365
+ labels: ${{ env.IMPLEMENT_LABEL }}
366
+ - name: Say there was nothing to do
367
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && contains(needs.agent.outputs.output_types, 'noop')
368
+ uses: ./.github/actions/create-issue-comment
369
+ with:
370
+ token: ${{ steps.app-token.outputs.token }}
371
+ issue-number: ${{ inputs.issue-number }}
372
+ body: |
373
+ ${{ env.IMPLEMENT_MARKER }}
374
+ ${{ env.NOOP_COMMENT }}
375
+ [View this workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
376
+ - name: Flag a patch nobody asked to publish
377
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && !contains(needs.agent.outputs.output_types, 'noop') && needs.agent.outputs.has_patch == 'true'
378
+ uses: ./.github/actions/add-issue-labels
379
+ with:
380
+ token: ${{ steps.app-token.outputs.token }}
381
+ issue-number: ${{ inputs.issue-number }}
382
+ labels: |-
383
+ ${{ env.REVIEW_LABEL }}
384
+ ${{ env.STALLED_LABEL }}
385
+ - name: Say the patch was never asked for
386
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && !contains(needs.agent.outputs.output_types, 'noop') && needs.agent.outputs.has_patch == 'true'
387
+ uses: ./.github/actions/create-issue-comment
388
+ with:
389
+ token: ${{ steps.app-token.outputs.token }}
390
+ issue-number: ${{ inputs.issue-number }}
391
+ body: |
392
+ ${{ env.IMPLEMENT_MARKER }}
393
+ ${{ env.PATCH_WITHOUT_REQUEST_COMMENT }}
394
+ [View this workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
395
+ - name: Flag a run that produced nothing
396
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && !contains(needs.agent.outputs.output_types, 'noop') && needs.agent.outputs.has_patch != 'true'
304
397
  uses: ./.github/actions/add-issue-labels
305
398
  with:
306
399
  token: ${{ steps.app-token.outputs.token }}
@@ -308,15 +401,15 @@ jobs:
308
401
  labels: |-
309
402
  ${{ env.REVIEW_LABEL }}
310
403
  ${{ env.STALLED_LABEL }}
311
- - name: Say so on the issue
312
- if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '')
404
+ - name: Say the run produced nothing
405
+ if: needs.safe_outputs.outputs.created_pr_number == '' && (needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '0' || needs.safe_outputs.outputs.process_safe_outputs_items_succeeded == '') && !contains(needs.agent.outputs.output_types, 'create_pull_request') && !contains(needs.agent.outputs.output_types, 'noop') && needs.agent.outputs.has_patch != 'true'
313
406
  uses: ./.github/actions/create-issue-comment
314
407
  with:
315
408
  token: ${{ steps.app-token.outputs.token }}
316
409
  issue-number: ${{ inputs.issue-number }}
317
410
  body: |
318
411
  ${{ env.IMPLEMENT_MARKER }}
319
- ${{ env.NO_PULL_REQUEST_COMMENT }}
412
+ ${{ env.NO_OUTPUT_COMMENT }}
320
413
  [View this workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
321
414
  incomplete:
322
415
  needs: [agent, safe_outputs, eligibility]
@@ -285,7 +285,7 @@ jobs:
285
285
  Protected files:
286
286
  ${{ needs.protected_changes.outputs.files }}
287
287
 
288
- Required owners: ${{ needs.protected_changes.outputs.required_owners || 'none configured' }}
288
+ Required owners: `${{ needs.protected_changes.outputs.required_owners || 'none configured' }}`
289
289
 
290
290
  **Verdict:** owner-review
291
291
 
@@ -439,7 +439,9 @@ jobs:
439
439
  | Files / lines | ${{ needs.protected_changes.outputs.files_changed }} / ${{ needs.protected_changes.outputs.lines_changed }} |
440
440
  | Protected paths | ${{ needs.protected_changes.outputs.requires_review == 'true' && 'yes' || 'no' }} |
441
441
  | Owner paths | ${{ needs.protected_changes.outputs.owner_hit == 'true' && 'yes' || 'no' }} |
442
- | Required owners | ${{ needs.protected_changes.outputs.required_owners || 'none configured' }} |
442
+ ${{ needs.validate_output.outputs.outcome == 'owner-review'
443
+ && format('| Required owners | `{0}` |', needs.protected_changes.outputs.required_owners != '' && needs.protected_changes.outputs.required_owners || 'none configured, see the matched paths above')
444
+ || '' }}
443
445
 
444
446
  Why this blast radius:
445
447
  ```