Oh, right, sorry.
I think I figured it out. Your tile definitions are indeed wrong. What happened is that you were assuming that the letters in the borders connect to the letters in the borders of the neighboring tile. This is not the case. They connect to the *body* of the neighboring tile. So if you have "i" in the border of one tile, it can only connect to a "+i" in some other tile.
For example, take these two tiles, which in your fixed assembly are vertically connected:
tile +craft_drop_firebird
{
5 5
0 i i i 0
j +da +d +da k
j +ca +c +ca k
j +ca +c +ca k
0 ce ce ce 0
}
tile +strv_rail_btm2a
{
5 3
0 c c c 0
j +ea +e +ea k
0 i i i 0
}
These tiles can't connect, because craft_drop_firebird only has +d in the top row of the body (not the border), while strv_rail_btm2a can only connect to +i. It also doesn't work the other way around, because craft_drop_firebird can only connect to +i on the top side while strv_rail_btm2a doesn't have +i in its body at all.
The following setup will allow craft_drop_firebird and strv_rail_btm2a to connect:
tile +craft_drop_firebird
{
5 5
0 i i i 0
j +d +d +d k
j +d +d +d k
j +d +d +d k
0 ce ce ce 0
}
tile +strv_rail_btm2a
{
5 3
0 c c c 0
j +i +i +i k
0 d d d 0
}
d matches +d, i matches +i.