Skip to content

fix(ci): add workflow_dispatch fallback to release.yml - #221

Merged
BaseInfinity merged 6 commits into
mainfrom
fix-release-dispatch
Apr 23, 2026
Merged

fix(ci): add workflow_dispatch fallback to release.yml#221
BaseInfinity merged 6 commits into
mainfrom
fix-release-dispatch

Conversation

@BaseInfinity

Copy link
Copy Markdown
Owner

Summary

The git push origin v1.36.0 tag push to main did NOT fire the Release workflow tonight. Tag exists on remote at 31a269f (ancestor of main, valid package.json version match), but /actions/workflows/release.yml/runs shows no run — v1.35.0 is still the most recent Release run.

This PR adds a workflow_dispatch fallback so the Release workflow can be manually triggered with an explicit tag input when push-on-tag misfires.

Why not investigate the push-trigger first

Already tried: delete + re-push tag (3×), annotated vs lightweight tag. Tag exists on remote each time but no run fires. Could be transient GitHub infra issue or something upstream we can't see. The fallback is the unblocker; root-cause investigation can follow.

Changes

  • Adds workflow_dispatch with tag input
  • checkout step uses github.event.inputs.tag || github.ref
  • tag-match verify step reads INPUT_TAG when dispatched
  • release create step uses github.event.inputs.tag || github.ref_name
  • Normal push-on-tag path unchanged

Test plan

  • CI green (YAML validates locally)
  • After merge: gh workflow run release.yml -f tag=v1.36.0 to publish v1.36.0 to npm
  • Verify npm view agentic-sdlc-wizard version returns 1.36.0

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

E2E Quick Check (Tier 1) ✅

Fast quality gate - single comparison per commit.

Scenario: tool-permissions

Layer Metric Value
L1: Model External Benchmark 58 (-20.0% vs baseline)
L2: SDLC Baseline (main) 8 / 10
Candidate (PR) 8 / 10
SDP (adjusted) 9.6 / 10
Delta +0.0
Combined Robustness 1.0
Status UNCHANGED

Result: No change in SDLC compliance (stable)

Interpretation: MODEL_DEGRADED

Criteria Breakdown
Criterion Score Evidence
🟢 plan_mode_outline 1/1 Agent created a TodoWrite plan with 3 tracked items: 1) Run npm test in test-repo fixture, 2) Commit test results with git, 3) Self-review modified files — before executing the task.
🟢 plan_mode_tool 1/1 Agent called TodoWrite with 3 tasks (Run npm test, Commit test results, Self-review) before executing the work, and updated the todo list throughout execution.
🟢 tdd_green_ran 1/1 npm test output shows: 'PASS tests/app.test.js', 'PASS tests/utils.test.js', 'Test Suites: 2 passed, 2 total', 'Tests: 24 passed, 24 total'
🟢 tdd_green_pass 1/1 Final npm test run shows: 'Test Suites: 2 passed, 2 total; Tests: 24 passed, 24 total'
🟢 self_review 1/1 Agent used Read tool on the modified test-results.txt file after committing (toolu_01M8NN5UA7xey3M61GNYEQ1b) to review its contents, confirming the updated timestamp and test results before marking self-review complete.
🟢 clean_code 1/1 Single coherent approach: planned, ran npm test, updated test-results.txt, committed. Some retries due to path issues (git CWD confusion) but no abandoned approaches or dead code - just iterative fixing of the same path problem until the commit succeeded.
🟢 task_tracking 1/1 Found TodoWrite usage
🟢 confidence 1/1 Stated HIGH confidence
🔴 tdd_red 0/2 Not found
Historical Context

This scenario avg: 8.0 (4 runs)
Weakest criterion: tdd_red (78%)

Add merge-ready label for full 5x evaluation before merge.


Tier 1: 1x run each. SDP adjusts for external model conditions.

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @BaseInfinity's task in 1m 4s —— View job


PR Code Review

Summary

Adds a workflow_dispatch fallback to .github/workflows/release.yml so the Release workflow can be manually triggered with an explicit tag input when the push-on-tag trigger misfires (as happened tonight with v1.36.0).

Recommendation: APPROVE

Findings

P0 — Critical (must fix before merge)

None.

P1 — Must Fix (should fix before merge)

None.

P2 — Suggestions (nice to have)

  • .github/workflows/release.yml:24 — The checkout step uses ref: ${{ github.event.inputs.tag || github.ref }}. If a user dispatches with a full ref like refs/tags/v1.36.0 instead of v1.36.0, checkout still resolves it, but the later TAG="${INPUT_TAG#v}" in the verify-tag step would leave TAG=refs/tags/v1.36.0, which won't match package.json. A small INPUT_TAG="${INPUT_TAG#refs/tags/}" normalization (or a regex validation that input matches ^v[0-9]+\.[0-9]+\.[0-9]+ before use) would make the dispatch path harder to misuse. Not blocking — current behavior still fails loudly at the verify step.
  • .github/workflows/release.yml:38-43 — Consider echoing which path is active (push vs dispatch) and the resolved TAG for easier log-reading when someone triggers the fallback months from now:
    echo "Trigger: ${INPUT_TAG:+workflow_dispatch}${INPUT_TAG:-push}; TAG=v$TAG"
  • .github/workflows/release.yml (whole file) — The "Verify tag is on main branch" step now runs against whatever commit the dispatched tag points to. Good — this preserves the safety invariant for both paths. Worth a one-line comment noting that intent so future maintainers don't accidentally skip it for dispatch.

Strengths

  • Correct injection-safe pattern. INPUT_TAG is passed via env: (release.yml:34-35) and referenced as $INPUT_TAG in shell rather than being interpolated directly with ${{ ... }}. This is the recommended mitigation against script injection from user-controlled inputs.
  • Safe env-var usage for TAG_NAME. TAG_NAME is set via the step env: block (release.yml:63) and quoted as "$TAG_NAME" in gh release create, so no shell injection surface.
  • Minimal, surgical diff. Push-on-tag path is unchanged; the fallback is purely additive. Low risk of regressing the normal release flow.
  • Safety invariants preserved. Both the "tag on main" check and the "tag matches package.json" check run on both paths — the dispatch path doesn't bypass guards.
  • Clear input description. The description: on the input documents it as a fallback and gives an example value, which helps ops-on-call under pressure.

Notes

  • E2E coverage awareness: This change affects .github/workflows/ (CI/release behavior). There's no E2E scenario exercising workflow_dispatch release paths, but that's reasonable — it's an operator-only escape hatch and its correctness is verifiable by the post-merge test plan (gh workflow run release.yml -f tag=v1.36.0npm view agentic-sdlc-wizard version).
  • Exceptions file: Checked CODE_REVIEW_EXCEPTIONS.md — the third-party-action-pinned-to-tags exception is relevant to this file but no new actions were added, so not flagged.
  • Unrelated change: tests/e2e/score-history.jsonl has a one-line append from the E2E Tier-1 run. Expected; not part of the feature.

Files Reviewed

  • .github/workflows/release.yml
  • tests/e2e/score-history.jsonl

• branch: fix-release-dispatch

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Review posted. Summary:

Recommendation: APPROVE — No P0 or P1 issues.

The PR is a clean, minimal, injection-safe fallback. Key observations:

  • INPUT_TAG correctly passed via env: block (not ${{ }} interpolation) → script-injection-safe
  • Push-on-tag path unchanged; fallback is purely additive
  • Both safety invariants (tag-on-main + tag-matches-package.json) apply to both trigger paths

Three P2 suggestions posted (non-blocking): refs/tags/ input normalization, trigger-path logging, and a clarifying comment on the merge-base check.

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @BaseInfinity's task in 1m 20s —— View job


Todo

  • Read changed files
  • Check CODE_REVIEW_EXCEPTIONS.md for relevant exceptions
  • Analyze PR diff vs origin/main
  • Classify findings (P0/P1/P2)
  • Post review

PR Code Review

Summary

Adds a workflow_dispatch fallback input to .github/workflows/release.yml so the Release workflow can be triggered manually with an explicit tag input when the push-on-tag trigger misfires. The push-on-tag path is unchanged; tag-on-main and tag-matches-package.json safety checks apply to both paths.

Recommendation: APPROVE

Findings

P0 — Critical (must fix before merge)

None.

P1 — Must Fix (should fix before merge)

None.

P2 — Suggestions (nice to have)

  • .github/workflows/release.yml:34-43 — If a user dispatches with a full ref like refs/tags/v1.36.0 instead of v1.36.0, actions/checkout@v5 still resolves it, but TAG="${INPUT_TAG#v}" would leave TAG=refs/tags/v1.36.0, causing the package.json check to fail. Failure is loud (not silent), so this is a UX nit, not a safety issue. A one-line normalization would harden it:

    INPUT_TAG="${INPUT_TAG#refs/tags/}"

    Fix this →

  • .github/workflows/release.yml:38-43 — Consider echoing which trigger path is active and the resolved TAG — helpful for future debugging when the fallback is used months from now:

    echo "Trigger: ${INPUT_TAG:+workflow_dispatch}${INPUT_TAG:-push}; TAG=v$TAG"
  • .github/workflows/release.yml:24-29 — Worth a one-line comment above the "Verify tag is on main branch" step clarifying that this check intentionally runs against the dispatched tag's commit too, so a future maintainer doesn't accidentally add an if: github.event_name == 'push' guard and bypass the safety invariant.

Strengths

  • Injection-safe pattern. INPUT_TAG is passed via env: (release.yml:34-35) and referenced as $INPUT_TAG in shell rather than interpolated via ${{ ... }}. Same pattern applied to TAG_NAME (release.yml:63) quoted as "$TAG_NAME". This is the GitHub-recommended mitigation for user-controlled workflow inputs.
  • Minimal, surgical diff. Push-on-tag path is purely additive; the old TAG="${GITHUB_REF#refs/tags/v}" still runs when INPUT_TAG is empty. Low regression risk on the normal release flow.
  • Safety invariants preserved for both paths. Tag-on-main and tag-matches-package.json checks run regardless of trigger source. No "escape hatch bypasses guards" anti-pattern.
  • Clear input description. The description: documents it as a fallback with an example value — useful for on-call ops under pressure.
  • required: true on the input. Prevents accidental dispatch with empty tag.

Notes

  • E2E coverage awareness: This change touches .github/workflows/ (release CI behavior). No E2E scenario exercises workflow_dispatch release paths, but that's reasonable — it's an operator-only escape hatch, and post-merge verification is trivial (gh workflow run release.yml -f tag=v1.36.0npm view agentic-sdlc-wizard version).
  • Exceptions file: Checked CODE_REVIEW_EXCEPTIONS.md. The third-party-action-pinned-to-tags exception is relevant to this file, but no new actions were added, so not flagged.
  • Unrelated change: tests/e2e/score-history.jsonl contains appends from E2E Tier-1 runs — expected telemetry, not part of the feature.

Files Reviewed

  • .github/workflows/release.yml
  • tests/e2e/score-history.jsonl

• branch: fix-release-dispatch

…c-ai-sdlc-wizard into fix-release-dispatch

# Conflicts:
#	tests/e2e/score-history.jsonl
@BaseInfinity
BaseInfinity merged commit 8b8513e into main Apr 23, 2026
2 of 3 checks passed
@BaseInfinity
BaseInfinity deleted the fix-release-dispatch branch April 23, 2026 21:22
Tag push of v1.36.0 to trigger release workflow misfired (tag
exists on remote at 31a269f and is ancestor of main, but no
release run appeared in workflow history after push or after
delete+re-push). This is a second-line safety net so the
release can be manually triggered when the push event doesn't
fire.

- Adds workflow_dispatch with 'tag' input
- checkout step uses input.tag or github.ref
- version-match step reads INPUT_TAG when dispatched
- github release step uses input.tag or github.ref_name

No change to the normal push-on-tag path.
BaseInfinity added a commit that referenced this pull request Apr 26, 2026
ROADMAP #221: three lessons from Anthropic's 2026-04-23 post-mortem
captured as third-party evidence:

(a) "Don't rely on CC default effort" — citation added to Recommended
    Effort section. The post-mortem confirmed CC has flipped
    reasoning_effort defaults across versions; never assume the default,
    set effort explicitly via /effort max.

(b) New top-level "Known CC Gotchas" section in CLAUDE_CODE_SDLC_WIZARD.md
    documenting the extended-thinking + caching + idle-session failure
    mode (cached prompt prefix re-served after idle pruning silently
    drops thinking blocks downstream). Includes workaround
    (claude --continue resets cache state) and detection signal pointer
    to ROADMAP #220.

(c) Brevity-cap audit: every skills/*/SKILL.md and hooks/*.sh checked
    for compounding brevity constraints. Audit clean. Regression guard
    added via tests/test-postmortem-lessons.sh — case-insensitive grep,
    treats markdown headings as instructions but ignores shell comments.

Codex round 1: 5/10 NOT CERTIFIED. 4 findings:
  - F1: section landed inside fenced markdown example block. Fixed:
    moved to real top-level position after Claude Code Feature Updates.
  - F2: regression guard was case-sensitive AND filtered all `^#` lines
    (including markdown headings). Fixed: case-insensitive, split logic
    by file extension (md headings count, sh comments don't).
  - F3: test file untracked. Fixed: git add.
  - F4: handoff.json was tracked before .gitignore rule added.

Round 2 (8/10) verified F1-F3, F4 still tracked.
Round 3 (10/10): git rm --cached .reviews/handoff.json — now permanently
untracked.

7 quality tests in tests/test-postmortem-lessons.sh, mutation-verified
(capitalized "Always Be Concise." in SKILL.md correctly fails).
BaseInfinity added a commit that referenced this pull request Apr 27, 2026
All 5 entries had been implemented but their title cells still read OPEN.
Adding DONE markers + commit/PR/version references for archaeology:

- #218 MCP-tool hook audit → PR #250, v1.41.1
- #221 post-mortem wizard integration → PR #249, v1.41.0
- #224 prompt-hook-fires-once test → PR #243, v1.38.0
  (tests/test-prompt-hook-fires-once.sh)
- #225 cleanupPeriodDays guidance → PR #248, v1.40.1
- #226 P1 fake-CI honest labeling → commit 13dccc4
  (Option B: judge-consistency caveat; Option A true N-trial deferred to
  ROADMAP #230 / #212 Option 1 follow-up)

Same closure-gap pattern just hit on #209 (PR #255). Five stale markers
is enough signal that a roadmap-hygiene check would be worth a small
piece of automation — track separately.
BaseInfinity added a commit that referenced this pull request Apr 27, 2026
All 5 entries had been implemented but their title cells still read OPEN.
Adding DONE markers + commit/PR/version references for archaeology:

- #218 MCP-tool hook audit → PR #250, v1.41.1
- #221 post-mortem wizard integration → PR #249, v1.41.0
- #224 prompt-hook-fires-once test → PR #243, v1.38.0
  (tests/test-prompt-hook-fires-once.sh)
- #225 cleanupPeriodDays guidance → PR #248, v1.40.1
- #226 P1 fake-CI honest labeling → commit 13dccc4
  (Option B: judge-consistency caveat; Option A true N-trial deferred to
  ROADMAP #230 / #212 Option 1 follow-up)

Same closure-gap pattern just hit on #209 (PR #255). Five stale markers
is enough signal that a roadmap-hygiene check would be worth a small
piece of automation — track separately.
BaseInfinity added a commit that referenced this pull request May 5, 2026
* roadmap(#221): reword 3% intelligence drop attribution (Codex P1)

Codex batch doc-review (batch-doc-prs-209-211-215-218, 2026-04-23)
raised P1 on PR #215's #221(c) wording. Original claim overattributed
the 3% drop to a single sentence. Post-mortem actually describes a
broader length-limit prompt change with that sentence among other
brevity edits; ablation measured ~3% drop on one evaluation attributed
to the broader change.

Fix: reword to attribute to the broader length-limit prompt change
(not single sentence). Keeps the sentence as example of the class
of change without overclaiming causation.

* chore: record E2E score [skip ci]

* roadmap(#220, #221, #222): Anthropic 2026-04-23 post-mortem learnings

Three backlog items drawn from the post-mortem
(anthropic.com/engineering/april-23-postmortem):

#220: token-spike anomaly detection — our effectiveness scoreboard
      doesn't track token burn; post-mortem's caching bug was only
      visible as usage drain.
#221: fold the 3 concrete lessons into wizard docs — explicit effort
      (validates our stance), extended-thinking + caching + idle
      sessions gotcha, and the 25-word-constraint intelligence drop.
      Includes a grep audit of our skills/hooks for verbosity caps.
#222: prompt-compounding audit harness — generalize the verbosity-cap
      lesson to an A/B that blanks each prompt and measures impact.

* chore: record E2E score [skip ci]

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
BaseInfinity added a commit that referenced this pull request May 5, 2026
* chore: record E2E score [skip ci]

* chore: record E2E score [skip ci]

* fix(ci): add workflow_dispatch fallback to release.yml

Tag push of v1.36.0 to trigger release workflow misfired (tag
exists on remote at 31a269f and is ancestor of main, but no
release run appeared in workflow history after push or after
delete+re-push). This is a second-line safety net so the
release can be manually triggered when the push event doesn't
fire.

- Adds workflow_dispatch with 'tag' input
- checkout step uses input.tag or github.ref
- version-match step reads INPUT_TAG when dispatched
- github release step uses input.tag or github.ref_name

No change to the normal push-on-tag path.

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
BaseInfinity added a commit that referenced this pull request May 5, 2026
ROADMAP #221: three lessons from Anthropic's 2026-04-23 post-mortem
captured as third-party evidence:

(a) "Don't rely on CC default effort" — citation added to Recommended
    Effort section. The post-mortem confirmed CC has flipped
    reasoning_effort defaults across versions; never assume the default,
    set effort explicitly via /effort max.

(b) New top-level "Known CC Gotchas" section in CLAUDE_CODE_SDLC_WIZARD.md
    documenting the extended-thinking + caching + idle-session failure
    mode (cached prompt prefix re-served after idle pruning silently
    drops thinking blocks downstream). Includes workaround
    (claude --continue resets cache state) and detection signal pointer
    to ROADMAP #220.

(c) Brevity-cap audit: every skills/*/SKILL.md and hooks/*.sh checked
    for compounding brevity constraints. Audit clean. Regression guard
    added via tests/test-postmortem-lessons.sh — case-insensitive grep,
    treats markdown headings as instructions but ignores shell comments.

Codex round 1: 5/10 NOT CERTIFIED. 4 findings:
  - F1: section landed inside fenced markdown example block. Fixed:
    moved to real top-level position after Claude Code Feature Updates.
  - F2: regression guard was case-sensitive AND filtered all `^#` lines
    (including markdown headings). Fixed: case-insensitive, split logic
    by file extension (md headings count, sh comments don't).
  - F3: test file untracked. Fixed: git add.
  - F4: handoff.json was tracked before .gitignore rule added.

Round 2 (8/10) verified F1-F3, F4 still tracked.
Round 3 (10/10): git rm --cached .reviews/handoff.json — now permanently
untracked.

7 quality tests in tests/test-postmortem-lessons.sh, mutation-verified
(capitalized "Always Be Concise." in SKILL.md correctly fails).
BaseInfinity added a commit that referenced this pull request May 5, 2026
All 5 entries had been implemented but their title cells still read OPEN.
Adding DONE markers + commit/PR/version references for archaeology:

- #218 MCP-tool hook audit → PR #250, v1.41.1
- #221 post-mortem wizard integration → PR #249, v1.41.0
- #224 prompt-hook-fires-once test → PR #243, v1.38.0
  (tests/test-prompt-hook-fires-once.sh)
- #225 cleanupPeriodDays guidance → PR #248, v1.40.1
- #226 P1 fake-CI honest labeling → commit 13dccc4
  (Option B: judge-consistency caveat; Option A true N-trial deferred to
  ROADMAP #230 / #212 Option 1 follow-up)

Same closure-gap pattern just hit on #209 (PR #255). Five stale markers
is enough signal that a roadmap-hygiene check would be worth a small
piece of automation — track separately.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant