Skip to content

Commit a15be9b

Browse files
Ship 1.4.0
Fixes every reproducible finding from an external adversarial audit of 1.3.0: three paths that destroyed configuration the user owned, an install lane that reported success while wiring every hook to a path that does not exist, a bootstrap that required git before it could install git and hard-reset local work, backups that overwrote each other, a dependency check that passed without the agent, and missing upstream MIT notices. Two of those were introduced by the audit that shipped 1.3.0, which is the useful part: the same author wrote the fix, the gate meant to catch it, and the report saying both were fine.
1 parent 4380bd1 commit a15be9b

3 files changed

Lines changed: 58 additions & 2 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"plugins": [
1111
{
1212
"name": "vstack",
13-
"version": "1.3.0",
13+
"version": "1.4.0",
1414
"source": "./claude",
1515
"description": "26 skills that fire without a slash command, 8 agents, 14 commands, and the session hook that routes situations to skills. Most skills are ported from pstack and Superpowers — see claude/skills/ATTRIBUTION.md for per-skill source and license.",
1616
"category": "workflow"

CHANGELOG.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,62 @@ Versions follow [semver](https://semver.org). The version lives in two manifests
66

77
## Unreleased
88

9+
## 1.4.0 — 2026-08-20
10+
11+
An external adversarial audit of 1.3.0 by a different model returned twelve findings and a
12+
NO-GO. Seven were reproducible; all seven were real, and two of them were bugs introduced by
13+
the audit that shipped 1.3.0. This release fixes every one.
14+
15+
**Three ways a user could lose configuration they owned.**
16+
17+
- Uninstalling with `CLAUDE_CONFIG_DIR` outside `$HOME` deleted the live `CLAUDE.md` instead of
18+
restoring it. `install.sh` records those paths under `files_abs/` because they have no
19+
home-relative form, and `uninstall.sh` never read that directory — it treated it as a legacy
20+
flat name and then classified the real external files as removable.
21+
- Installing over a lived-in config destroyed the user's hooks and `skillOverrides`, because the
22+
merge replaced both maps wholesale. Ownership decides now: a hook command pointing into this
23+
install's hooks directory is vstack's to rebuild, anything else is the user's to keep, and
24+
overrides merge with vstack winning only on collision.
25+
- Uninstalling under a home path containing a space removed the skills and left every hook,
26+
command, agent and wrapper in place while printing "restore complete". The removal lists
27+
joined absolute paths with spaces; they are newline-delimited now.
28+
29+
**The no-jq install was inert.** It reported success and wired every hook to
30+
`$CLAUDE_PROJECT_DIR/.claude/hooks/...`, which does not exist at user scope — exit 127 on every
31+
session start, stop and tool failure, on exactly the sandboxes that path exists to serve. Hook
32+
paths are rewritten to the real config dir, and the matrix now executes the configured command
33+
rather than checking the files were copied.
34+
35+
**The headline bootstrap required git before it could install git.** On a fresh Mac git arrives
36+
with the Xcode command line tools, the prerequisite it claims to remove. It falls back to the
37+
source tarball using curl and tar, states that the result is not a git checkout and what that
38+
costs, and names the install command per platform when it has neither. It also hard-reset a
39+
dirty checkout, silently discarding tracked edits; it refuses now unless `VSTACK_FORCE=1`.
40+
41+
**Backups could overwrite each other.** Directories are named to the second and were created
42+
with `mkdir -p`, so two installs in the same second shared one and the second overwrote the
43+
first's only copy of the user's files.
44+
45+
**`setup-machine.sh --check` exited 0 with the Claude CLI missing**, so bootstrap carried on and
46+
modified config and shell startup files for an agent that could not run.
47+
48+
**Upstream MIT notices are vendored.** MIT requires the copyright and permission notice travel
49+
with the work; neither obra/superpowers nor ehmo/platform-design-skills had one here. Both are
50+
in `LICENSE.mit-upstream`, fetched from source. The badge reads MIT + Apache-2.0.
51+
52+
**New: check 22** — a skill may reference tooling this port does not vendor, but it has to say
53+
so in the file doing the referencing. It immediately found an instance the audit missed:
54+
brainstorming's visual companion told the model to run three scripts that are not here.
55+
56+
**CI covers the last unproven lane.** The plugin marketplace case ran only in jobs without the
57+
Claude CLI, so it skipped everywhere while every check stayed green. It runs for real now, and
58+
the job fails if it regresses to skipping.
59+
60+
Two meta-fixes worth naming: check 11's guard against the retired notifier grepped for the word
61+
and fired on the code that removes it, and check 11's falsifiability probe had silently stopped
62+
mutating anything when the merge program was reindented — a mutation that lands nowhere reports
63+
a check as unfalsifiable while proving nothing about it.
64+
965
## 1.3.0 — 2026-08-20
1066

1167
A pre-launch audit against two claims: that the repo and an installed machine agree both

claude/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vstack",
3-
"version": "1.3.0",
3+
"version": "1.4.0",
44
"description": "Skills that fire on the situation instead of a slash command, plus the subagents, commands, and session hook that make them fire. Verification gates, parallel fan-out, code review, and writing discipline.",
55
"author": {
66
"name": "Vedant Kumar"

0 commit comments

Comments
 (0)