docs+chore: point at opdev for iOS crash diagnosis - #247
Merged
Conversation
Adds a Python client and shell shim so a Claude Code session can fetch
symbolicated iOS crash reports from App Store Connect with a single command:
ops/diag-crashes.sh --since 24h
Why: when a user submits a crash via Apple's "Share with App Developers"
dialog, the report goes to App Store Connect — previously unreachable from
a Claude session. PR #246 (HealthKit NSException fix) sat for ~4 weeks
with no visibility into whether it actually resolved the user's crashes.
Phase 1 covers only the Apple-side channel. Phase 2 (next PR) makes our
own MetricKit pipeline reliable and adds a backend admin read endpoint
that this CLI will also merge in. Phase 3 wires TestFlight upload + dSYMs
into CI.
Scope:
- ops/asc_client.py — ES256 JWT mint, list_builds with pagination +
host pinning, crash_feedback, SOPS-aware credential loading (PEM never
written to disk).
- ops/diag-crashes.sh — 7-line shim, execs the diagnose subcommand.
- ops/tests/test_asc_client.py — 12 unit tests (JWT structure, signature
verification, since filter, pagination, off-host + http-scheme rejection,
credential loading via env + mocked SOPS). No network calls.
- .claude/settings.json — narrow Bash allow-list for the three public
subcommands (mint-jwt is internal-only).
- .gitignore — __pycache__/ and *.pyc.
- docs/guides/diagnosing-crashes.md — runbook with setup, common queries,
troubleshooting, and a "who needs this" note for self-hosters.
- CLAUDE.md — single-paragraph pointer to the runbook.
Reviewed by: code-review (no blockers), security-review (no blockers —
two prior high-sev SOPS-handling issues resolved by moving decryption out
of bash entirely), principles-guardian (conditional approve, conditions
addressed in docs).
Plan: /Users/tony/.claude/plans/please-put-a-plan-jazzy-firefly.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous commit added ops/asc_client.py and ops/diag-crashes.sh to this repo. Pivoting: the Python client is being ported to Go and folded into opdev (separate repo: ownpulse-dev) as `opdev crashes diagnose`. Reasons: - opdev is the canonical developer CLI; one entry point beats many. - Pure Go binary, no Python runtime dep on operator machines. - Future ops tooling (e.g. dSYM downloads in Phase 3) belongs there too. This commit removes the Python files from this repo and updates the runbook + CLAUDE.md pointer to reference `opdev crashes` instead. The runbook is preserved here because the setup workflow (App Store Connect key generation, SOPS encryption) is OwnPulse-specific and belongs in the main app's developer docs. The Go port itself lands as a separate PR in ownpulse-dev. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tonyferrell
marked this pull request as ready for review
May 25, 2026 18:15
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.
Summary
Adds developer docs for diagnosing iOS crashes via
opdev crashes diagnose, plus a one-paragraph pointer inCLAUDE.md.The actual command is implemented in ownpulse-dev#22 (merged). This PR is docs only.
What's in this PR
docs/guides/diagnosing-crashes.md— runbook covering:opdev crashes diagnose --since 24hownpulse-infra/secrets/ios/)ASC_*env vars (one-off debugging)perfPowerMetricspipeline.CLAUDE.md— a single-paragraph "Diagnosing crashes" section pointing at the runbook.Verification
Requires
app_idpopulated inownpulse-infra/secrets/ios/appstore-connect.sops.yaml. Once present, surfaces symbolicated stack traces for any crash reports that reached App Store Connect via "Share with App Developers."Related
opdev crashesimplementation.app_idto the existing SOPS file. Schema and rotation docs updated insecrets/ios/README.md.