Part of #2009
Blocked by #2020
GET /api/tree/<tree_name>/<branch>/boots/compare?...
GET /api/tree/<tree_name>/<branch>/tests/compare?...
Same query params, route convention, and grouped-status rules as builds (#2020). Join on path + config_name + platform. Same boot/test split as Tree Details (get_tree_data boots vs tests). Same collision and one-sided handling as builds.
Response: array of { path, config_name, platform, status_a, status_b }.
Done when: boots + tests diff tests; closes #2009.
Part of #2009
Blocked by #2020
GET /api/tree/<tree_name>/<branch>/boots/compare?...GET /api/tree/<tree_name>/<branch>/tests/compare?...Same query params, route convention, and grouped-status rules as builds (#2020). Join on
path+config_name+platform. Same boot/test split as Tree Details (get_tree_databoots vs tests). Same collision and one-sided handling as builds.Response: array of
{ path, config_name, platform, status_a, status_b }.Done when: boots + tests diff tests; closes #2009.