Repository navigation
feat(aidd-vcs): ci-watch skill with compact GitHub status script #586
Copy link
Copy link
Open
Description
Problem
Ship / open-PR paths do not wait on CI deterministically. Free-form agent polling is verbose and inconsistent. Sessions can treat work as done while checks are still red. The async orchestrator path (#149) does not give interactive sessions a compact exit-code contract.
Not a duplicate of #149
| #149 | This issue | |
|---|---|---|
| Caller | Async bot / orchestrator | Interactive session skill |
| Mechanism | React to checks/comments in bot loop | Local script + skill mapping exit codes |
| Integration | Auto finalize rules | Opt-in via features.ci_watch_before_ship |
Scope
- Skill
ci-watch: resolve PR | branch | run id → run script → map exit code. - Bundled script (GitHub-first), e.g. plugin
scripts/ci-watch:- deps:
gh,jq; - flags:
--repo,--pr|--run|--branch, optional--workflow,--interval; - compact stdout (state-change lines; failed job logs only on red);
- stable exit codes documented in script header + skill (pass / fail / cancelled / other / pass-but-not-merged if merge watch);
- pure classifiers unit-testable without network.
- deps:
- Integration contract (non-vacuous):
- Feature flag
features.ci_watch_before_shipin.aidd/config.yml(default false = non-breaking). - When true, ship/finalize path must run ci-watch and must not claim success on non-zero failure exit.
- When false, skill remains manually invocable (standalone value).
- Feature flag
- Skill does not re-implement polling in prose as the primary path.
Standalone value: Any session can wait on CI with stable exit codes without an async bot.
Acceptance criteria
- Green PR: exit 0; short summary.
- Red PR: non-zero failure; failed check names (+ failed logs only).
- Skill invokes script and maps exit codes (no primary agent poll loop).
- Read-only (no commits / force-push).
- With
features.ci_watch_before_ship: trueand red checks, ship path does not report success (doc + action test or fixture). - With flag false/absent, ship behavior unchanged; skill still runnable alone.
- Issue body states non-duplicate vs feat(aidd-orchestrator): react to failing CI checks and quality-gate feedback #149 (this section).
Prior art in this repo
- feat(aidd-orchestrator): react to failing CI checks and quality-gate feedback #149 — async bot reacts to failing checks / quality gates (
plugins/aidd-orchestrator/skills/00-async-dev/actions/review/) plugins/aidd-vcs/skills/02-pull-request/— open PR / ship-adjacent external pathplugins/aidd-dev/skills/00-sdlc/SKILL.md— ship step in interactive SDLC (no CI wait today)
Relations
Intended graph (same fields as GitHub parent / blocked-by / blocks). Formal GraphQL edges need maintainer write — see comment on #584.
| Field | Value |
|---|---|
| parent | #584 |
| blocked-by | #585 |
| blocks | — |
| related | #149 |
| MVP | 1 |
Out of scope
- Auto-fix on red CI
- Non-GitHub forges in v1 (same exit-code contract later)
- Async bot loop (feat(aidd-orchestrator): react to failing CI checks and quality-gate feedback #149)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Type
Fields
Priority
Low
Projects
- StatusShow more project fieldsIdeation
Activity
blafourcade commentedon Sep 9, 2026
The problem is valid, but the proposed implementation duplicates
gh pr checks --watch --fail-fast: GitHub CLI already resolves a PR or current branch, watches checks, supports an interval, exposes JSON state buckets, and documents a pending exit code. A bundledgh+jqpolling script and its own exit-code taxonomy would create a second contract to maintain.There is also no interactive “ship” action to gate today.
aidd-vcs:02-pull-requestalways creates a draft PR and does not claim merge or final delivery success. Consequentlyfeatures.ci_watch_before_shipin.aidd/config.ymlhas no current enforcement point and should not depend on #585.Suggested narrower follow-up, if the capability remains wanted: a GitHub-backed, read-only VCS skill that calls the native
gh pr checks --watch --fail-fastbinary and reportspass,fail,pending, orcancelled. On another forge or withoutgh, it reports that the capability is unavailable. It performs no merge, ship decision, configuration read, custom polling script, or provider-agnostic simulation.