Thanks for the detailed report. The problem is due to the way puppet keeps track of "regex" types of node names here. Both regexp are normalized to the same string:
irb(main):005:0> @name = /(?<!a)sync/
=> /(?<!a)sync/
irb(main):006:0> "__node_regexp__#{@name.source.downcase.gsub(/[^-\w:.]/,'').sub
(/^\.+/,'')}"
=> "__node_regexp__async"
irb(main):007:0> @name = /async/
=> /async/
irb(main):008:0> "__node_regexp__#{@name.source.downcase.gsub(/[^-\w:.]/,'').sub
One simple fix is to specify "async" as a string and not a regex:
node /(?<!a)sync/ {
...
}
node async {
chouser we'll accept a PR if you want to work on this, we currently don't have plans to address this.