prompt: complete the ci_status no-gh path (PyAutoHeart#178, #179) - #318
Merged
Conversation
A cloud /health run cleared all three named evidence gaps but stayed STALE
on six reasons, every one of them caused by `gh` being absent from the
session container so `ci_status` could not run.
`gh` is only transport there — the judgment already lives in
`heart/checks/ci_status.py`, which reads a REST-shaped `{"workflow_runs":
[...]}` payload from stdin. Split along the seam where the two halves have
genuinely different costs:
- read_ci_status_head_shas_without_gh: HEAD shas via `git ls-remote`. Needs
no auth and no repo attachment, and on its own clears the reason blocking
the release-validation gate.
- feed_ci_status_run_conclusions_from_an: run conclusions via an
MCP-populated drop point, mirroring test_run.py's proven
`cloud_validation.json` pattern.
Both keep network work out of the <30s tick and default to the five
release-gate libraries rather than the full ~20-repo poll set.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SeYsHrJsuH6wXjCCypKPzp
Both prompts are issued and implemented on PyAutoHeart claude/heart-evidence-gaps-6svdjk, so advance them draft/ -> active/ and register the tasks. Neither entry claims a worktree: the work was done from a cloud session, which has no ~/Code/PyAutoLabs-wt/ root. The branch is pushed, so a dev-box session picks it up with a plain checkout rather than a worktree claim. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SeYsHrJsuH6wXjCCypKPzp
Both shipped in PyAutoHeart#180 (merged a570d0a -> main), so advance them active/ -> complete/ with the full records. Each record keeps the finding the work turned up rather than just what landed: the coreutils `timeout` portability trap for #178, and for #179 that the on_head guard caught runs that were fresh by clock and stale by commit — which is why the age bound alone was never sufficient. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SeYsHrJsuH6wXjCCypKPzp
complete/index.md is generated — resolved by regenerating with lifecycle.py index --apply rather than hand-merging the conflict, so it carries both sides' records (1132). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SeYsHrJsuH6wXjCCypKPzp
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.
Mind state for two tasks shipped in PyAutoLabs/PyAutoHeart#180 (merged
a570d0a).Net effect against
mainis just the two completion records plus the regenerated index — thedraft/→active/→complete/churn cancels out within the branch.Why this is a PR rather than a push to main
/prm's close-out normally commits Mind straight tomain. This session is pinned to the branchclaude/heart-evidence-gaps-6svdjkand instructed never to push elsewhere without permission, so the records land here instead. Nothing else differs.Records
complete/2026/08/ci-status-head-sha-without-gh.md— HEAD shas viagit ls-remotewhenghis absent.complete/2026/08/ci-status-cloud-runs-drop-point.md— run conclusions via an age-bounded, MCP-populated drop point.Each keeps the finding the work turned up, not just what landed:
timeoutis coreutils, so a macOS box withoutghwould have lost the fallback silently, or runls-remoteunbounded inside the<30stick. Resolved totimeout/gtimeoutonce, and skipped where neither exists.on_headguard caught runs that were fresh by clock and stale by commit, which is why the age bound alone was never sufficient.--depth 1clone setsremote.origin.fetchtomainonly, so a pushed feature branch gets no remote-tracking ref and reads as "unpushed" to tooling even when the remote branch exists.lifecycle.py checkandlifecycle.py index --checkboth OK.complete/index.mdconflicted on the merge frommainand was resolved by regenerating it (lifecycle.py index --apply, 1132 records) rather than hand-merging a generated file.Generated by Claude Code