Trust is a flag on text, and plain String means trusted

Decision

Untrusted text is written as Untrusted<String>. Despite the syntax, it is not a generic wrapper type. The checker tracks it as a trust flag on text types, using one-way flow (the same mechanism that stops a cap fn from flowing into a fn):

Why

A real Untrusted<T> wrapper type would have two costs:

Oska has no subtyping and no overloading, so the second cost alone would rule it out: Path.from could not accept both kinds of text.

A trust flag gives the behavior the design describes ("converting to a non-text type makes it trusted") directly, with nothing duplicated. Treating plain String as trusted makes every ordinary text slot a structural position by default. Accepting raw input becomes visible in the signature, as principle 3 requires.

Considered options

Consequences