IIRC, "b = true" will be simplified to just "b" somewhere in expression preprocessing. I'm betting that something in the partitioned index matching code is applying that preprocessing to one index predicate and not the other, whereupon they look different. If that's the explanation, there are likely other cases that should match and fail to.
Yeah, you're right. The matching work happens in indexcmds.c, using CompareIndexInfo to compare 'cldIdxInfo' and 'indexInfo'. The 'cldIdxInfo' is constructed with BuildIndexInfo, which would run index expressions and index predicates through const-simplification before creating the IndexInfo node. While 'indexInfo' is created without any const-simplification.
This can be verified with the attached changes, which would make it work for this case.
BTW, I searched other callers of CompareIndexInfo and they all have both IndexInfo nodes to be compared constructed from BuildIndexInfo, which means both nodes have applied const-simplification to their index expressions and index predicates. So those callers are fine.