## Summary

- add an optional `--uuid=<id>` argument to `vc_obj2tifxyz` and
  `vc_obj2tifxyz_legacy`;
- centralize identity resolution in a small shared helper;
- retain the historical output-directory-basename default when the option is
  omitted; and
- add regression coverage for explicit override, backward compatibility,
  input-stem fallback, and empty-input rejection.

## Why

A frozen scan of the current public TIFXYZ registry found that 277/450 roots
reuse the literal metadata UUID `output_tifxyz`. The pattern is systematic for
normalized artifacts: 262/262 normalized roots have that UUID, scale
`[0.05, 0.05]`, and the same five-key metadata shape. Among 140 segments with
both forms, all 140 normalized roots use `output_tifxyz`, while 127 original
counterparts have a source-specific identity.

The public `vc_obj2tifxyz_legacy` defaults have a matching fingerprint: step
size 20 produces scale 0.05, and UUID comes from the output-directory basename.
That is consistent with a pipeline using a staging directory named
`output_tifxyz`, but the private production command is not observable, so this
PR does not claim producer attribution or alter existing artifacts.

The option lets production preserve stable staging paths while supplying a
collection-specific identity. Existing commands keep exactly their current
behavior.

Evidence: https://huggingface.co/datasets/AviadCoh/vesuvius-august-evidence/tree/main/uuid-producer-audit

## Validation

- standalone C++ build with `clang++ -std=c++20 -Wall -Wextra -Werror -pedantic`;
- 4/4 resolver regression tests pass; and
- `git diff --check` passes.

The PR is opened as draft so the full Villa CI matrix can validate both
converter targets before review.