Tagout

v3.0.1: the consequence we filed under “if a consumer asks”

Released 2026-09-15. One fix, shipped the same day as the major it repaired.

What we were trying to fix

3.0.0 split the kit into two plugins that ship from one tree, and the two plugin directories reached that tree through git symlinks. On Windows, git has no privilege to write a symlink unless the machine is in Developer Mode, so each link arrived in the checkout as a small text file holding the path it was supposed to point at. The Claude Code loader discovers a skill by finding a directory with a SKILL.md inside it. It found neither. The first Windows install after the release loaded zero skills, and nothing said why: the files were all there, they were simply the wrong kind of thing.

What we decided

The plugin trees stop being links and become generated copies (ADR 0017). python3 scripts/host-adapters.py build writes both halves out of the one source under skills/, scripts/ and hooks/, and its check subcommand refuses a drifted copy, an orphan, a committed symlink or a file whose mode does not match its source. The cost is that every change to a shipped file now lands as two diffs, the source and its copy. The gate is what makes that bearable: a forgotten build fails CI by name rather than shipping a plugin one commit behind its own tree.

What got cut

The alternative was to keep the symlinks and document Developer Mode as a prerequisite. That is a prerequisite on the consumer for a convenience of ours, which is the wrong way round, and it would have stayed invisible until the next Windows user hit it.

What bit us

ADR 0016 had already predicted this exact failure in its own Consequences, and filed the remedy under “if a consumer asks”. A consumer asked on the day of the release (#619).

A consequence a decision record names and then leaves optional is a decision to ship the failure and wait for a report, and the report always comes from whoever had the worst day. If a record can describe the breakage precisely enough to write it down, it is already precise enough to gate.