D263 - A diagnostic clause is read from the right, so a target may be qualified

decided · 2026-08-25 · a latent bug, reported twice before it was fixed

ORBISTOUN_WRITE is <import>:<slot>:<value> and ORBISTOUN_RETURN is <import>:<value>, both split left to right. So a label like libkernel::sceFoo produced five fields where three were expected, the clause was discarded, and the run planted nothing. Silently: a run that plants nothing looks exactly like a run that changed nothing, and only Finding::NeverPlanted - which exists for this - kept twenty-three imports from being written up as clean negatives.

The trailing fields are fixed-arity, so rsplitn takes them and leaves everything before as the target. Two libraries exporting the same symbol name are now distinguishable, and Target::matches already accepted a qualified label - only the parser refused it.

Reading from the right makes the target greedy, and an existing test caught that. f:0x1:0x2 parsed happily into a target of f:0x1, which is not a name anything exports; a test written long before this change asserted that clause must be refused, and failed. is_label restores the guard: a target is a bare symbol, a bare hash, or library::symbol, so it may hold double colons and must hold no single one.

Worth noting as a small vindication of the convention that every parser gets a rejection test. The capability and the guard are the same three-line change, and only the guard had a test already.