oh-my-agent-commandcode 0.0.0-stage → 20.38.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +35 -2
  2. package/filter-test-output.sh +52 -0
  3. package/mods/oma.ts +347 -0
  4. package/package.json +30 -4
  5. package/skills/_shared/conditional/experiment-ledger.md +28 -0
  6. package/skills/_shared/conditional/exploration-loop.md +22 -0
  7. package/skills/_shared/conditional/quality-score.md +33 -0
  8. package/skills/_shared/core/anti-ai-prose.md +191 -0
  9. package/skills/_shared/core/api-contracts/README.md +28 -0
  10. package/skills/_shared/core/api-contracts/template.md +90 -0
  11. package/skills/_shared/core/clarification-protocol.md +23 -0
  12. package/skills/_shared/core/code-intelligence.md +46 -0
  13. package/skills/_shared/core/collaboration-policy.md +28 -0
  14. package/skills/_shared/core/common-checklist.md +28 -0
  15. package/skills/_shared/core/context-budget.md +22 -0
  16. package/skills/_shared/core/context-loading.md +34 -0
  17. package/skills/_shared/core/difficulty-guide.md +26 -0
  18. package/skills/_shared/core/execution-policy.md +31 -0
  19. package/skills/_shared/core/lessons-learned.md +33 -0
  20. package/skills/_shared/core/prompt-structure.md +18 -0
  21. package/skills/_shared/core/quality-principles.md +11 -0
  22. package/skills/_shared/core/session-metrics.md +35 -0
  23. package/skills/_shared/core/skill-routing.md +39 -0
  24. package/skills/_shared/core/test-approach.md +54 -0
  25. package/skills/_shared/core/vendor-detection.md +52 -0
  26. package/skills/_shared/runtime/memory-protocol.md +118 -0
  27. package/skills/_shared/runtime/result-contract.md +64 -0
  28. package/skills/_shared/ui-interaction-quality.md +133 -0
  29. package/skills/oma-academic-writing/SKILL.md +181 -0
  30. package/skills/oma-academic-writing/resources/abstract-guide.md +51 -0
  31. package/skills/oma-academic-writing/resources/academic-verb-tiers.md +42 -0
  32. package/skills/oma-academic-writing/resources/anti-ai-checklist.md +52 -0
  33. package/skills/oma-academic-writing/resources/hedging-guide.md +132 -0
  34. package/skills/oma-academic-writing/resources/sentence-structure-reference.md +151 -0
  35. package/skills/oma-architecture/SKILL.md +203 -0
  36. package/skills/oma-architecture/resources/api-evolution.md +41 -0
  37. package/skills/oma-architecture/resources/checklist.md +42 -0
  38. package/skills/oma-architecture/resources/execution-protocol.md +115 -0
  39. package/skills/oma-architecture/resources/methodology-selection.md +92 -0
  40. package/skills/oma-architecture/resources/migration-patterns.md +28 -0
  41. package/skills/oma-architecture/resources/output-templates.md +111 -0
  42. package/skills/oma-architecture/resources/stakeholder-synthesis.md +80 -0
  43. package/skills/oma-backend/SKILL.md +202 -0
  44. package/skills/oma-backend/resources/checklist.md +45 -0
  45. package/skills/oma-backend/resources/error-playbook.md +97 -0
  46. package/skills/oma-backend/resources/execution-protocol.md +39 -0
  47. package/skills/oma-backend/resources/orm-reference.md +61 -0
  48. package/skills/oma-backend/variants/node/api-template.ts +315 -0
  49. package/skills/oma-backend/variants/node/snippets.md +475 -0
  50. package/skills/oma-backend/variants/node/stack.yaml +21 -0
  51. package/skills/oma-backend/variants/node/tech-stack.md +33 -0
  52. package/skills/oma-backend/variants/python/api-template.py +378 -0
  53. package/skills/oma-backend/variants/python/snippets.md +199 -0
  54. package/skills/oma-backend/variants/python/stack.yaml +18 -0
  55. package/skills/oma-backend/variants/python/tech-stack.md +45 -0
  56. package/skills/oma-backend/variants/rust/api-template.rs +635 -0
  57. package/skills/oma-backend/variants/rust/snippets.md +471 -0
  58. package/skills/oma-backend/variants/rust/stack.yaml +20 -0
  59. package/skills/oma-backend/variants/rust/tech-stack.md +36 -0
  60. package/skills/oma-backend/variants/stack.schema.json +73 -0
  61. package/skills/oma-brainstorm/SKILL.md +166 -0
  62. package/skills/oma-brainstorm/resources/triz-lite.md +117 -0
  63. package/skills/oma-coordination/SKILL.md +171 -0
  64. package/skills/oma-db/SKILL.md +201 -0
  65. package/skills/oma-db/resources/anti-patterns.md +177 -0
  66. package/skills/oma-db/resources/checklist.md +67 -0
  67. package/skills/oma-db/resources/document-templates.md +107 -0
  68. package/skills/oma-db/resources/error-playbook.md +50 -0
  69. package/skills/oma-db/resources/examples.md +170 -0
  70. package/skills/oma-db/resources/execution-protocol.md +127 -0
  71. package/skills/oma-db/resources/iso-controls.md +98 -0
  72. package/skills/oma-db/resources/migration-playbook.md +93 -0
  73. package/skills/oma-db/resources/query-tuning.md +57 -0
  74. package/skills/oma-db/resources/vector-db.md +159 -0
  75. package/skills/oma-debug/SKILL.md +146 -0
  76. package/skills/oma-debug/resources/bug-report-template.md +327 -0
  77. package/skills/oma-debug/resources/checklist.md +31 -0
  78. package/skills/oma-debug/resources/common-patterns.md +734 -0
  79. package/skills/oma-debug/resources/debugging-checklist.md +364 -0
  80. package/skills/oma-debug/resources/error-playbook.md +94 -0
  81. package/skills/oma-debug/resources/execution-protocol.md +40 -0
  82. package/skills/oma-design/SKILL.md +135 -0
  83. package/skills/oma-design/resources/asset-strategy.md +34 -0
  84. package/skills/oma-design/resources/checklist.md +63 -0
  85. package/skills/oma-design/resources/data-grid.md +48 -0
  86. package/skills/oma-design/resources/design-md-spec.md +107 -0
  87. package/skills/oma-design/resources/design-tokens.md +53 -0
  88. package/skills/oma-design/resources/error-playbook.md +18 -0
  89. package/skills/oma-design/resources/execution-protocol.md +95 -0
  90. package/skills/oma-design/resources/external-design-skills.md +130 -0
  91. package/skills/oma-design/resources/getdesign-fetcher.md +104 -0
  92. package/skills/oma-design/resources/product-interface-review.md +59 -0
  93. package/skills/oma-design/resources/redesign-protocol.md +52 -0
  94. package/skills/oma-design/resources/stitch-integration.md +244 -0
  95. package/skills/oma-dev-workflow/SKILL.md +375 -0
  96. package/skills/oma-dev-workflow/resources/affected-checks.py +58 -0
  97. package/skills/oma-dev-workflow/resources/api-workflows.md +58 -0
  98. package/skills/oma-dev-workflow/resources/database-patterns.md +107 -0
  99. package/skills/oma-dev-workflow/resources/i18n-patterns.md +63 -0
  100. package/skills/oma-dev-workflow/resources/release-coordination.md +240 -0
  101. package/skills/oma-dev-workflow/resources/tooling-profiles.md +217 -0
  102. package/skills/oma-dev-workflow/resources/troubleshooting.md +78 -0
  103. package/skills/oma-dev-workflow/resources/validation-pipeline.md +246 -0
  104. package/skills/oma-docs/SKILL.md +77 -0
  105. package/skills/oma-docs/resources/commands.md +76 -0
  106. package/skills/oma-explanation/SKILL.md +212 -0
  107. package/skills/oma-explanation/resources/document-structure.md +115 -0
  108. package/skills/oma-explanation/resources/draft-format.md +199 -0
  109. package/skills/oma-explanation/resources/html-contract.md +102 -0
  110. package/skills/oma-frontend/SKILL.md +227 -0
  111. package/skills/oma-frontend/resources/angular-rules.md +110 -0
  112. package/skills/oma-frontend/resources/checklist.md +76 -0
  113. package/skills/oma-frontend/resources/error-playbook.md +125 -0
  114. package/skills/oma-frontend/resources/execution-protocol.md +46 -0
  115. package/skills/oma-frontend/resources/snippets.md +354 -0
  116. package/skills/oma-frontend/resources/specialized-visual-implementation.md +193 -0
  117. package/skills/oma-frontend/resources/tailwind-rules.md +83 -0
  118. package/skills/oma-frontend/resources/tech-stack.md +156 -0
  119. package/skills/oma-hwp/SKILL.md +166 -0
  120. package/skills/oma-hwp/config/hwp-config.yaml +35 -0
  121. package/skills/oma-hwp/resources/balanced-tables.ts +39 -0
  122. package/skills/oma-hwp/resources/execution-protocol.md +145 -0
  123. package/skills/oma-hwp/resources/flatten-tables.ts +101 -0
  124. package/skills/oma-hwp/resources/package.json +13 -0
  125. package/skills/oma-hwp/resources/troubleshooting.md +70 -0
  126. package/skills/oma-hwp/resources/tsconfig.json +10 -0
  127. package/skills/oma-hwp/resources/turndown-plugin-gfm.d.ts +9 -0
  128. package/skills/oma-image/SKILL.md +142 -0
  129. package/skills/oma-image/config/image-config.yaml +70 -0
  130. package/skills/oma-image/resources/checklist.md +18 -0
  131. package/skills/oma-image/resources/execution-protocol.md +117 -0
  132. package/skills/oma-image/resources/invocation.md +105 -0
  133. package/skills/oma-image/resources/prompt-tips.md +71 -0
  134. package/skills/oma-image/resources/vendor-matrix.md +90 -0
  135. package/skills/oma-market/SKILL.md +142 -0
  136. package/skills/oma-market/resources/checklist.md +12 -0
  137. package/skills/oma-market/resources/error-playbook.md +12 -0
  138. package/skills/oma-market/resources/execution-protocol.md +60 -0
  139. package/skills/oma-market/resources/frameworks/pestel.md +101 -0
  140. package/skills/oma-market/resources/frameworks/porters-5f.md +90 -0
  141. package/skills/oma-market/resources/frameworks/swot.md +61 -0
  142. package/skills/oma-market/resources/intent-rules.md +35 -0
  143. package/skills/oma-market/resources/output-laws.md +53 -0
  144. package/skills/oma-mobile/SKILL.md +168 -0
  145. package/skills/oma-mobile/resources/checklist.md +77 -0
  146. package/skills/oma-mobile/resources/error-playbook.md +198 -0
  147. package/skills/oma-mobile/resources/execution-protocol.md +47 -0
  148. package/skills/oma-mobile/resources/screen-template.dart +331 -0
  149. package/skills/oma-mobile/resources/screen-template.swift +239 -0
  150. package/skills/oma-mobile/resources/screen-template.tsx +179 -0
  151. package/skills/oma-mobile/resources/tech-stack.md +69 -0
  152. package/skills/oma-mobile/variants/README.md +45 -0
  153. package/skills/oma-mobile/variants/flutter/api-template.dart +461 -0
  154. package/skills/oma-mobile/variants/flutter/snippets.md +1353 -0
  155. package/skills/oma-mobile/variants/flutter/stack.yaml +21 -0
  156. package/skills/oma-mobile/variants/flutter/tech-stack.md +201 -0
  157. package/skills/oma-mobile/variants/kotlin-android/api-template.kt +182 -0
  158. package/skills/oma-mobile/variants/kotlin-android/snippets.md +871 -0
  159. package/skills/oma-mobile/variants/kotlin-android/stack.yaml +32 -0
  160. package/skills/oma-mobile/variants/kotlin-android/tech-stack.md +159 -0
  161. package/skills/oma-mobile/variants/react-native/api-template.ts +531 -0
  162. package/skills/oma-mobile/variants/react-native/snippets.md +1014 -0
  163. package/skills/oma-mobile/variants/react-native/stack.yaml +22 -0
  164. package/skills/oma-mobile/variants/react-native/tech-stack.md +192 -0
  165. package/skills/oma-mobile/variants/stack.schema.json +68 -0
  166. package/skills/oma-mobile/variants/swift-ios/api-template.swift +165 -0
  167. package/skills/oma-mobile/variants/swift-ios/snippets.md +1028 -0
  168. package/skills/oma-mobile/variants/swift-ios/stack.yaml +25 -0
  169. package/skills/oma-mobile/variants/swift-ios/tech-stack.md +174 -0
  170. package/skills/oma-observability/SKILL.md +225 -0
  171. package/skills/oma-observability/resources/anti-patterns.md +555 -0
  172. package/skills/oma-observability/resources/boundaries/cross-application.md +348 -0
  173. package/skills/oma-observability/resources/boundaries/multi-tenant.md +290 -0
  174. package/skills/oma-observability/resources/boundaries/release.md +372 -0
  175. package/skills/oma-observability/resources/boundaries/slo.md +225 -0
  176. package/skills/oma-observability/resources/checklist.md +123 -0
  177. package/skills/oma-observability/resources/examples.md +448 -0
  178. package/skills/oma-observability/resources/execution-protocol.md +166 -0
  179. package/skills/oma-observability/resources/incident-forensics.md +348 -0
  180. package/skills/oma-observability/resources/intent-rules.md +307 -0
  181. package/skills/oma-observability/resources/layers/L3-network.md +281 -0
  182. package/skills/oma-observability/resources/layers/L4-transport.md +299 -0
  183. package/skills/oma-observability/resources/layers/L7-application/crash-analytics.md +359 -0
  184. package/skills/oma-observability/resources/layers/L7-application/mobile-rum.md +278 -0
  185. package/skills/oma-observability/resources/layers/L7-application/waf.md +246 -0
  186. package/skills/oma-observability/resources/layers/L7-application/web-rum.md +350 -0
  187. package/skills/oma-observability/resources/layers/mesh.md +368 -0
  188. package/skills/oma-observability/resources/matrix.md +177 -0
  189. package/skills/oma-observability/resources/meta-observability.md +605 -0
  190. package/skills/oma-observability/resources/observability-as-code.md +666 -0
  191. package/skills/oma-observability/resources/signals/audit.md +310 -0
  192. package/skills/oma-observability/resources/signals/cost.md +303 -0
  193. package/skills/oma-observability/resources/signals/logs.md +263 -0
  194. package/skills/oma-observability/resources/signals/metrics.md +478 -0
  195. package/skills/oma-observability/resources/signals/privacy.md +351 -0
  196. package/skills/oma-observability/resources/signals/profiles.md +245 -0
  197. package/skills/oma-observability/resources/signals/traces.md +360 -0
  198. package/skills/oma-observability/resources/standards.md +214 -0
  199. package/skills/oma-observability/resources/transport/collector-topology.md +308 -0
  200. package/skills/oma-observability/resources/transport/otlp-grpc-vs-http.md +256 -0
  201. package/skills/oma-observability/resources/transport/sampling-recipes.md +297 -0
  202. package/skills/oma-observability/resources/transport/udp-statsd-mtu.md +167 -0
  203. package/skills/oma-observability/resources/vendor-categories.md +352 -0
  204. package/skills/oma-orchestration/SKILL.md +302 -0
  205. package/skills/oma-orchestration/config/cli-config.yaml +92 -0
  206. package/skills/oma-orchestration/resources/memory-schema.md +232 -0
  207. package/skills/oma-orchestration/resources/subagent-prompt-template.md +30 -0
  208. package/skills/oma-orchestration/scripts/parallel-run.sh +6 -0
  209. package/skills/oma-orchestration/scripts/spawn-agent.sh +5 -0
  210. package/skills/oma-orchestration/scripts/verify.sh +20 -0
  211. package/skills/oma-orchestration/templates/backend-task.md +19 -0
  212. package/skills/oma-orchestration/templates/debug-task.md +16 -0
  213. package/skills/oma-orchestration/templates/frontend-task.md +18 -0
  214. package/skills/oma-orchestration/templates/mobile-task.md +18 -0
  215. package/skills/oma-orchestration/templates/qa-task.md +16 -0
  216. package/skills/oma-orchestration/templates/tasks-example.yaml +15 -0
  217. package/skills/oma-pdf/SKILL.md +162 -0
  218. package/skills/oma-pdf/config/pdf-config.yaml +27 -0
  219. package/skills/oma-pdf/resources/execution-protocol.md +127 -0
  220. package/skills/oma-pm/SKILL.md +157 -0
  221. package/skills/oma-pm/resources/error-playbook.md +75 -0
  222. package/skills/oma-pm/resources/examples.md +439 -0
  223. package/skills/oma-pm/resources/execution-protocol.md +62 -0
  224. package/skills/oma-pm/resources/iso-planning.md +110 -0
  225. package/skills/oma-pm/resources/plan-phase-protocol.md +66 -0
  226. package/skills/oma-pm/resources/task-template.json +86 -0
  227. package/skills/oma-qa/SKILL.md +141 -0
  228. package/skills/oma-qa/resources/checklist.md +339 -0
  229. package/skills/oma-qa/resources/error-playbook.md +98 -0
  230. package/skills/oma-qa/resources/execution-protocol.md +169 -0
  231. package/skills/oma-qa/resources/iso-quality.md +82 -0
  232. package/skills/oma-qa/resources/verify-ship-protocol.md +116 -0
  233. package/skills/oma-recap/SKILL.md +245 -0
  234. package/skills/oma-recap/resources/output-formats.md +83 -0
  235. package/skills/oma-refactor/SKILL.md +184 -0
  236. package/skills/oma-refactor/resources/definition.md +108 -0
  237. package/skills/oma-refactor/resources/governance.md +33 -0
  238. package/skills/oma-refactor/resources/hotspots.py +44 -0
  239. package/skills/oma-refactor/resources/measurement.md +93 -0
  240. package/skills/oma-scholar/SKILL.md +276 -0
  241. package/skills/oma-scholar/config/scholar-config.yaml +79 -0
  242. package/skills/oma-scholar/resources/api-endpoints.md +174 -0
  243. package/skills/oma-scholar/resources/checklist.md +92 -0
  244. package/skills/oma-scholar/resources/execution-protocol.md +224 -0
  245. package/skills/oma-scholar/resources/fallback-providers.md +143 -0
  246. package/skills/oma-scholar/resources/setup-openalex.md +85 -0
  247. package/skills/oma-scholar/resources/sidecar-spec.md +341 -0
  248. package/skills/oma-scholar/resources/upstream-spec-cache.md +972 -0
  249. package/skills/oma-scm/SKILL.md +103 -0
  250. package/skills/oma-scm/resources/cm-operations.md +56 -0
  251. package/skills/oma-scm/resources/codeowners-playbook.md +45 -0
  252. package/skills/oma-scm/resources/conventional-commits.md +108 -0
  253. package/skills/oma-scm/resources/merge-risk.md +76 -0
  254. package/skills/oma-scm/resources/onboarding-risk-signals.md +71 -0
  255. package/skills/oma-search/SKILL.md +125 -0
  256. package/skills/oma-search/resources/checklist.md +36 -0
  257. package/skills/oma-search/resources/error-playbook.md +66 -0
  258. package/skills/oma-search/resources/examples.md +80 -0
  259. package/skills/oma-search/resources/execution-protocol.md +86 -0
  260. package/skills/oma-search/resources/intent-rules.md +47 -0
  261. package/skills/oma-search/resources/trust-registry.md +53 -0
  262. package/skills/oma-security/SKILL.md +172 -0
  263. package/skills/oma-security/resources/artex.md +108 -0
  264. package/skills/oma-security/resources/ci.md +134 -0
  265. package/skills/oma-security/resources/cisco-source.md +108 -0
  266. package/skills/oma-security/resources/deepsec-config.md +45 -0
  267. package/skills/oma-security/resources/deepsec-matchers.md +35 -0
  268. package/skills/oma-security/resources/deepsec-scanning.md +45 -0
  269. package/skills/oma-security/resources/deepsec-setup.md +41 -0
  270. package/skills/oma-security/resources/findings-contract.md +408 -0
  271. package/skills/oma-security/resources/mcp-scanning.md +122 -0
  272. package/skills/oma-security/resources/skill-scanning.md +106 -0
  273. package/skills/oma-security/resources/validation.md +71 -0
  274. package/skills/oma-skill-creation/SKILL.md +84 -0
  275. package/skills/oma-skill-creation/resources/prompt-evaluation.md +36 -0
  276. package/skills/oma-skill-creation/resources/ssl-lite-template.md +108 -0
  277. package/skills/oma-skill-creation/resources/validation-checklist.md +101 -0
  278. package/skills/oma-slide/SKILL.md +277 -0
  279. package/skills/oma-slide/resources/animation-patterns.md +245 -0
  280. package/skills/oma-slide/resources/assets/deck-stage.js +514 -0
  281. package/skills/oma-slide/resources/assets/viewport-base.css +257 -0
  282. package/skills/oma-slide/resources/canva-integration.md +203 -0
  283. package/skills/oma-slide/resources/checklist.md +46 -0
  284. package/skills/oma-slide/resources/design-doctrine.md +260 -0
  285. package/skills/oma-slide/resources/fixed-stage.md +232 -0
  286. package/skills/oma-slide/resources/generation-protocol.md +393 -0
  287. package/skills/oma-slide/resources/native-pptx.md +84 -0
  288. package/skills/oma-slide/resources/selection-index.json +461 -0
  289. package/skills/oma-slide/resources/style-presets.LICENSE +10 -0
  290. package/skills/oma-slide/resources/style-presets.md +520 -0
  291. package/skills/oma-tf-infra/SKILL.md +201 -0
  292. package/skills/oma-tf-infra/resources/checklist.md +53 -0
  293. package/skills/oma-tf-infra/resources/cost-optimization.md +574 -0
  294. package/skills/oma-tf-infra/resources/error-playbook.md +68 -0
  295. package/skills/oma-tf-infra/resources/examples.md +38 -0
  296. package/skills/oma-tf-infra/resources/execution-protocol.md +129 -0
  297. package/skills/oma-tf-infra/resources/iso-42001-infra.md +229 -0
  298. package/skills/oma-tf-infra/resources/multi-cloud-examples.md +241 -0
  299. package/skills/oma-tf-infra/resources/policy-testing-examples.md +332 -0
  300. package/skills/oma-translation/SKILL.md +229 -0
  301. package/skills/oma-translation/resources/anti-ai-patterns.md +104 -0
  302. package/skills/oma-translation/resources/lang/_template.md +73 -0
  303. package/skills/oma-translation/resources/lang/en.md +123 -0
  304. package/skills/oma-translation/resources/lang/ja.md +274 -0
  305. package/skills/oma-translation/resources/lang/ko.md +228 -0
  306. package/skills/oma-translation/resources/lang/zh.md +285 -0
  307. package/skills/oma-translation/resources/style-skills.md +104 -0
  308. package/skills/oma-translation/resources/translation-rubric.md +126 -0
  309. package/skills/oma-video/SKILL.md +229 -0
  310. package/skills/oma-video/config/video-config.yaml +60 -0
  311. package/skills/oma-video/resources/checklist.md +26 -0
  312. package/skills/oma-video/resources/execution-protocol.md +122 -0
  313. package/skills/oma-video/resources/existing-media.md +185 -0
  314. package/skills/oma-video/resources/hyperframes-authoring/README.md +44 -0
  315. package/skills/oma-video/resources/hyperframes-authoring/demo.md +31 -0
  316. package/skills/oma-video/resources/hyperframes-authoring/explainer.md +10 -0
  317. package/skills/oma-video/resources/hyperframes-authoring/shorts.md +10 -0
  318. package/skills/oma-video/resources/motion-principles.md +81 -0
  319. package/skills/oma-video/resources/mpt/driver.py +301 -0
  320. package/skills/oma-video/resources/prompt-tips.md +75 -0
  321. package/skills/oma-video/resources/script-schema.md +81 -0
  322. package/skills/oma-video/resources/sound-design.md +127 -0
  323. package/skills/oma-video/resources/strudel/package.json +11 -0
  324. package/skills/oma-video/resources/strudel/page.html +87 -0
  325. package/skills/oma-video/resources/strudel/render.mjs +295 -0
  326. package/skills/oma-video/resources/vendor-matrix.md +124 -0
  327. package/skills/oma-voice/SKILL.md +249 -0
  328. package/skills/oma-voice/config/voice-config.yaml +30 -0
  329. package/skills/oma-voice/resources/audio-processing.md +119 -0
  330. package/skills/oma-voice/resources/checklist.md +47 -0
  331. package/skills/oma-voice/resources/execution-protocol.md +215 -0
  332. package/skills/oma-voice/resources/prompt-tips.md +43 -0
  333. package/skills/oma-voice/resources/voice-matrix.md +51 -0
  334. package/skills/oma-voice/resources/voicestudio.md +87 -0
@@ -0,0 +1,299 @@
1
+ ---
2
+ otel_semconv: "1.43.0 (2026-07)"
3
+ ---
4
+
5
+ # L4 Transport Layer Observability
6
+
7
+ > **DISAMBIGUATION; read before proceeding.**
8
+ >
9
+ > This file covers **observing the OSI Layer 4 (TCP/UDP/QUIC) transport in your application systems**;
10
+ > retransmits, RTT, connection lifecycle, eBPF-based socket instrumentation, and QUIC/HTTP3 semantics.
11
+ >
12
+ > This file is **NOT** about the observability pipeline transport:
13
+ > - `../transport/udp-statsd-mtu.md`; StatsD payload sizing over UDP
14
+ > - `../transport/otlp-grpc-vs-http.md`; OTLP exporter protocol choice
15
+ > - `../transport/collector-topology.md`; OTel Collector deployment topologies
16
+ > - `../transport/sampling-recipes.md`; tail/head sampling strategies
17
+ >
18
+ > The word "transport" is overloaded. When a cross-reference says `transport/`, it refers to the
19
+ > observability pipeline. When it says "L4", "TCP/UDP/QUIC", or this filename, it refers to this file.
20
+
21
+ ---
22
+
23
+ ## 1. Scope
24
+
25
+ OSI Layer 4 observability for production systems: TCP, UDP, QUIC/HTTP3, eBPF auto-instrumentation,
26
+ and connection lifecycle. Out of scope: L5 session (gRPC/WebSocket → L7), L6 full TLS inspection
27
+ (use Wireshark/vendor tooling), security-focused eBPF (Cilium Tetragon/Falco → security skill).
28
+ See `../standards.md §5` for the authoritative OSI boundary decision.
29
+
30
+ ---
31
+
32
+ ## 2. L4 Semconv (OTel)
33
+
34
+ Source: <https://opentelemetry.io/docs/specs/semconv/attributes-registry/network/>
35
+
36
+ | Attribute | Values | Stability | Notes |
37
+ |-----------|--------|-----------|-------|
38
+ | `network.transport` | `tcp`, `udp`, `unix`, `pipe`, `quic` | **Stable** | Set on spans and metrics describing a socket |
39
+ | `network.protocol.name` | `http`, `grpc`, `amqp`, … | **Stable** | Application protocol over the transport |
40
+ | `network.protocol.version` | `1.1`, `2`, `3` | **Stable** | `3` = HTTP/3 over QUIC |
41
+ | `network.peer.address` | IP or hostname | **Stable** | Apply IP-masking before retention; `../signals/privacy.md §IP addresses` |
42
+ | `network.connection.state` | `established`, `close_wait`, … | **Development** | Do not build SLOs against this; schema may change |
43
+ | `network.connection.type` | `wifi`, `cell`, … | **Development** | Mobile/RUM only; flag in production use |
44
+
45
+ `network.connection.*` attributes are Development tier (`../standards.md §3`). Use them in test
46
+ environments and tolerate breaking changes before promoting to production dashboards.
47
+
48
+ ---
49
+
50
+ ## 3. TCP Observability
51
+
52
+ ### 3.1 Key Metrics
53
+
54
+ | Metric | Type | Measures | Source |
55
+ |--------|------|----------|--------|
56
+ | `tcp_retransmits_total` | Counter | Retransmit segments; rate spike = congestion or loss | hostmetrics, eBPF |
57
+ | `tcp_rtt_ms` (p50/p99) | Histogram | Round-trip time per connection | eBPF socket stats |
58
+ | `tcp_active_connections` | Gauge | In-flight established connections; growth = pool leak | `/proc/net/sockstat` |
59
+ | `tcp_time_wait_connections` | Gauge | TIME_WAIT count; high under short-lived connection churn | `/proc/net/sockstat` |
60
+ | `tcp_syn_queue_drops_total` | Counter | SYN queue overflow; SYN flood or low `tcp_max_syn_backlog` | netlink / eBPF |
61
+ | `tcp_close_wait_connections` | Gauge | CLOSE_WAIT growth = server not closing half-open connections | hostmetrics |
62
+
63
+ ```promql
64
+ # Retransmit rate per node
65
+ rate(tcp_retransmits_total[5m])
66
+
67
+ # p99 RTT per service
68
+ histogram_quantile(0.99, sum by (le, service_name) (rate(tcp_rtt_ms_bucket[5m])))
69
+
70
+ # TIME_WAIT pressure alert
71
+ tcp_time_wait_connections > 10000
72
+ ```
73
+
74
+ ### 3.2 Collection
75
+
76
+ | Method | Mechanism | Privilege |
77
+ |--------|-----------|-----------|
78
+ | OTel hostmetrics receiver | `/proc/net/tcp`, `/proc/net/snmp`, `/proc/net/sockstat` | Root or CAP_SYS_PTRACE |
79
+ | eBPF socket filter | kprobes on `tcp_retransmit_skb`, `tcp_sendmsg` | CAP_BPF (kernel ≥ 5.8) or root |
80
+ | Linux netlink SOCK_DIAG | TCP socket state enumeration | Unprivileged in most distros |
81
+
82
+ ### 3.3 Common Pitfalls
83
+
84
+ **Connection pool exhaustion.** High `tcp_active_connections` with high application latency but no TCP errors
85
+ points to pool queue saturation, not network failure. Cross-ref: `../signals/traces.md §DB connection pool patterns`.
86
+
87
+ **SYN cookie activation.** `tcp_syn_queue_drops_total` > 0 in normal traffic means `tcp_max_syn_backlog`
88
+ is too low. SYN cookies mask drop counters in `/proc/net/snmp`; use eBPF for reliable counts.
89
+
90
+ **TIME_WAIT accumulation.** Short-lived HTTP/1.1 connections exhaust ephemeral ports. Remediation:
91
+ `SO_REUSEADDR`, wider `ip_local_port_range`, or HTTP/2 multiplexing.
92
+
93
+ ---
94
+
95
+ ## 4. UDP Observability
96
+
97
+ | Metric | Source | Measures |
98
+ |--------|--------|----------|
99
+ | `udp_datagrams_sent_total` | `/proc/net/snmp` | Baseline send throughput |
100
+ | `udp_receive_buffer_errors_total` | `/proc/net/snmp` `RcvbufErrors` | Socket buffer overflow; increase `net.core.rmem_max` |
101
+ | `udp_no_ports_total` | `/proc/net/snmp` `NoPorts` | Drop because no listener on destination port |
102
+ | `udp_checksum_errors_total` | `/proc/net/snmp` `InCsumErrors` | Corrupted datagrams; NIC or path corruption |
103
+
104
+ OTel hostmetrics `network` scraper covers these counters automatically.
105
+ Cross-ref: `../transport/udp-statsd-mtu.md` for StatsD payload sizing constraints that affect
106
+ `udp_receive_buffer_errors_total` in high-throughput StatsD pipelines.
107
+
108
+ ---
109
+
110
+ ## 5. eBPF-Based L4 Observability
111
+
112
+ eBPF instruments the Linux kernel without application code changes. Three tools are in scope.
113
+
114
+ ### 5.1 Tool Comparison
115
+
116
+ | Tool | CNCF Status | Primary signal | OTel output | Key use case |
117
+ |------|-------------|----------------|-------------|--------------|
118
+ | **Grafana Beyla** | CNCF Incubating (2024) | HTTP/gRPC traces + Go/C++ runtime | OTLP natively | Zero-code HTTP/gRPC auto-instrumentation via uprobes; also emits `tcp_rtt_us` histograms. Requires kernel ≥ 5.2 with BTF enabled |
119
+ | **Pixie** | CNCF Sandbox | Multi-protocol traces + L4 metrics via PxL | OTLP via `px-export` | Scriptable cluster-wide eBPF; auto-discovers pods |
120
+ | **Parca** | CNCF Sandbox | Continuous CPU + off-CPU flame graphs | pprof-compatible | Whole-cluster profiling; cross-ref `../signals/profiles.md` |
121
+
122
+ Sources: <https://grafana.com/oss/beyla/>, <https://px.dev/>, <https://parca.dev/>
123
+
124
+ **Out of scope: Cilium Tetragon.** Security-focused runtime policy enforcement (syscall filtering, process
125
+ exec tracing) belongs to a security skill. Falco is the comparable alternative for kernel security events.
126
+
127
+ ### 5.2 Kernel and Privilege Requirements
128
+
129
+ | Requirement | Detail |
130
+ |-------------|--------|
131
+ | Minimum kernel | ≥ 4.14 for most eBPF features; ≥ 5.8 for CAP_BPF without root |
132
+ | Capabilities | CAP_BPF + CAP_PERFMON (kernel ≥ 5.8) or root on older kernels |
133
+ | GKE Autopilot | eBPF DaemonSets disallowed; use Standard node pools |
134
+ | EKS Fargate | No DaemonSet support; eBPF unavailable |
135
+ | AKS | Supported on standard node pools; verify with `uname -r` |
136
+
137
+ ```bash
138
+ # Preflight kernel check (run in initContainer or node admission)
139
+ uname -r # must be >= 4.14, ideally >= 5.8
140
+ capsh --print | grep cap_bpf
141
+
142
+ # Beyla deploy via Helm
143
+ helm repo add grafana https://grafana.github.io/helm-charts
144
+ helm install beyla grafana/beyla --namespace beyla --create-namespace
145
+ ```
146
+
147
+ ### 5.3 Pixie PxL (Conceptual)
148
+
149
+ ```python
150
+ # Conceptual PxL — TCP retransmit counts per pod
151
+ import px
152
+ df = px.DataFrame(table='tcp_retransmits', start_time='-5m')
153
+ df = df.groupby(['pod', 'namespace']).agg(retransmits=('retransmits', px.sum))
154
+ px.display(df)
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 6. Connection Lifecycle Observability
160
+
161
+ ```
162
+ LISTEN → SYN_RECEIVED → ESTABLISHED → (data transfer)
163
+ → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED (active close)
164
+ → CLOSE_WAIT → LAST_ACK → CLOSED (passive close)
165
+ ```
166
+
167
+ | State | Observable signal | Tooling |
168
+ |-------|------------------|---------|
169
+ | SYN → ESTABLISHED | Setup latency (SYN-ACK RTT) | eBPF `tcp_v4_connect` kprobe |
170
+ | ESTABLISHED idle | Keepalive probe success/failure | `/proc/net/tcp` + hostmetrics |
171
+ | FIN_WAIT / TIME_WAIT | TIME_WAIT gauge; ephemeral port pressure | hostmetrics `/proc/net/sockstat` |
172
+ | CLOSE_WAIT growth | Server not releasing half-open connections | hostmetrics + eBPF alert |
173
+
174
+ **TLS handshake boundary.** TLS sits at L4/L5. `tls.*` semconv is Development tier; do not build
175
+ production SLOs on it. Use eBPF uprobes on OpenSSL/BoringSSL or vendor tooling for handshake latency.
176
+ Cross-ref: `../signals/privacy.md §TLS context`.
177
+
178
+ **Keepalive tuning.** TCP keepalive interval must be shorter than the upstream LB idle timeout
179
+ (AWS ALB: 60 s; AWS NLB: 350 s; GCP CLB: 600 s default). Mismatches cause silent connection resets.
180
+
181
+ **WebSocket and gRPC streams**; full lifecycle coverage is deferred to L7 (`../standards.md §5`).
182
+ Long-lived streams mitigate TIME_WAIT accumulation but introduce reconnection-storm risk on restart.
183
+
184
+ ---
185
+
186
+ ## 7. QUIC / HTTP/3 Transport Semantics
187
+
188
+ QUIC (RFC 9000) is a UDP-based transport with built-in TLS 1.3, stream multiplexing, and connection
189
+ migration. HTTP/3 (RFC 9114) runs exclusively over QUIC.
190
+
191
+ ### 7.1 Observability Differences from TCP
192
+
193
+ | TCP concept | QUIC equivalent | Observability impact |
194
+ |-------------|----------------|----------------------|
195
+ | 3-way SYN handshake | 1-RTT or 0-RTT | No SYN/FIN to observe; connection state is QUIC-internal |
196
+ | 5-tuple for correlation | Connection ID (opaque bytes) | Connection ID survives NAT rebinding; log it on establishment |
197
+ | `/proc/net/tcp` retransmit | QUIC loss recovery (packet number gaps) | Not visible in proc; requires QUIC-aware tooling |
198
+ | TCP FIN / RST | QUIC GOAWAY / CONNECTION_CLOSE frames | Surfaced in Envoy access logs |
199
+ | HTTP/2 HOL blocking | Per-stream flow control; no HOL blocking | Stream errors do not block other streams |
200
+
201
+ ### 7.2 OTel Semconv for QUIC
202
+
203
+ ```
204
+ network.transport: quic
205
+ network.protocol.name: http
206
+ network.protocol.version: "3"
207
+ ```
208
+
209
+ ### 7.3 0-RTT Observability
210
+
211
+ 0-RTT sends data before the handshake completes. Emit a span attribute or metric label
212
+ distinguishing 0-RTT from 1-RTT connections to detect replay exposure on non-idempotent endpoints.
213
+
214
+ ### 7.4 Firewall and Enterprise Deployment Considerations
215
+
216
+ Enterprise networks frequently block outbound UDP 443 and UDP 8443 because legacy firewall rules assume HTTP(S) is TCP-only. QUIC (and therefore HTTP/3) rides on UDP and silently falls back to HTTP/1.1 or HTTP/2 when UDP is blocked; the fallback is invisible to application telemetry unless you instrument it.
217
+
218
+ Detect QUIC blocking:
219
+ - Emit `network.transport` attribute on client spans; compare ratio of `quic` vs `tcp` across deployment zones
220
+ - CDN access logs (Cloudflare, Fastly) expose QUIC negotiation outcome per edge
221
+ - Alert when `quic` ratio drops below baseline (for example, office network where UDP 443 is firewalled)
222
+
223
+ Action: coordinate with network security to allowlist UDP 443/8443 for validated destinations; document the fallback behavior so regressions do not silently halve transport performance.
224
+
225
+ ### 7.5 Tool Support (2026)
226
+
227
+ | Tool | QUIC support |
228
+ |------|-------------|
229
+ | Envoy 1.29+ | QUIC upstream and downstream; stats in admin API and access logs |
230
+ | Istio 1.22+ | QUIC upstream via Envoy; mTLS over QUIC experimental; see `layers/mesh.md` |
231
+ | Grafana Beyla | HTTP/3 uprobes in roadmap; verify release notes before QUIC-heavy deployments |
232
+ | Cloudflare QUIC telemetry | <https://blog.cloudflare.com/tag/quic/>; public connection migration + 0-RTT metrics |
233
+ | Google QUIC metrics | <https://research.google>; packet loss recovery timing |
234
+
235
+ ---
236
+
237
+ ## 8. OS-Level Integration
238
+
239
+ | Source | Signal | Cross-ref |
240
+ |--------|--------|-----------|
241
+ | systemd-journal / syslog | TCP resets, netfilter drops, NIC errors | `../signals/logs.md §OS-level log sources` |
242
+ | cgroup v2 net accounting | Per-container byte/packet counters | `../transport/collector-topology.md §kubernetes` |
243
+ | nf_conntrack | NAT and stateful firewall connection table size | Requires `nf_conntrack` kernel module |
244
+
245
+ ---
246
+
247
+ ## 9. Matrix Cells: L4 Row
248
+
249
+ From `../matrix.md §L4-transport`:
250
+
251
+ | Cell | Symbol | Rationale |
252
+ |------|--------|-----------|
253
+ | L4 × cross-application × traces | PARTIAL | TCP is not trace-native; log socket 5-tuple for post-hoc correlation to L7 spans only |
254
+ | L4 × * × profiles | PASS | eBPF off-CPU profiling via Parca captures kernel socket overhead and network-wait; pprof output |
255
+ | L4 × privacy (all boundaries) | PARTIAL | Source/destination IPs in TCP logs are PII (GDPR Art. 4(1)); apply masking at pipeline ingress |
256
+ | L4 × SLO and L4 × release | N/A | SLO budgets and release markers are application-layer; TCP health is infra-SLI fallback only |
257
+
258
+ ---
259
+
260
+ ## 10. Anti-Patterns: Candidates for `../anti-patterns.md §Section H`
261
+
262
+ **H-L4-1: Connection pool observability absent.** Pool queue saturation is invisible in TCP metrics
263
+ alone; neither retransmit rate nor error rate spikes until the pool times out. Instrument pool size,
264
+ wait time, and timeout counters at the application layer. Severity: HIGH.
265
+
266
+ **H-L4-2: QUIC adoption without HTTP/3 trace tooling validation.** Enabling QUIC without verifying
267
+ that OTel SDKs emit `network.transport: quic` and `network.protocol.version: "3"` creates a
268
+ transport-layer blind spot. Add a canary assertion in staging before production rollout. Severity: HIGH.
269
+
270
+ **H-L4-3: eBPF agent deployed without kernel/capability preflight.** Beyla or Pixie DaemonSets on
271
+ incompatible kernels fail silently with no operator-visible error. Add an `initContainer` asserting
272
+ kernel version and CAP_BPF presence; fail non-zero if requirements are unmet. Severity: HIGH.
273
+
274
+ **H-L4-4: WebSocket reconnection storm undetected.** Server restart without graceful WebSocket drain
275
+ causes simultaneous mass-reconnect. TCP SYN counts look like normal new connections. Instrument client
276
+ reconnection counters and alert on rate spikes; implement exponential backoff + jitter. Severity: MEDIUM.
277
+
278
+ ---
279
+
280
+ ## 11. References
281
+
282
+ - OTel network attributes registry: <https://opentelemetry.io/docs/specs/semconv/attributes-registry/network/>
283
+ - Grafana Beyla: <https://grafana.com/oss/beyla/>
284
+ - Pixie (CNCF Sandbox): <https://px.dev/>
285
+ - Parca (CNCF Sandbox): <https://parca.dev/>
286
+ - QUIC RFC 9000: <https://www.rfc-editor.org/rfc/rfc9000>
287
+ - HTTP/3 RFC 9114: <https://www.rfc-editor.org/rfc/rfc9114>
288
+ - Cloudflare QUIC telemetry: <https://blog.cloudflare.com/tag/quic/>
289
+ - OTel hostmetrics receiver: <https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver>
290
+ - Linux `/proc/net/tcp` format: <https://www.kernel.org/doc/html/latest/networking/proc_net_tcp.html>
291
+ - Semconv stability tiers: `../standards.md §3`
292
+ - OSI boundary decisions: `../standards.md §5`
293
+ - Coverage matrix (L4 row): `../matrix.md §L4-transport`
294
+ - IP masking rules: `../signals/privacy.md §IP addresses`
295
+ - Profiling (eBPF/Parca): `../signals/profiles.md`
296
+ - OS-level logs: `../signals/logs.md §OS-level log sources`
297
+ - Collector Kubernetes topology: `../transport/collector-topology.md`
298
+ - StatsD UDP sizing: `../transport/udp-statsd-mtu.md`
299
+ - Service mesh + QUIC: `layers/mesh.md`
@@ -0,0 +1,359 @@
1
+ ---
2
+ otel_semconv: "1.43.0 (2026-07)"
3
+ ---
4
+
5
+ # Crash Analytics: L7 Application Layer
6
+
7
+ ## 1. Scope and Why Separate from RUM
8
+
9
+ Crash analytics is not RUM. The distinction matters for pipeline design, KPI selection, and vendor choice.
10
+
11
+ | Dimension | RUM | Crash Analytics |
12
+ |-----------|-----|----------------|
13
+ | Session type | Successful sessions (UX measured) | Abnormal terminations (failed sessions) |
14
+ | Primary KPI | Core Web Vitals / INP / startup time | Crash-Free Rate (CFR), ANR Rate |
15
+ | Pipeline | Beacon / SDK event stream → backend | Crash report queued on device → uploaded on restart |
16
+ | Symbolication | N/A (JS source maps for errors only) | dSYM / ProGuard / R8 / Dart symbols required |
17
+ | Offline behavior | Events dropped if offline | Report queued locally; uploaded on next launch |
18
+
19
+ This file documents the common crash pipeline shared across mobile native, web, and backend uncaught exceptions. Platform-specific symbolication flows are cross-referenced:
20
+
21
+ - Mobile native detail: `mobile-rum.md §Crash + ANR`
22
+ - Web JS error detail: `web-rum.md §Error Boundary and window.onerror`
23
+
24
+ Platforms in scope: iOS native, Android native, React Native, Flutter, web (JS), backend uncaught exceptions.
25
+
26
+ ---
27
+
28
+ ## 2. Core Metrics
29
+
30
+ ### Crash-Free Rate (CFR)
31
+
32
+ CFR is the primary stability KPI for mobile and web applications.
33
+
34
+ ```
35
+ Session CFR = (sessions without crash) / (total sessions)
36
+ User CFR = (users not experiencing any crash) / (total active users)
37
+ ```
38
+
39
+ Targets by application category:
40
+
41
+ | Category | Minimum Session CFR | Notes |
42
+ |----------|--------------------|----|
43
+ | Consumer mobile | 99.5% | Google Play bad-behavior threshold: < 99.0% triggers review |
44
+ | Enterprise / B2B mobile | 99.7% | Internal SLA baseline |
45
+ | Regulated (fintech, health) | 99.9%+ | Near-zero tolerance; compliance-linked |
46
+ | Web SPA | 99.8%+ | JS errors below `Error Boundary` counted as crashes |
47
+
48
+ ### ANR Rate and Hang Rate
49
+
50
+ Near-crash experiences that degrade user perception without a fatal signal:
51
+
52
+ - **Google Play user-perceived ANR rate** = daily active users experiencing at least one user-perceived ANR / daily active users. The overall bad-behavior threshold is 0.47%; it is not an ANR-events/session threshold. Input dispatch typically times out at 5 s. Broadcast receiver timeouts are 10 s (foreground) / 60 s (background) on Android 13 and lower, and 10–20 s / 60–120 s on Android 14+, depending on CPU starvation. Keep any custom session-based stall metric separate. Sources: <https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs> and <https://developer.android.com/google/play/vitals>.
53
+ - **iOS Hang Rate** = main-thread hangs > 250 ms / sessions. Visible in Xcode Organizer → Hangs and via MetricKit `MXHangDiagnostic` (iOS 14+).
54
+
55
+ ### Supporting Metrics
56
+
57
+ | Metric | Definition |
58
+ |--------|-----------|
59
+ | Affected Users % | `(users who hit crash X) / (DAU)`; scope of a specific crash group |
60
+ | Time-to-Symbolication | Duration from crash report ingestion to readable stack trace |
61
+ | Crash Volume | Raw crash event count; use with CFR, not instead of it |
62
+
63
+ ---
64
+
65
+ ## 3. Platform-Specific Symbolication Pipelines
66
+
67
+ Each platform requires a distinct artifact upload strategy. Failure to automate upload results in unreadable stack traces in production.
68
+
69
+ | Platform | Symbol artifact | Upload trigger | Key complexity |
70
+ |----------|----------------|---------------|----------------|
71
+ | iOS | dSYM bundle (per build UUID) | Xcode archive → CI upload | Bitcode deprecated in Xcode 14; no re-symbolication |
72
+ | Android (JVM) | `mapping.txt` (ProGuard / R8) | Gradle task post-minify | Must match exact build; obfuscation mapping is one-way |
73
+ | Android (NDK) | `.so` files with debug info stripped separately | CI symbol upload | Requires `--build-id` linkage; `.so` from APK lacks debug info |
74
+ | React Native | JS sourcemap + iOS dSYM + Android mapping.txt | Three uploads per release | Hermes bytecode adds an extra sourcemap layer |
75
+ | Flutter | Dart symbol files from `--split-debug-info` | CI upload after `flutter build` | Both iOS dSYM and Android mapping still needed for platform channels |
76
+ | Web | JS sourcemap | CI deploy pipeline | `window.onerror` + `onunhandledrejection`; React/Vue Error Boundary |
77
+ | Backend | N/A (source available) | OTel `exception.*` attributes | Sentry Python/Node/Ruby SDK for crash-like grouping |
78
+
79
+ ### iOS
80
+
81
+ dSYM (Debug Symbols) is the binary artifact that maps obfuscated addresses to function names and line numbers. Each Xcode build generates a UUID-stamped dSYM. The UUID must match the crash report exactly; re-using a dSYM from a different build produces wrong or partial symbolication.
82
+
83
+ Bitcode was deprecated in Xcode 14. Prior to Xcode 14, Apple re-compiled bitcode for App Store distribution, requiring vendors (Firebase, Sentry, Datadog) to download the re-compiled dSYM from App Store Connect via the API. Xcode 14+ removes this complexity; the Xcode-generated dSYM is final.
84
+
85
+ Apple App Store Connect crash API: Firebase Crashlytics, Sentry, and Datadog can pull crash data from App Store Connect for devices where the user has opted into analytics sharing.
86
+
87
+ ### Android
88
+
89
+ ProGuard / R8 generates `mapping.txt` which maps obfuscated class/method names back to source. The NDK layer produces native `.so` libraries; the release variant strips debug info into a separate symbol file. Upload both `mapping.txt` and NDK symbol `.so` files for full stack traces covering Java/Kotlin and C++ frames.
90
+
91
+ Play Console crashes API: available for complementary data, not a replacement for vendor SDK.
92
+
93
+ ### React Native
94
+
95
+ Three separate symbol artifacts per release:
96
+
97
+ 1. JS bundle sourcemap (Metro bundler output)
98
+ 2. iOS dSYM (for native frames)
99
+ 3. Android `mapping.txt` (for native frames)
100
+
101
+ Hermes JS engine compiles JS to bytecode. The sourcemap chain is: Hermes bytecode address → JS sourcemap → original TS/JS source. Some vendors (Sentry, Datadog) have Hermes-aware symbolication; verify vendor documentation before assuming standard sourcemap upload suffices.
102
+
103
+ ### Flutter
104
+
105
+ `flutter build --split-debug-info=<dir> --obfuscate` produces Dart symbol files. These must be uploaded to the crash vendor's symbol storage. Platform-channel crashes (e.g., method channel calls into Kotlin/Swift) still require iOS dSYM and Android `mapping.txt` in addition to Dart symbols.
106
+
107
+ ### Web
108
+
109
+ Cross-reference `web-rum.md §Error tracking`. Key patterns:
110
+ - `window.onerror` catches uncaught synchronous errors
111
+ - `window.addEventListener('unhandledrejection', ...)` catches unhandled Promise rejections
112
+ - React `ErrorBoundary`, Vue `app.config.errorHandler`, Svelte `<svelte:component this={ErrorBoundary}>` prevent full-page crashes and capture component-tree context
113
+
114
+ ### Backend
115
+
116
+ Backend services rarely produce binary crash reports. OTel `exception.*` attributes (Stable semconv) capture the exception type, message, and stacktrace on spans. Sentry Python / Node.js / Ruby SDKs provide crash-like aggregation with grouping, release tracking, and breadcrumbs that mirror the mobile crash experience.
117
+
118
+ ---
119
+
120
+ ## 4. Release Tracking Integration
121
+
122
+ Release tracking is the most commonly omitted step in crash pipelines. Without it, a crash spike cannot be correlated to a specific deploy.
123
+
124
+ **CI must set `service.version` on every build.** The OTel semconv `service.version` attribute (Stable) is the canonical release identifier. All crash events, spans, and metrics must carry this attribute.
125
+
126
+ **Symbol upload must be automated per release.** Manual upload is an anti-pattern (see Section 12). Use:
127
+
128
+ - Sentry CLI: `sentry-cli releases propose-version` + `sentry-cli releases files upload-sourcemaps`
129
+ - Fastlane plugin: `fastlane-plugin-sentry` for iOS/Android
130
+ - Gradle plugin: `io.sentry.android.gradle` for Android automatic upload
131
+ - Firebase: `firebase crashlytics:symbols:upload` for dSYM (Fastlane or Gradle)
132
+
133
+ **Release marker events** are structured log records written at deploy time (see `../../boundaries/release.md`). Crash vendors use these to draw vertical lines on CFR trend charts, enabling before/after comparison. Flagger and Argo Rollouts canary analysis can use CFR as a promotion/rollback gate signal; cross-reference `../../boundaries/release.md §Canary analysis`.
134
+
135
+ ---
136
+
137
+ ## 5. Vendor Comparison Matrix (as of 2026-Q2)
138
+
139
+ Cross-reference `../../vendor-categories.md §Category (j): Crash Analytics`.
140
+
141
+ | Vendor | iOS | Android | Web JS | Backend | OSS/Free | Key differentiator |
142
+ |--------|-----|---------|--------|---------|----------|--------------------|
143
+ | Firebase Crashlytics | Yes | Yes | No | No | Free | Google-owned; zero cost; mobile-only; dSYM auto-upload via Xcode plugin |
144
+ | Sentry | Yes | Yes | Yes | Yes | OSS + SaaS | Full-stack (mobile + web + backend); release tracking; OTel trace correlation |
145
+ | Bugsnag | Yes | Yes | Yes | Yes | Commercial | Stability score; smart grouping noise reduction; breadcrumb API |
146
+ | Embrace | Yes | Yes | No | No | Commercial | ANR/startup crash specialist; session replay; network body capture |
147
+ | Datadog Error Tracking | Yes | Yes | Yes | Yes | Commercial | Native RUM + APM integration; unified with Datadog traces |
148
+
149
+ **Key differentiators:**
150
+
151
+ - **Firebase Crashlytics**: best choice when budget is zero and stack is mobile-only. No web or backend support. Google ecosystem (Analytics, BigQuery export).
152
+ - **Sentry**: strongest cross-platform story. The only vendor in the matrix with meaningful OSS options. Release health dashboard is the most mature. OTel `trace_id` in crash context enables backend span lookup.
153
+ - **Bugsnag**: stability metrics and smart grouping reduce alert fatigue. Breadcrumb API is the most flexible for custom event recording.
154
+ - **Embrace**: purpose-built for mobile ANR, startup crash, and user-journey session replay. Not a general-purpose crash tool.
155
+ - **Datadog Error Tracking**: optimal when Datadog APM is already in use. RUM + APM linkage is native; no separate SDK integration.
156
+
157
+ ---
158
+
159
+ ## 6. Crash Pipeline Flow
160
+
161
+ ```
162
+ App crashes → crash report generated
163
+ (stack trace + breadcrumbs + device context + user context)
164
+ |
165
+ v
166
+ Queued locally on device (if offline — see mobile-rum.md §offline queuing)
167
+ |
168
+ v
169
+ Uploaded to vendor on next launch or when network available
170
+ |
171
+ v
172
+ Vendor-side symbolication
173
+ (dSYM / ProGuard / sourcemap matched by build UUID / version)
174
+ |
175
+ v
176
+ Deduplication by stack fingerprint
177
+ (vendor groups similar crashes into one issue)
178
+ |
179
+ v
180
+ Aggregation: Affected Users %, Event Count, CFR delta
181
+ |
182
+ v
183
+ Alert + ticket creation
184
+ (PagerDuty / OpsGenie for CFR breach; JIRA / Linear for issue triage)
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 7. Breadcrumbs and Context
190
+
191
+ Breadcrumbs are the sequence of events recorded before the crash. They are the primary debugging context beyond the stack trace.
192
+
193
+ | Category | Examples |
194
+ |----------|---------|
195
+ | User actions | Button taps, navigation events, form submissions |
196
+ | Network calls | HTTP request URL, status code, duration |
197
+ | Log events | Application log statements recorded by SDK |
198
+ | State changes | Authentication events, feature flag changes |
199
+
200
+ Context attached to every crash report:
201
+
202
+ | Field | Source | Notes |
203
+ |-------|--------|-------|
204
+ | `device.model` | OS API | Device model identifier |
205
+ | `os.version` | OS API | OS version string |
206
+ | `service.version` | Build config | Release version; must match symbol upload |
207
+ | `screen_resolution` | OS API | Pixel dimensions |
208
+ | `free_memory_mb` | OS API | Available RAM at crash time |
209
+ | `user.id` | App session | Hash or opaque ID only; see Section 8 |
210
+
211
+ Custom keys (e.g., `order.id`, `tenant.id`, `experiment.variant`) enable correlation with business context. Restrict to non-PII values or apply redaction before send.
212
+
213
+ ---
214
+
215
+ ## 8. Privacy and PII in Crash Reports
216
+
217
+ Stack traces frequently contain PII because exception messages capture method arguments, query strings, and HTTP headers verbatim.
218
+
219
+ **Common PII leaks in crash reports:**
220
+
221
+ - SQL query in exception message containing `user.email` or SSN
222
+ - HTTP response body logged in a network error containing `Authorization: Bearer <token>`
223
+ - URL query parameters with `?email=user@example.com`
224
+ - Custom key set with `user.email` directly
225
+
226
+ **Vendor SDK redaction hooks:**
227
+
228
+ Sentry `beforeSend` callback (JavaScript/TypeScript example):
229
+
230
+ ```typescript
231
+ Sentry.init({
232
+ dsn: "...",
233
+ beforeSend(event) {
234
+ // Strip email from exception values
235
+ if (event.exception?.values) {
236
+ event.exception.values = event.exception.values.map((ex) => ({
237
+ ...ex,
238
+ value: ex.value?.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, "[email]"),
239
+ }));
240
+ }
241
+ // Remove auth headers from request context
242
+ if (event.request?.headers) {
243
+ delete event.request.headers["Authorization"];
244
+ delete event.request.headers["Cookie"];
245
+ }
246
+ return event;
247
+ },
248
+ });
249
+ ```
250
+
251
+ - **Firebase Crashlytics**: use `setCustomKey` with an explicit allowlist; never pass user.email or tokens as custom keys.
252
+ - **Datadog**: `beforeSend` callback mirrors Sentry's pattern; apply to both RUM and Error Tracking initializations.
253
+
254
+ Cross-reference: `../../signals/privacy.md §Crash report redaction` and `../../anti-patterns.md §Section A Privacy`.
255
+
256
+ ---
257
+
258
+ ## 9. CI Integration for Symbol Upload
259
+
260
+ Symbols must never be stored in git. Upload to the vendor on every CI build that produces a release artifact.
261
+
262
+ Conceptual GitHub Actions workflow (adapt per vendor):
263
+
264
+ ```yaml
265
+ # .github/workflows/release.yml (conceptual — adapt version and paths)
266
+ - name: Build iOS release
267
+ run: xcodebuild archive -scheme MyApp -archivePath build/MyApp.xcarchive
268
+
269
+ - name: Upload dSYM to Sentry
270
+ env:
271
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
272
+ SENTRY_ORG: my-org
273
+ SENTRY_PROJECT: my-app-ios
274
+ run: |
275
+ sentry-cli releases propose-version
276
+ sentry-cli upload-dif build/MyApp.xcarchive/dSYMs \
277
+ --include-sources
278
+
279
+ - name: Tag release with service.version
280
+ run: |
281
+ sentry-cli releases new "${GITHUB_REF_NAME}"
282
+ sentry-cli releases set-commits "${GITHUB_REF_NAME}" --auto
283
+ sentry-cli releases finalize "${GITHUB_REF_NAME}"
284
+ ```
285
+
286
+ For Android, replace the dSYM upload step with a Gradle task invocation (`./gradlew :app:uploadSentryProguardMappings`) or `sentry-cli upload-proguard --android`.
287
+
288
+ Cross-reference `../../observability-as-code.md` for observability-as-code patterns and repository structure for symbol upload configuration.
289
+
290
+ ---
291
+
292
+ ## 10. ANR and Hang Detection
293
+
294
+ ANR and hangs are near-crash events that degrade UX without generating a fatal crash report. They require distinct detection and alerting strategies.
295
+
296
+ ### Android ANR
297
+
298
+ - Definition: input-dispatch ANRs typically use a 5 s timeout; broadcast receiver timeouts depend on foreground/background priority and OS version (see §2). A 200 ms stall is not the broadcast ANR threshold.
299
+ - Detection sources:
300
+ - `ApplicationExitInfo` API (Android 11+): query ANR reasons from the OS after the fact.
301
+ - `ANRWatchDog` library: third-party watchdog thread that detects main-thread stalls in-process.
302
+ - Sentry, Embrace, Datadog: vendor SDK ANR detection via watchdog thread.
303
+ - Alert threshold: compare the Google Play user-perceived ANR rate against 0.47% of daily active users. Do not apply that threshold to a custom ANR-events/session series.
304
+
305
+ ### iOS Hang
306
+
307
+ - Definition: main thread blocked for more than 250 ms (Xcode Organizer threshold).
308
+ - Detection sources:
309
+ - Xcode Organizer → Hangs report (aggregated from devices with diagnostic sharing enabled).
310
+ - Sentry App Hang Detection SDK: configurable threshold, default 2 seconds; reports hangs as separate issue type.
311
+ - MetricKit: `MXHangDiagnostic` (iOS 14+) for on-device hang diagnostics.
312
+ - Alert threshold: no Google Play equivalent; apply product-specific target (e.g., < 0.1% of sessions for consumer apps).
313
+
314
+ ---
315
+
316
+ ## 11. Matrix Cross-References (L7 Row)
317
+
318
+ These cells from `../../matrix.md` are directly informed by this file:
319
+
320
+ | Matrix cell | Artifact | Note |
321
+ |-------------|---------|------|
322
+ | L7 × multi-tenant × logs | Per-tenant crash rate segmentation | `tenant.id` as custom key in crash context |
323
+ | L7 × release × traces | Release-tagged crash correlates canary rollback | `service.version` on crash event + span `trace_id` linkage |
324
+ | L7 × privacy × logs | Crash report redaction before send | `beforeSend` hook; allowlist custom keys |
325
+ | L7 × cross-application × traces | Backend `trace_id` in crash context | Sentry / Datadog: attach active `trace_id` to crash report for backend span lookup |
326
+
327
+ ---
328
+
329
+ ## 12. Anti-Patterns
330
+
331
+ Candidates for `../../anti-patterns.md §Section G — Crash Analytics`:
332
+
333
+ | Anti-pattern | Impact | Remediation |
334
+ |-------------|--------|------------|
335
+ | Crash report contains `user.email`, auth tokens, or card numbers without redaction filter | GDPR / PIPA breach; PII in vendor SaaS storage | Implement `beforeSend` allowlist; cross-ref Section 8 |
336
+ | Symbol upload not automated in CI | Stack traces unreadable in production | Add symbol upload step to release pipeline; cross-ref Section 9 |
337
+ | No release marker → cannot correlate deploy to crash spike | Crash spike investigation requires manual git bisect | Set `service.version` on every build; emit release event at deploy |
338
+ | ANR rate unmonitored on Android | Google Play app suppression; degraded store ranking | Monitor Play user-perceived ANRs per daily active user at the 0.47% overall threshold; define custom session metrics separately |
339
+ | Single aggregate CFR target ignoring device-tier or OS-version distribution | p10 device users (low-end hardware) masked by p90 average | Segment CFR by `device.model`, `os.version`, and network type |
340
+ | dSYM stored in git LFS instead of vendor symbol storage | Git LFS cost; symbol-build UUID drift | Use vendor upload; never commit dSYMs |
341
+
342
+ ---
343
+
344
+ ## References
345
+
346
+
347
+
348
+
349
+ ### Primary sources
350
+
351
+ - Firebase Crashlytics: <https://firebase.google.com/docs/crashlytics>
352
+ - Sentry iOS: <https://docs.sentry.io/platforms/apple/>
353
+ - Sentry Android: <https://docs.sentry.io/platforms/android/>
354
+ - Sentry React Native: <https://docs.sentry.io/platforms/react-native/>
355
+ - Sentry Flutter: <https://docs.sentry.io/platforms/flutter/>
356
+ - Xcode Organizer Hangs: <https://developer.apple.com/documentation/xcode/understanding-user-interface-responsiveness>
357
+ - Android ANR: <https://developer.android.com/topic/performance/vitals/anr>
358
+ - Android ApplicationExitInfo: <https://developer.android.com/reference/android/app/ApplicationExitInfo>
359
+ - OTel `exception.*` semconv (Stable): <https://opentelemetry.io/docs/specs/semconv/exceptions/>