Part of #2009
Depends on #2020 and #2021
GET /api/tree/<tree_name>/<branch>/compare/summary?commit_a=&commit_b=&origin=&filter_*=...
Return filtered comparison summaries for builds, boots, and tests in one response. Detail rows remain in the category-specific compare endpoints.
{
"builds": {
"side_a": { "pass": 0, "fail": 0, "inconclusive": 0 },
"side_b": { "pass": 0, "fail": 0, "inconclusive": 0 },
"delta": {
"pass": 0,
"fail": 0,
"regressions": 0,
"fixed": 0,
"new_failures": 0,
"new_passes": 0
},
"groups": []
},
"boots": { "...same shape..." },
"tests": { "...same shape..." }
}
side_a / side_b: grouped status counts after filters
delta.pass / fail: net change (B − A)
- Transitions:
PASS→FAIL, FAIL→PASS, null→FAIL, null→PASS; INCONCLUSIVE transitions are excluded
- Identity must match detail comparison:
- Builds:
config + architecture + compiler
- Boots/tests:
path + config + platform + architecture + compiler + lab
- Groups: builds by build identity; boots/tests by
path
- Summary only; no detail rows
Part of #2009
Depends on #2020 and #2021
GET /api/tree/<tree_name>/<branch>/compare/summary?commit_a=&commit_b=&origin=&filter_*=...Return filtered comparison summaries for builds, boots, and tests in one response. Detail rows remain in the category-specific compare endpoints.
{ "builds": { "side_a": { "pass": 0, "fail": 0, "inconclusive": 0 }, "side_b": { "pass": 0, "fail": 0, "inconclusive": 0 }, "delta": { "pass": 0, "fail": 0, "regressions": 0, "fixed": 0, "new_failures": 0, "new_passes": 0 }, "groups": [] }, "boots": { "...same shape..." }, "tests": { "...same shape..." } }side_a/side_b: grouped status counts after filtersdelta.pass/fail: net change (B − A)PASS→FAIL,FAIL→PASS,null→FAIL,null→PASS; INCONCLUSIVE transitions are excludedconfig + architecture + compilerpath + config + platform + architecture + compiler + labpath