Hello

irb(main):069:0* a = Hash.new([])
=> {}
irb(main):070:0> a[1] << "X"
=> ["X"]
irb(main):071:0> a.freeze
=> {}
irb(main):072:0> a.frozen?
=> true
irb(main):073:0> b = a.dup
=> {}
irb(main):074:0> b.frozen?
=> false
irb(main):075:0> b.default
=> ["X"]
irb(main):076:0> b[11] << "Y"
=> ["X", "Y"]
irb(main):077:0> b.default
=> ["X", "Y"]
irb(main):078:0> a.default
=> ["X", "Y"]
irb(main):079:0> a.frozen?
=> true
irb(main):080:0> b.frozen?

as one can see a.default is a flat copy
so a is modified though it's frozen

what is the usual idom to get deep copy?

Regards, Daniel