v5.1 Retrospective — Three Features, Four Fixes, Sixty Days
Published: August 28, 2026
What we shipped in v5.1
Three features, four critical fixes, and a new test suite — all in 60 days of focused work.
Features
- Cryptographic Tool Fingerprinting (v5.1.1) — 338 lines of TypeScript
- ATC Revocation Transparency Log (v5.1.2) — 450 lines of TypeScript
- Evidence-First Findings (v5.1.3) — 332 lines of TypeScript
Fixes
-
byte_lengthfield was UTF-16 code-unit count instead of UTF-8 byte count (found by @anp2network) -
wrong-ca-keytest vector was passing for the wrong reason (also @anp2network) -
install.shwas returning SPA HTML instead of a real install script (also @anp2network) - NPM packages had CRLF line endings + BOM, breaking byte-identical claims (also @anp2network)
Test suite
26 new tests covering:
- Tool fingerprint description/schema change detection
- Typosquatting (different tool names → different hashes)
- Merkle tree tamper-evidence
- Audit path verification
- Confidence scoring (factors sum to 100%)
- Coverage weights (static 40% + sandbox 35% + runtime 25% = 100%)
All passing. Run with: node --test tests/test-v51.mjs
What we learned
Lesson 1: External verification is the only verification that counts
@anp2network wrote a Python implementation of RFC 8785 JCS from the spec, re-derived the Ed25519 signatures, and found that the published byte_length was wrong. We had tested this internally — our tests passed because both signer and verifier used the same (wrong) function. Only an independent implementation could catch it.
Action: Publish the test vectors publicly. Make them re-derivable. The byte_length bug existed for 3 weeks before someone caught it.
Lesson 2: "Byte-identical" is a stronger claim than "same content"
We claimed "byte-identical, SHA-256 verified" across NPM and GitHub. The reality: CRLF line endings + UTF-8 BOM in package.json meant the SHA-256 differed by exactly 716 bytes. The parsed JSON was identical, but the bytes weren't.
Action: Added .gitattributes forcing LF line endings on all text files. Going forward, npm publish will produce byte-identical tarballs.
Lesson 3: A "must-fail" test that passes for the wrong reason is worse than no test at all
The wrong-ca-key vector declared errors_contain: "CA public key mismatch". The SDK actually returned errors: ["ATC-006: Ed25519 signature verification failed"]. The harness marked it matches_expected: true because it only checked valid == false, not whether the error message matched.
Action: Updated the harness to verify errors_contain matches the actual error. Documented the convention: CA key source is out-of-band (top-level ca_public_key), not in-band (issuer.ca_public_key).
Lesson 4: The install one-liner is the first thing people try
curl -fsSL https://marketnow.site/install.sh | bash was returning the SPA HTML shell because the server responds to every path with the homepage. The published command was piping HTML into bash.
Action: Wrote a real install script (8.9KB) that detects OS/arch, downloads the binary, verifies SHA-256 + Sigstore signature, and installs to /usr/local/bin/uta-verify. Now live at https://marketnow.site/install.sh.
Numbers
- Commits in v5.1: 7 (4 fixes + 3 features)
- Lines of TypeScript: ~1,120
- Lines of tests: ~280
- External implementations: 1 (Python by @anp2network — verified byte-for-byte)
- NPM monthly downloads: 3,530 (up from 675 two months ago — 5.2x growth)
- GitHub stars: 2 (no growth — this is the next problem to solve)
- Status page uptime: 100% since launch (Aug 26, 2026)
What's next (v5.2 — Q1 2027)
- Behavioral Baseline — record what each MCP server does over 7 days, store as baseline profile
- Drift Detection — compare runtime vs baseline, auto-degrade trust score, auto-revoke on critical drift
- Network/Filesystem/Process Behavior Analysis — map all outbound connections, file access, process spawns
The base for v5.2 is already shipped: v5.1.1 (Cryptographic Tool Fingerprinting) gives us the hash to compare against. v5.2 adds the time dimension.
Thanks
To @anp2network for the most thorough peer review we've received. To @mads_hansen for the security architecture feedback. To @wrencalloway for the runtime safety critique. To @topstar_ai for the engagement.
To anyone reading this who hasn't tried UTA yet: try the API. No auth, no signup, no rate limit. Tell us what's broken.
— Edison Flores, AliceLabs LLC
marketnow.site · status.marketnow.site · GitHub
Top comments (0)