I have examined the source code and concluded that the keydir values printed in the messages are always the same and they are not derived from the OpenVPN configuration.
With reference to the OpenVPN 2.3.1 source code ...
The messages are generated by function do_print_data_channel_mtu_parms defined in init.c:
2670 /*
2671 * Get local and remote options compatibility strings.
2672 */
2673 static void
2674 do_compute_occ_strings (struct context *c)
2675 {
2676 struct gc_arena gc = gc_new ();
2677
2678 c->c2.options_string_local =
2679 options_string (&c->options, &c->c2.frame, c->c1.tuntap, false, &gc);
2680 c->c2.options_string_remote =
2681 options_string (&c->options, &c->c2.frame, c->c1.tuntap, true, &gc);
2682
2683 msg (D_SHOW_OCC, "Local Options String: '%s'", c->c2.options_string_local);
2684 msg (D_SHOW_OCC, "Expected Remote Options String: '%s'",
2685 c->c2.options_string_remote);
The values are populated by the options_string function defined in options.c:
2901 options_string (const struct options *o,
2902 const struct frame *frame,
2903 struct tuntap *tt,
2904 bool remote,
2905 struct gc_arena *gc)
2906
[snip]
2981 /*
2982 * Key direction
2983 */
2984 {
2985 const char *kd = keydirection2ascii (o->key_direction, remote);
2986 if (kd)
2987 buf_printf (&out, ",keydir %s", kd);
2988 }{
Thus it's clear that keydir is a "key direction" not a "key directory".
Function keydirection2ascii is defined in crypto.c:
1180 keydirection2ascii (int kd, bool remote)
1181 {
1182 if (kd == KEY_DIRECTION_BIDIRECTIONAL)
1183 return NULL;
1184 else if (kd == KEY_DIRECTION_NORMAL)
1185 return remote ? "1" : "0";
1186 else if (kd == KEY_DIRECTION_INVERSE)
1187 return remote ? "0" : "1";
1188 else
1189 {
1190 ASSERT (0);
1191 }
1192 return NULL; /* NOTREACHED */
1193 }
Thus the value of keydir in the messages is decided by function keydirection2ascii according to the value of remote. The value of remote is set by do_compute_occ_strings in the two calls to options_string -- invariantly once to true and once to false.