From 41136d685d87087f8b3fe9a6ab6965c643b8c9ae Mon Sep 17 00:00:00 2001 From: Steven Gates Date: Tue, 23 Jun 2026 16:03:34 -0500 Subject: [PATCH 1/2] chore(crashlytics-autotriage): drop show_full_output, bump max-turns to 40 The Firebase MCP server now connects and the Crashlytics tools load, so the temporary verbose logging is no longer needed (and it prints the full Claude execution). Also raise --max-turns 25 -> 40 so a slow/flaky Crashlytics API call doesn't exhaust the turn budget and fail the run before Claude can post its triage comment. --- .github/workflows/crashlytics-autotriage.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/crashlytics-autotriage.yml b/.github/workflows/crashlytics-autotriage.yml index beb54b7..d331302 100644 --- a/.github/workflows/crashlytics-autotriage.yml +++ b/.github/workflows/crashlytics-autotriage.yml @@ -75,9 +75,6 @@ jobs: uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - # Temporary: surfaces the MCP server startup logs so we can diagnose connection - # issues. Remove once the Firebase MCP server connects reliably. - show_full_output: "true" prompt: | You are triaging an automated Crashlytics crash report filed as GitHub issue #${{ github.event.issue.number || github.event.inputs.issue_number }} in stozo04/OpenLoop. @@ -107,5 +104,5 @@ jobs: claude_args: | --mcp-config .github/firebase-mcp.json --allowedTools "mcp__firebase__crashlytics_get_issue,mcp__firebase__crashlytics_list_events,mcp__firebase__crashlytics_batch_get_events,mcp__firebase__crashlytics_get_report,mcp__firebase__crashlytics_list_notes,Bash,Read,Edit,Write,Glob,Grep" - --max-turns 25 + --max-turns 40 --model claude-sonnet-4-6 From 421688c785e27d547237e1069ad9460683d3c89f Mon Sep 17 00:00:00 2001 From: Steven Gates Date: Tue, 23 Jun 2026 16:04:44 -0500 Subject: [PATCH 2/2] feat(crashlytics-autotriage): give Claude the Firebase app ID directly in the prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit google-services.json is gitignored (absent in CI), so Claude can't discover the app ID from the repo. Hardcode it in the prompt (app IDs aren't secret — they ship in the APK) so the Crashlytics tools are called immediately with the right app instead of burning turns searching. --- .github/workflows/crashlytics-autotriage.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/crashlytics-autotriage.yml b/.github/workflows/crashlytics-autotriage.yml index d331302..b02b03f 100644 --- a/.github/workflows/crashlytics-autotriage.yml +++ b/.github/workflows/crashlytics-autotriage.yml @@ -81,13 +81,17 @@ jobs: Follow this repo's CLAUDE.md and docs/DEFINITION_OF_DONE.md. + The Firebase Android app ID is `1:95815153197:android:c30254bb713d1e6ae96aa4`. Pass it + directly to the Crashlytics tools; do NOT search the repo for it (google-services.json is + gitignored and absent in CI). + Steps: 1. Read the issue: `gh issue view ${{ github.event.issue.number || github.event.inputs.issue_number }}`. Extract the `Crashlytics-Issue-ID:` value from the body. 2. Use the Firebase MCP Crashlytics tools (crashlytics_get_issue, crashlytics_list_events, - crashlytics_batch_get_events) to fetch the stacktrace and a few sample events for that - issue ID. If an MCP call fails (the tools are Experimental), proceed with whatever - metadata is in the issue body and say so. + crashlytics_batch_get_events) with that app ID to fetch the stacktrace and a few sample + events for the issue ID. If an MCP call fails (the tools are Experimental), proceed with + whatever metadata is in the issue body and say so. 3. Read the relevant source and docs/lessons_learned/ (several past lessons are Crashlytics-sourced) to locate the likely cause. 4. ALWAYS post a root-cause comment on the issue with: the failing stack frame, the most