Commit 17579dc
## Root cause
PR #379 (2026-05-27) added a workflow-level \`concurrency:\` block to
this caller as part of \"add concurrency blocks to 5 read-only
workflows\". The spark-theatre-gate reusable workflow in standards
**already** declares the same concurrency key, and \`\${{
github.workflow }}\` in a reusable resolves to the **caller's** workflow
name (per the estate-known reusable caller-context-vars semantics).
Stacking both blocks causes GitHub to reject the run at
workflow-creation time with a \`startup_failure\`. The Actions UI shows
the run as failed in ~2s, but no job ever spins up and no \`check_run\`
is ever emitted — so the required status-check context
\`spark-theatre-gate / SPARK Theatre Gate\` stays unsatisfied on every
PR.
## Empirical signature
| Window | Run conclusion |
|---|---|
| Before 2026-05-27 13:16Z (pre-#379) | \`success\` /
concurrency-\`cancelled\` |
| After 2026-05-27 13:16Z (post-#379) | \`failure\` /
\`startup_failure\`, \`run_duration_ms\` ≈ 2000, zero jobs |
This was the root cause of every affinescript PR sitting in
\`mergeStateStatus: BLOCKED\` despite all visible checks passing — and
of the 14-PR admin-merge sweep on 2026-05-28.
## Why my-lang etc. don't hit this
Other repos that call the same reusable (\`my-lang\`, \`echidna\`,
\`betlang\`, \`stapeln\`, …) don't have the workflow-level concurrency
block in their caller. Their runs succeed normally.
## Cross-reference
- Closes #438 (owner decision: Option B — wire up the workflow rather
than removing the required context).
- hypatia#376 (BP008 phantom-required-context detector + AM010
admin-merge eligibility) makes this class of failure visible estate-wide
going forward.
- The \`fix/spark-theatre-gate-startup-failure\` checkout was the rest
of #379's concurrency-block additions deliberately left in place; this
is the only one of the five wrappers that conflicts with a reusable's
own concurrency block.
## Test plan
- [x] Local diff inspected — only removes the workflow-level concurrency
block (5 lines + comment) and replaces it with a documented explanation
- [ ] After merge: verify the next spark-theatre-gate run produces a
non-empty job list and emits the required \`spark-theatre-gate / SPARK
Theatre Gate\` check_run
- [ ] After merge: verify a subsequent PR's \`mergeStateStatus\`
resolves to \`CLEAN\`/\`UNSTABLE\` (not \`BLOCKED\`) when all other
checks pass
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e2b33d7 commit 17579dc
1 file changed
Lines changed: 11 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
21 | 27 | | |
22 | 28 | | |
23 | 29 | | |
| |||
0 commit comments