Skip to content

fix(issue-deps): pick the client by environment, gh 2.94.0 first - #133

Merged
jmcvetta merged 3 commits into
masterfrom
claude/undertake-129-cy7rns
Sep 9, 2026
Merged

jmcvetta merged 3 commits into
masterfrom
claude/undertake-129-cy7rns

Conversation

@jmcvetta

@jmcvetta jmcvetta commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Three clients for the issue graph, chosen by a probe: gh 2.94.0, the script, the MCP.

Three roads lead to the same graph;
the probe, not the wish, decides.
Where gh is new it walks alone,
where none is here, say so and wait.

Summary

gh reaches the whole issue-relationship graph from 2.94.0 on, both directions of blocked-by included. The issue-deps skill did not know this: it named the script as the only way to a blocking edge and the MCP as the way to everything else, and the session that reported #129 had an MCP that reached none of it. This change rewrites the skill's client matrix as three columns and adds the probe that picks one, so a session uses the best client its environment has and says plainly what the worst one cannot do.

Details

The floor is 2.94.0, not 2.100.0. The issue measured on 2.100.0. Bisecting pkg/cmd/issue/edit/edit.go across the cli/cli tags puts the --add-blocked-by, --add-blocking, --add-sub-issue and --parent flags, and the blockedBy, blocking, subIssues, parent and issueType JSON fields, all in 2.94.0 (cli/cli#13057); closedByPullRequestsReferences predates it. The skill states that floor and the two unhelpful errors an older gh gives instead of naming its version.

Three branches, in order. gh at the floor or later uses the flags. A token without a usable gh, which is every Claude Code web worker, uses scripts/issue-deps.sh, now described as load-bearing rather than a gap-filler. The MCP alone gets a plain statement: both generations of the server return counts with no members for blocked-by, and the older generation, the one with get_issue rather than issue_read, reaches neither sub-issues nor closed_by_pull_requests and writes nothing into the graph. The tool list is the probe for which generation is present.

Kept from the old text. The propose-from-evidence rule, unchanged. The pull-request read that answers empty rather than refusing, now noted for gh as well as REST, since gh does not close that trap. The from-the-blocked-side rule, now stated as REST's constraint and the script's, with gh inverting --add-blocking client-side.

Added. The pipe that eats gh's exit status: gh issue edit … | tail reports tail's $?. The gh refusals, all honest and non-zero.

Expiry widened. The script's header and the skill's Expiry section now retire it when the environment it serves stops existing, not when the MCP grows the endpoints, because the capability arrived through gh instead and the MCP still has not caught up.

The script's logic is untouched; only its header comments change.

Issues

🤖 Generated with Claude Code

https://claude.ai/code/session_01GD6mX5vZRcuFi9DiWv9Gtm


Generated by Claude Code

gh reaches the whole issue-relationship graph from 2.94.0 (cli/cli#13057),
both directions of blocked-by included. The skill said the MCP reached
sub-issues and closed_by_pull_requests and the script reached the rest;
the reporter's MCP reached neither, and gh was not in the table at all.

Now the table has three columns and a probe picks one: gh >= 2.94.0 where
present, the script where there is a token and no gh (every web worker),
and the MCP alone gets a plain statement that the graph is counts-only
there and, on the older server, not writable.

Kept: the PR read that answers empty rather than refusing (gh does not
close it), and the propose-and-confirm rule. Added: the pipe that eats
gh's exit status. Expiry widened from "when the MCP exposes the
endpoints" to "when the environment the script serves stops existing".

Closes #129.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GD6mX5vZRcuFi9DiWv9Gtm
@github-actions

github-actions Bot commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

Projected releases

Files Current Without this PR Projected
2 0.18.0 — 0.18.1
Changelog preview

0.18.1 (2026-09-09)

Bug Fixes

  • issue-deps: pick the client by environment, gh 2.94.0 first (8609d28)
Matched files
  • skills/issue-deps/SKILL.md
  • skills/issue-deps/scripts/issue-deps.sh

Projected for 8609d28 · re-rendered 2026-09-09 21:43 UTC

@jmcvetta jmcvetta left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review (medium effort). Docs-only PR — scripts/issue-deps.sh changes are comment-only, so the review is about whether the documented gh path is accurate enough to act on. Three findings, all in skills/issue-deps/SKILL.md, verified against gh's trunk source rather than memory.

make check-manifests and make check-step-names pass. The --parent spelling (rather than the --set-parent proposed in cli/cli#13057) is correct against current gh, and closedByPullRequestsReferences, blockedBy, blocking, subIssues all check out as real --json fields.


Generated by Claude Code

Comment thread skills/issue-deps/SKILL.md Resolved
Comment thread skills/issue-deps/SKILL.md Resolved
Comment thread skills/issue-deps/SKILL.md Resolved
Three corrections, all measured against cli/cli v2.100.0 source:

--remove-parent is a BoolVar and takes no argument, so it is not one of
the "--remove- pairs" and is not covered by "every flag takes a number
or a URL". Written the old way, a session runs `--remove-parent 150`,
aborts on argument count, and reads the failure as a too-old gh.

The client probe tested the version and not the credential. An image
shipping gh with no token passed branch 1 and failed every call, with
branch 2 unreachable. It now probes `gh auth status` and falls through.

`gh --json blockedBy` wraps the field in its own key. Documented without
the wrapper, `jq '.totalCount'` is null, and null read as zero is the
false-empty answer that paragraph exists to warn about.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GD6mX5vZRcuFi9DiWv9Gtm
@jmcvetta
jmcvetta marked this pull request as ready for review September 9, 2026 21:40
@jmcvetta jmcvetta changed the title feat(issue-deps): pick the client by environment, gh 2.94.0 first fix(issue-deps): pick the client by environment, gh 2.94.0 first Sep 9, 2026
@jmcvetta
jmcvetta merged commit 1ec2d0b into master Sep 9, 2026
6 checks passed
@jmcvetta
jmcvetta deleted the claude/undertake-129-cy7rns branch September 9, 2026 21:44
jmcvetta pushed a commit that referenced this pull request Sep 9, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.18.1](v0.18.0...v0.18.1)
(2026-09-09)


### Bug Fixes

* **issue-deps:** pick the client by environment, gh 2.94.0 first
([#133](#133))
([1ec2d0b](1ec2d0b))
* **undertake:** the ready gate refuses a branch behind its base
([#135](#135))
([9506f91](9506f91))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: daily-driver-release-bot[bot] <326106134+daily-driver-release-bot[bot]@users.noreply.github.com>
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.

issue-deps: gh 2.100.0 writes the whole graph; the MCP cannot

2 participants