)]}'
{
  "commit": "16dca7ae5d3ff896a4db47e1ed6cd50f7ebbf115",
  "tree": "b54cf2cdaf33c6e449e06c2a527dbcde406dce7e",
  "parents": [
    "1bdafd85bb97b331ddd683577f48a5dfa7f4cb49"
  ],
  "author": {
    "name": "Kevin Moore",
    "email": "kevmoo@users.noreply.github.com",
    "time": "Mon Sep 21 08:04:10 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Sep 21 15:04:10 2026 +0000"
  },
  "message": "fix(firehose): keep dart_apitool crash details in logs and sanitize breaking table row (#461)\n\nWhen `dart_apitool` fails to produce `report.json` (for example, when analyzing packages that use Dart 3.13 shorthand factory constructors under `analyzer 10.2.0`), `Health.breakingChangeCheck` previously interpolated the entire raw `stderr` output (including multi-line `ExecutableDeclaration.toString()` dumps and stack traces) directly into `BreakingChange.explanation` alongside `neededVersion: Version(0, 0, 0)`. Because `BreakingChange.toMarkdownRow()` did not sanitize newlines or pipe characters, the multi-line stack trace shattered the PR Health comment\u0027s Markdown table.\n\n- Keep full `stderr` diagnostics in the GitHub Actions workflow logs (via `runDashProcess` and `log(...)`).\n- Set `neededVersion: null`, preserve `package.version` for `newVersion`, and emit a concise single-line message (`Unable to calculate breaking changes (see workflow logs for details).`) in the PR comment table when `report.json` is not created.\n- Sanitize newlines (`\\r?\\n`) and pipe characters (`|`) in `BreakingChange.toMarkdownRow()` so multi-line explanations can never break the Markdown table structure.\n- Add unit test coverage for `BreakingChange.toMarkdownRow()`.\n\nFixes https://github.com/dart-lang/ecosystem/issues/460\nRelated: https://github.com/bmw-tech/dart_apitool/issues/266",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "207567d38a3b74ced15ce21c9f1e837903992b62",
      "old_mode": 33188,
      "old_path": "pkgs/firehose/CHANGELOG.md",
      "new_id": "4f05be3fca25ea306cfc1c86290b77d786c6bb66",
      "new_mode": 33188,
      "new_path": "pkgs/firehose/CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "fc4460033b5deb6c6fe45130a56c5122abc81303",
      "old_mode": 33188,
      "old_path": "pkgs/firehose/lib/src/health/health.dart",
      "new_id": "31068021efbbd08ae8ef33eb63065735f63980e6",
      "new_mode": 33188,
      "new_path": "pkgs/firehose/lib/src/health/health.dart"
    },
    {
      "type": "modify",
      "old_id": "8ee07c4d3fd6f79fb5779bbb6061a4eb9235fa17",
      "old_mode": 33188,
      "old_path": "pkgs/firehose/test/health_test.dart",
      "new_id": "f7ea492529fe7c2e332913015e3979951e94e53d",
      "new_mode": 33188,
      "new_path": "pkgs/firehose/test/health_test.dart"
    }
  ]
}
