That is correct. When you pass a parametric shape as an argument to another shape constructor (in this case, 'row'), then the parameter information within the parametric shape is lost. So that means, if you want a picker to be displayed by this program, you need to use the 'parametric' keyword again to make it happen. Like this:
tc :: colour_picker = green;
in
row[tri, tri {c:tc}]
And when you do this, you have to decide which instance or instances of 'tri' are parameterized by pickers.
Automatically preserving the shape parameter information of shape constructor arguments is quite complicated, both the internal implementation complexity, and the extra complexity that would be exposed in the language and in the user interface. In this particular example, there would be two colour pickers shown, one for each instance of 'tri', and the GUI would need to make clear which is which. The number of pickers could explode if you have a large program that calls lots of shape constructors.
So this is a big change, and it's not something I plan to move quickly on. Other work needs to be done first.
This program produces an error because in 'row[tri, tri{}, tri{c:black}]', the first list element 'tri' is a function, not a shape. [The error message just needs to be improved.] Curv is a functional language; it is perfectly legal to pass functions around as arguments, so I can't just implicitly turn the expression 'tri' into a function call.
As you have seen, it is possible to construct a value that is simultaneously a shape and a function, but this requires a specialized mechanism ('parametric'), not just an ordinary function definition.
In Curv, you can write 'cube', and get a cube with default dimensions, or you can write 'cube 10' and get a cube of size 10. The object 'cube' is simultaneously a shape and a function. In OpenSCAD, you have to explicitly write 'cube()' or 'cube(10)', you cannot leave out the argument list. This feature of Curv comes at the cost of some additional complexity, and may cause confusion, because most shapes do not have this dual nature of being shapes/functions, and ordinary function definitions do not create shape/function objects. It's a feature I'd consider leaving out, for simplicity, if I were to redesign Curv from scratch.
If I left the feature out, then 'cube' would be a function that is always passed a record argument. You would write 'cube{}' to get the default size cube, and 'cube{d:10}' to get a cube of size 10. New users would be required to understand the strict difference between a function and a shape early on, and that might eliminate a source of confusion.