From 711cdf310c9243bdbd30c2e7f0e9aba144606f2a Mon Sep 17 00:00:00 2001 From: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com> Date: Tue, 21 Jul 2026 05:27:06 +0000 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20implement=20issue=20#301=20?= =?UTF-8?q?=E2=80=94=20Compliance:=20non-stub-feature-ideation.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/feature-ideation.yml | 122 +++++++++++++++++++++---- 1 file changed, 105 insertions(+), 17 deletions(-) diff --git a/.github/workflows/feature-ideation.yml b/.github/workflows/feature-ideation.yml index 9f1724d4..138c84f5 100644 --- a/.github/workflows/feature-ideation.yml +++ b/.github/workflows/feature-ideation.yml @@ -64,8 +64,19 @@ on: required: false default: false type: boolean + enhance_backlog: + description: 'Backlog enhancement sweep: enhance this repo''s open, human-authored, not-yet-enhanced Ideas (one comment each, idempotent). Combine with dry_run=true to preview.' + required: false + default: false + type: boolean + target_discussion: + description: 'Internal — set by `redispatch` when bridging a `discussion:created` event to workflow_dispatch (claude-code-action does not support discussion contexts). Not for manual use.' + required: false + default: '' + type: string # Auto-enhance a freshly-created idea: when a new Discussion is opened in the - # Ideas category, the analyst researches and refines it in single-idea mode. + # Ideas category, the `redispatch` job bridges it to workflow_dispatch (see below) + # so the analyst refines it in single-idea mode under a supported event. discussion: types: [created] @@ -76,15 +87,86 @@ concurrency: cancel-in-progress: false jobs: - ideate: - # On the `discussion` trigger, only run for new ideas in the Ideas category - # and skip the bot's own creations (avoids re-enhancing scheduled output; - # enhancement posts a comment, which does not re-fire `discussion: created`). - # Schedule/dispatch runs are unaffected by this guard. + # ── #963 discussion→dispatch redispatch bridge ─────────────────────────────── + # claude-code-action aborts on `discussion` event contexts ("Unsupported event + # type: discussion"). So on `discussion: created` we do NOT call the reusable + # inline; the `redispatch` job re-invokes this workflow via workflow_dispatch + # (under which the action runs cleanly), passing the number as target_discussion. + # Mirrors initiative-planner.yml's redispatch (#618). The `ideate` reusable call + # then runs only on workflow_dispatch/schedule. + redispatch: if: >- - github.event_name != 'discussion' || - (github.event.discussion.category.slug == 'ideas' && - github.event.discussion.user.type != 'Bot') + github.event_name == 'discussion' && + github.event.discussion.category.slug == 'ideas' && + github.event.discussion.user.type != 'Bot' + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: {} + steps: + - name: Guard — PAT present + # A workflow_dispatch fired with GITHUB_TOKEN is accepted but never starts + # a run (loop prevention), so a PAT is required (same as initiative-planner). + env: + GH_TOKEN: ${{ secrets.GH_PAT_WORKFLOWS }} + run: | + if [ -z "${GH_TOKEN}" ]; then + echo "::error::GH_PAT_WORKFLOWS is required — a workflow_dispatch fired with GITHUB_TOKEN will not start a run." + exit 1 + fi + - name: Re-dispatch under workflow_dispatch + env: + GH_TOKEN: ${{ secrets.GH_PAT_WORKFLOWS }} + REPO: ${{ github.repository }} + DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + run: | + gh workflow run feature-ideation.yml --repo "${REPO}" \ + -f target_discussion="${DISCUSSION_NUMBER}" + + # ── #571 input resolution — keep `inputs` out of the reusable `with:` ──────── + # A reusable-workflow call graph (its `uses:` + `with:`) is validated at + # WORKFLOW SETUP, before — and regardless of — the calling job's `if:`. The + # `inputs` context is only populated for workflow_dispatch/workflow_call, so a + # `with:` that references `${{ inputs.* }}` trips a zero-job startup failure on + # the `discussion` event even though `ideate` is gated off it. We therefore + # resolve the dispatch inputs in this ordinary job (whose step expressions are + # evaluated at RUN time and are skipped on `discussion`) and hand them to + # `ideate` via `needs.prep.outputs.*` — an always-valid context that defers the + # `with:` evaluation to run time. Do not reference `inputs` in `ideate.with`. + prep: + if: github.event_name != 'discussion' + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: {} + outputs: + target_discussion: ${{ steps.resolve.outputs.target_discussion }} + focus_area: ${{ steps.resolve.outputs.focus_area }} + research_depth: ${{ steps.resolve.outputs.research_depth }} + dry_run: ${{ steps.resolve.outputs.dry_run }} + enhance_backlog: ${{ steps.resolve.outputs.enhance_backlog }} + steps: + - name: Resolve dispatch inputs + id: resolve + # `github.event.inputs.*` (not the `inputs` context) so this reads + # cleanly on schedule too, where it is simply null → the defaults below. + env: + TARGET_DISCUSSION: ${{ github.event.inputs.target_discussion }} + FOCUS_AREA: ${{ github.event.inputs.focus_area }} + RESEARCH_DEPTH: ${{ github.event.inputs.research_depth }} + DRY_RUN: ${{ github.event.inputs.dry_run }} + ENHANCE_BACKLOG: ${{ github.event.inputs.enhance_backlog }} + run: | + { + echo "target_discussion=${TARGET_DISCUSSION:-}" + echo "focus_area=${FOCUS_AREA:-}" + echo "research_depth=${RESEARCH_DEPTH:-standard}" + echo "dry_run=${DRY_RUN:-false}" + echo "enhance_backlog=${ENHANCE_BACKLOG:-false}" + } >> "$GITHUB_OUTPUT" + + ideate: + # Runs on workflow_dispatch (including the redispatch bridge above) and schedule. + needs: [prep] + if: github.event_name != 'discussion' # Permissions cascade from the calling job to the reusable workflow. # The reusable workflow's two jobs (gather-signals + analyze) need: # - contents: read (checkout, file reads) @@ -100,12 +182,14 @@ jobs: discussions: write id-token: write actions: read - uses: petry-projects/.github/.github/workflows/feature-ideation-reusable.yml@49ecdfb72d1378864fd6263b0fb94c23626f554a # v1 + uses: petry-projects/.github/.github/workflows/feature-ideation-reusable.yml@feature-ideation/stable # NOSONAR(githubactions:S7637) first-party channel ref with: - # On the `discussion: created` trigger this carries the new Discussion's - # number → the reusable runs single-idea enhancement mode. Empty on - # schedule/dispatch → normal scan. Do not edit this line. - target_discussion: ${{ github.event.discussion.number }} + # All values below come from `needs.prep.outputs.*` (resolved in the `prep` + # job) — NOT the `inputs` context — so this reusable `with:` compiles on the + # `discussion` event without a zero-job startup failure (#571). + # `target_discussion` is forwarded by the `redispatch` bridge above on + # `discussion: created`; empty on schedule/dispatch → normal scan. + target_discussion: ${{ needs.prep.outputs.target_discussion }} # === CUSTOMISE THIS PER REPO — the only required edit === # Replace this paragraph with a 3-5 sentence description of your project, # its target users, and the competitive landscape. The more specific you @@ -120,8 +204,12 @@ jobs: # workflow defaults to that path, so you only need to uncomment and change # sources_file below if you store the list somewhere else. # sources_file: 'docs/feature-ideation-sources.md' - focus_area: ${{ inputs.focus_area || '' }} - research_depth: ${{ inputs.research_depth || 'standard' }} - dry_run: ${{ inputs.dry_run || false }} + focus_area: ${{ needs.prep.outputs.focus_area }} + research_depth: ${{ needs.prep.outputs.research_depth }} + # prep emits the string 'true'/'false'; fromJSON casts it to the boolean + # the reusable's typed inputs require. + dry_run: ${{ fromJSON(needs.prep.outputs.dry_run) }} + # Backlog enhancement sweep of existing un-enhanced Ideas (workflow_dispatch). + enhance_backlog: ${{ fromJSON(needs.prep.outputs.enhance_backlog) }} secrets: CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} From e8e36555f3be328ac414be25589795ce9a051fc0 Mon Sep 17 00:00:00 2001 From: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com> Date: Tue, 21 Jul 2026 05:34:45 +0000 Subject: [PATCH 2/2] fix(reviews): address review comments [skip ci-relay] --- .github/workflows/feature-ideation.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/feature-ideation.yml b/.github/workflows/feature-ideation.yml index 138c84f5..5301917c 100644 --- a/.github/workflows/feature-ideation.yml +++ b/.github/workflows/feature-ideation.yml @@ -157,7 +157,9 @@ jobs: run: | { echo "target_discussion=${TARGET_DISCUSSION:-}" - echo "focus_area=${FOCUS_AREA:-}" + echo "focus_area<