evaluating-sdk-internal-updates

作成者: bitwarden

bitwarden/androidの「Update SDK to」PRをsdk-internalのコミット範囲に対して評価し、コンパイル時および実行時の破壊的変更を確認し、影響を受けるシンボルを…にマッピングする

npx skills add https://github.com/bitwarden/android --skill evaluating-sdk-internal-updates

Evaluating sdk-internal Updates

Identify both compile-time and runtime breaks before fixing anything — fixing the first break found is not finishing. Steps 3-7 always cover the entire commit range before step 8 starts, no matter how obvious or urgent an early compile-time break looks.

Identify

Binding surface facts specific to this SDK: #[uniffi::export] / derive(uniffi::...) annotations are scattered across many crates, not just crates/bitwarden-uniffi; crates/bitwarden-ffi is unrelated ("do not use"). No .udl files. UniFFI emits one Kotlin package per crate (com.bitwarden.core, com.bitwarden.vault, com.bitwarden.crypto, etc.) — only the top-level Client/AuthClient/GeneratorClients actually live under com.bitwarden.sdk. Both app and authenticator depend on the SDK; neither is optional to search.

A hunk that only touches a macro invocation (e.g. state_bridge! { ... }) doesn't show the binding surface — the expansion lives in the macro's definition, often in a different crate (e.g. bitwarden-state-bridge-macro). #[uniffi::export(with_foreign)] marks a callback interface: a trait Kotlin must implement, where adding a field/method is never additive-safe for the implementor.

  1. Locate the local bitwarden/sdk-internal clone (check sibling directories to this repo). If none exists, stop and tell the user it's a required prerequisite for this skill — do not clone it yourself.
  2. gh pr diff <PR> -R bitwarden/android | grep bitwardenSdk → old/new bitwardenSdk string. Everything after the second - is the git ref — a commit SHA or a branch name (.dev SDK builds use both); resolve a branch name as origin/<branch> in the clone.
  3. Attempt ./gradlew app:compileStandardDebugKotlin authenticator:compileDebugKotlin at the current checkout before crawling sdk-internal. A failure confirms a compile-time break directly, with a more precise location than any git search — note it and continue to steps 4-7 for the full commit range; do not fix it yet. A clean build only rules out compile-time breaks, not runtime ones.
  4. git -C <sdk-internal-path> log --oneline OLD..NEW -G'uniffi::export|derive\(uniffi|#\[uniffi' -- '*.rs' → candidate binding-surface commits.
  5. Classify per hunk, not per commit — a commit with one additive headline change can still have a second, unrelated breaking hunk. If a hunk only touches a macro invocation, read the macro's definition before classifying. git -C <sdk-internal-path> show <sha> -- '*.rs'.
  6. For every distinct symbol/type touched (every hunk, not just the commit's headline change), grep the whole repo for the bare symbol name to find Android call sites — a fixed module list or a com.bitwarden.sdk.<Symbol> import-prefix check both miss real consumers.
  7. Report: compile-time breaks, runtime breaks, safe/no-call-site — each with commit, symbol, and call sites. Cite sdk-internal commits and PRs as bitwarden/sdk-internal#<NNN> or a full commit URL/SHA — never a bare #<NNN> copied from a commit subject line. A bare reference auto-links within whatever repo the report is posted to (e.g. bitwarden/android), tagging an unrelated issue or PR there.

Resolve

Resolve the findings from Step 7 by deciding on a fix (step 8), implementing and committing it directly (step 9), then verifying (step 10).

  1. Decide the fix for anything found, compile-time or runtime, whenever the correct behavior is clear and within scope. For a new required method, grep for the underlying concept, not the new method/type name (it won't exist yet) — no existing consumer means stub it: a // no-op comment or a null/default return that satisfies the compiler, not a behavioral decision. Never TODO() — it throws at runtime, which is a crash, not a stub. A sibling's structure (naming, placement, style) is a template; its behavior (storage, defaulting, error handling, side effects) is not evidence for yours. If unsure, report it instead of guessing, along with anything needing a product decision.
  2. Implement every fix from step 8 directly: invoke Skill(implementing-android-code) first if the fix isn't purely mechanical, then commit with Skill(bitwarden-delivery-tools:committing-changes).
  3. Verify with the same compile task used in step 3.

bitwardenのその他のスキル

figma-to-angular
bitwarden
このスキルは、Figmaのデザイン仕様を、Bitwarden Clientsモノレポ内でStorybookストーリーを持つ完全に実装されたAngularコンポーネントに変換します。出力は、すべてのコードベースの規約に従いながら、視覚的にデザインと一致する必要があります。
force-multiplier
bitwarden
1つの意図を多数のターゲットに同時に適用する——Bitwardenエコシステム全体のリポジトリ群や、モノレポ内の多くのプロジェクト——をN個の一貫した……として。
analyzing-git-sessions
bitwarden
指定された時間枠またはコミット範囲内のgitコミットと変更を分析し、コードレビュー、振り返り、作業ログ、セッション…のための構造化されたサマリーを提供します。
coordinating-cross-team-breakdown
bitwarden
クロスチームのレビューと承認を調整し、Bitwarden Tech Breakdownを実施します。影響を受けるチームの特定、パート3の承認テーブルの作成、フォローアップの際に使用します。
assessing-jira-issue-relevance
bitwarden
ユーザーが単一のJira課題キーを提示し、それがまだ関連性があるか、まだ適用可能か、まだ保留中か、まだバグか、修正済みか、またはその可能性があるかを尋ねる場合に使用します。
assessing-test-coverage
bitwarden
特定の変更(PR、Jiraキー、Tech Breakdownドキュメント、Testmo CSV、変更されたパス、または指定された…)に対して、どのテストカバレッジが既に存在するかを判断する際に使用します。
retrospecting
bitwarden
Claude Codeセッションの包括的な分析を実行し、git履歴、会話ログ、コード変更を調査し、ユーザーフィードバックを収集して生成する…
reviewing-incremental-changes
bitwarden
このスキルは、既にコメントがあるPRを再レビューする際や、初回レビュー後の開発者の変更に対応する際に使用します。PRスレッドが存在する場合や…に適用します。