v4.5.0 — .vstack/local/<tool>/
Corrects the layout v4.4.0 shipped a few hours earlier. Machine state and pipeline state now split first; the tool name comes second.
.vstack/
pipeline.json ← tracked
specs/feature.json ← tracked
build/phase-1.json ← tracked
local/ ← gitignored, one line
wireframe/login/
spec/feature.seq
user-story-map/map.seq
phase-build/phase-1.seq
What was wrong with 4.4.0
bridgewasn't a tool. It namedlib/json-bridge.mjs, an engine that spec, user-story-map and phase-build share — not anything anyone invokes..vstack/spec/would have sat one letter from.vstack/specs/— machine scratch beside a tracked pipeline file, distinguished by a plural.- Every new engine meant another
.gitignoreline.
Splitting on machine-vs-repo first fixes all three: **/.vstack/local/ is the only ignore line needed, ever, and the tool name lives one level down where it can't shadow a tracked directory.
The bridge knows who it serves
json-bridge.mjs takes --tool, so the three skills that share it get their own directories. All three SKILL.md files pass it on every serve, watch and patch.
A skill that passed --tool to serve but forgot it on watch would resolve to a different directory and silently watch nothing — the worst failure this design allows. findWorkDir makes a reader fall back across sibling tool directories, so the link works even when the calls disagree.
Tests
New tests/workdir.mjs covers the resolution rules: state sits beside the artifact, an enclosing .vstack wins over nesting a second one, the tool name is always last, spec is never spelt specs, and the reader fallback works.
Breaking
If you took 4.4.0, the paths moved again. Still no migration — reviews in flight and in-browser comment drafts are orphaned. Finish or discard any open review before updating.
Update
Claude Code:
/plugin marketplace update cavalry-collective
/plugin update vstack@cavalry-collective
/reload-plugins
Codex:
codex plugin marketplace upgrade cavalry-collective
codex plugin add vstack@cavalry-collective