Skip to content

docs+chore: point at opdev for iOS crash diagnosis - #247

Merged
tonyferrell merged 2 commits into
mainfrom
worktree-agent-ae24482a
May 25, 2026
Merged

docs+chore: point at opdev for iOS crash diagnosis#247
tonyferrell merged 2 commits into
mainfrom
worktree-agent-ae24482a

Conversation

@tonyferrell

@tonyferrell tonyferrell commented May 25, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds developer docs for diagnosing iOS crashes via opdev crashes diagnose, plus a one-paragraph pointer in CLAUDE.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:
    • One-liner usage: opdev crashes diagnose --since 24h
    • Who needs this (iOS distribution operator; not required for self-hosting the backend/web stack)
    • App Store Connect API key setup (initial creation + rotation)
    • Where credentials live (SOPS in ownpulse-infra/secrets/ios/)
    • Two credential paths: SOPS via workspace config (default) and ASC_* env vars (one-off debugging)
    • Common queries, troubleshooting, limitations of Apple's perfPowerMetrics pipeline.
  • CLAUDE.md — a single-paragraph "Diagnosing crashes" section pointing at the runbook.

Verification

opdev crashes diagnose --since 24h

Requires app_id populated in ownpulse-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

  • ownpulse-dev#22 — the opdev crashes implementation.
  • ownpulse-infra (pending) — adds app_id to the existing SOPS file. Schema and rotation docs updated in secrets/ios/README.md.

tonyferrell and others added 2 commits May 25, 2026 01:12
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 tonyferrell changed the title feat(ops): App Store Connect crash-diagnosis CLI (Phase 1) docs+chore: point at opdev for iOS crash diagnosis May 25, 2026
@tonyferrell
tonyferrell marked this pull request as ready for review May 25, 2026 18:15
@tonyferrell
tonyferrell merged commit c458194 into main May 25, 2026
10 checks passed
@tonyferrell
tonyferrell deleted the worktree-agent-ae24482a branch May 25, 2026 19:32
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.

1 participant