Stop a dependency this run satisfied from blocking the next epic - #10
Merged
Conversation
RHAI-761 was removed from the pipeline permanently by two defects that compounded, forty seconds apart. The dependency gate reads each dependency's jira_status from the on-disk epic-task file, written once at the start of the run by fetch_jira_epics.py. The same run then closed RHAI-760 in Jira at 19:06:49 and invoked its dependent at 19:07:29 — which read a snapshot still saying "In Progress" and refused to start. The run invalidated its own source of truth. transition_issue() now writes the new status back to the snapshot on every successful epic-level transition, so the two stay in step. Querying Jira live from the gate was the alternative; it puts a network call in a per-epic gate and leaves every other reader of the snapshot stale anyway. The refusal was then recorded as codegen_outcome=failed, and the pipeline maps a codegen that produced no artifacts to the terminal CI state Failed. But declining to start is a statement about the world, which changes between runs, not about the epic. The skill now writes codegen_outcome=blocked and the pipeline sends that back to Blocked with blocked_by intact. `blocked` is added to CODEGEN_OUTCOMES, the single constant the schema enum and merge validation both derive from. Note the vocabularies: lowercase `blocked` the outcome is not capitalised `Blocked` the CI state, and read_codegen_outcome must keep telling them apart. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
They carried the SHA of a pre-amend commit that no longer exists in history, which makes the evidence field unverifiable. Co-Authored-By: Claude Opus 5 <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.
Why
RHAI-761 was removed from the pipeline permanently by two defects that compounded, forty seconds apart on the RHAISTRAT-2671 run.
The gate read a snapshot the same run had invalidated.
check_dependencies.pyreads each dependency'sjira_statusfrom the on-disk epic-task file, written once at the start of the run byfetch_jira_epics.py. That run then closed RHAI-760 in Jira at 19:06:49 and invoked its dependent at 19:07:29 — which read a snapshot still sayingIn Progressand refused to start.The refusal was recorded as a terminal failure. The skill wrote
codegen_outcome: failed, and the pipeline maps a codegen that produced no artifacts to CI stateFailed.Failedis inCI_TERMINAL_STATES, so the epic is skipped on every subsequent run until someone edits the data repo by hand. Declining to start is a statement about the world, which changes between runs — not about the epic.What changed
transition_issue()writes the new status back to the epic-task snapshot on every successful epic-level transition (sync_epic_task_jira_status). Nine epic-level call sites pass the directory; the two strategy-level sites don't, since strategy keys have no epic-task file.codegen_outcome=blocked, added toCODEGEN_OUTCOMES— the single constant thecodegen-runschema enum andmerge_run_metadatavalidation both derive from._ci_handle_readysendsblockedback to CI stateBlockedwithblocked_byintact and nofailure_reason. Anything else still yieldsFailed.Querying Jira live from the gate was the alternative for the first half. Rejected: it puts a network call in a per-epic gate and leaves every other reader of the snapshot stale anyway.
Note the two vocabularies over one word — lowercase
blockedthe outcome is not capitalisedBlockedthe CI state, andread_codegen_outcomehas to keep telling them apart.Tests
772 unit tests pass. New:
TestSyncEpicTaskJiraStatus(6, including the end-to-endtest_dependent_gate_passes_after_transitionwhich drives the real gate),TestCodegenDeclinedIsNotFailed(3), andtest_blocked_ci_state_is_not_the_blocked_outcomepinning the vocabulary split. Ledger: 159 files consistent.Scope
This fixes the skill declining. The environment breaking — a clone or credential fault — still writes terminal
Failed; that stays open asbug-clone-fault-marks-epic-failed, now cross-linked, and the two ad-hoc copies of the retryable-vs-terminal rule should be folded together when it's fixed.🤖 Generated with Claude Code