@@ -28,6 +28,7 @@ permissions:
2828 contents : read
2929 issues : write
3030 pull-requests : write
31+ checks : write
3132
3233jobs :
3334 # -- Issue: labeled ambient-code:auto-fix → fresh session prompt --
@@ -274,10 +275,45 @@ jobs:
274275 wait : ' true'
275276 timeout : ' 0'
276277
278+ - name : Post check run on PR
279+ if : >-
280+ always()
281+ && steps.context.outputs.is_fork != 'true'
282+ && steps.context.outputs.type == 'pr'
283+ env :
284+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
285+ run : |
286+ SESSION_NAME="${{ steps.fix-session.outputs.session-name || steps.fix-issue-session.outputs.session-name || steps.custom-session.outputs.session-name }}"
287+ SESSION_URL="${{ steps.fix-session.outputs.session-url || steps.fix-issue-session.outputs.session-url || steps.custom-session.outputs.session-url }}"
288+ SESSION_PHASE="${{ steps.fix-session.outputs.session-phase || steps.fix-issue-session.outputs.session-phase || steps.custom-session.outputs.session-phase }}"
289+
290+ if [ -z "$SESSION_NAME" ]; then
291+ exit 0
292+ fi
293+
294+ # Get PR head SHA
295+ HEAD_SHA=$(gh pr view ${{ steps.context.outputs.number }} --repo "${{ github.repository }}" --json headRefOid --jq '.headRefOid')
296+
297+ # Map session phase to check conclusion
298+ case "$SESSION_PHASE" in
299+ Completed|Running) CONCLUSION="success" ;;
300+ Error|Failed) CONCLUSION="failure" ;;
301+ *) CONCLUSION="neutral" ;;
302+ esac
303+
304+ gh api "repos/${{ github.repository }}/check-runs" \
305+ -X POST \
306+ -f "name=Amber Session" \
307+ -f "head_sha=$HEAD_SHA" \
308+ -f "status=completed" \
309+ -f "conclusion=$CONCLUSION" \
310+ -f "details_url=$SESSION_URL" \
311+ -f "output[title]=Amber — ${{ steps.context.outputs.prompt_type }} prompt" \
312+ -f "output[summary]=Session \`$SESSION_NAME\` (phase: $SESSION_PHASE)" || true
313+
277314 - name : Session summary
278315 if : always() && steps.context.outputs.is_fork != 'true'
279316 run : |
280- # Get session name from whichever step ran (only one will have output)
281317 SESSION_NAME="${{ steps.fix-session.outputs.session-name || steps.fix-issue-session.outputs.session-name || steps.custom-session.outputs.session-name }}"
282318 SESSION_PHASE="${{ steps.fix-session.outputs.session-phase || steps.fix-issue-session.outputs.session-phase || steps.custom-session.outputs.session-phase }}"
283319
@@ -369,6 +405,24 @@ jobs:
369405 print(f" Failed to start session: {e}")
370406 return False
371407
408+ def post_check_run(pr_number, session_name, status="in_progress"):
409+ """Post a check run on the PR linking to the Amber session."""
410+ head_sha = gh("pr", "view", str(pr_number), "--repo", REPO, "--json", "headRefOid", "--jq", ".headRefOid")
411+ if not head_sha:
412+ return
413+ api_url_base = API_URL.rstrip("/").replace("/api", "")
414+ session_url = f"{api_url_base}/projects/{PROJECT}/sessions/{session_name}"
415+ conclusion = "success" if status == "completed" else "neutral"
416+ gh("api", f"repos/{REPO}/check-runs",
417+ "-X", "POST",
418+ "-f", "name=Amber Session",
419+ "-f", f"head_sha={head_sha}",
420+ "-f", "status=completed",
421+ "-f", f"conclusion={conclusion}",
422+ "-f", f"details_url={session_url}",
423+ "-f", "output[title]=Amber — batch fix",
424+ "-f", f"output[summary]=Session `{session_name}` triggered for PR #{pr_number}")
425+
372426 def create_session_api(prompt, session_name="", model="claude-opus-4-6"):
373427 """Create a new session or send message to existing one."""
374428
@@ -476,7 +530,9 @@ jobs:
476530 5. Do not merge. Do not close. Do not force-push.
477531 6. If fundamentally broken beyond repair, add a comment explaining and stop."""
478532
479- create_session_api(prompt, session_name=session_id)
533+ result_name = create_session_api(prompt, session_name=session_id)
534+ if result_name:
535+ post_check_run(number, result_name)
480536
481537 # Increment retry_count in frontmatter so circuit breaker advances
482538 if fm:
0 commit comments