Make a blocked regen reach a human instead of an inbox nobody reads - #32
Merged
Conversation
`regen` fails closed on a blocked classification, uploads its evidence artifact, and then notifies nobody: the workflow has no failure step at all. It failed every run from 2026-09-01T06:55Z, and the only signal was GitHub's default Actions email. Five days passed with the published SDKs stale at v0.36.0 while the blocked batch grew from one item to seven. A failing run now opens a GitHub issue assigned to kev1n, and the next healthy run closes it. Closing is the requirement, not a nicety: the upsert reuses an open issue by exact title, so a stale open incident turns the next real failure into comment 17 on a thread nobody watches. Between those two states a repeat rewrites the body (no notification for news that has not changed) and a changed block adds one comment naming what is newly blocking and what cleared. The issue alone is enough to decide. Its body names each blocked and removed item WITH ITS SKU SLUG, links the failing run and the evidence artifact, and carries the full classifier output. `if: failure()` catches every path, so a failure before the classifier ever ran still files, under a stable single item. The slug is the reason for the one classifier-adjacent change: `renderSummary` drops it, so the release notes say "output required fields changed" with no way to tell which SKU. `classify-cli` gains `--json-out`, which writes the same classification it already computes as JSON, and `release-notes.sh` threads a third path through. The classification itself is untouched - nothing here makes a blocked run any easier to pass. `scripts/upsert-regen-issue.mjs` reimplements the minimum of the AnyAPI monorepo's `upsert-production-incident.mjs` probe shape rather than vendoring it; `pnpm release:test` now runs every `scripts/*.test.mjs` so its 15 tests and the registry-version suite both gate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
regen.ymlfails closed on a blocked classification, uploads its evidence artifact, and then notifies nobody - there is no failure step in the workflow at all. It failed on every run from 2026-09-01T06:55Z; the only signal was GitHub's default Actions email. Five days passed with the SDKs stale at v0.36.0 while the blocked batch grew from one item to seven. (PR #31 is the acceptance of that batch.)What this adds
A failing run opens a GitHub issue assigned to
kev1n; the next healthy run closes it.Closing is the requirement, not a nicety. The upsert deduplicates by exact title, so a stale open incident would turn the next real failure into another silent comment on a thread nobody watches - the lesson recorded in the monorepo's
upsert-production-incident.mjs, and the reasonif: success()resolves.if: failure()catches every path, including a failure before the classifier ever ran (that files under a single stable item so the run link still reaches a human).The issue alone is enough to decide
Composed locally from the real blocked artifact (run 34009542245):
Why the classifier CLI changed
renderSummarydrops the slug, so the release notes say "output required fields changed" with no way to tell which SKU - useless as an issue.classify-cligains--json-out, which writes the classification it already computes, andrelease-notes.shthreads a third path through so there is still exactly one classification run per regen.The classification itself is untouched.
generator/src/classify.tshas no diff; nothing here makes a blocked run easier to pass.Rejected
upsert-production-incident.mjswhole: its sentinel/--source productionhalf and itssentinel-report.mjsdependency have no meaning here. Only the probe shape (fingerprint in the body, recovery closes) is reimplemented.Gate
Both
ghpaths were exercised end to end against a stub binary:issue create --assignee kev1non the create path,issue comment+issue closeon the recovery path.🤖 Generated with Claude Code