img2_core/paths.py's resolve_workspace raises on any workspace whose root carries SKILL.md or plugin.json — a sound confinement idea that no img2threejs run can satisfy: the base pipeline runs from its checkout, which is also the workspace. plugin-character is the first domain plugin whose step tools call resolve_workspace (zero cs2 tools do), and extract-animated-character had to route every rig step around it (--out/--payload short-circuits; gate_rigging gained --payload for exactly this).
Recorded debt: the harness's workspace-confinement model and the checkout-as-workspace reality are incompatible. Revisit when the base gains a real workspace separate from its checkout — at which point {workspace} in domain.json vocabulary and confined artifact paths for domain steps become expressible too.
Refs: extract-animated-character design D3; plugin-character v0.2.0 CHANGELOG.
img2_core/paths.py's resolve_workspace raises on any workspace whose root carries SKILL.md or plugin.json — a sound confinement idea that no img2threejs run can satisfy: the base pipeline runs from its checkout, which is also the workspace. plugin-character is the first domain plugin whose step tools call resolve_workspace (zero cs2 tools do), and extract-animated-character had to route every rig step around it (--out/--payload short-circuits; gate_rigging gained --payload for exactly this).
Recorded debt: the harness's workspace-confinement model and the checkout-as-workspace reality are incompatible. Revisit when the base gains a real workspace separate from its checkout — at which point {workspace} in domain.json vocabulary and confined artifact paths for domain steps become expressible too.
Refs: extract-animated-character design D3; plugin-character v0.2.0 CHANGELOG.