Pre-release cleanup milestone: the three gate issues (#28, #29, #30) closed via PRs #32 and #34, both bot-reviewed to convergence (Claude "approve", Copilot "no new comments") and adversarially verified by execution.
Highlights
- Sync is single-flight for every caller (#28). The lock moved from the SessionStart hook into
fetch-docs.sh syncitself — PID-owned, heartbeated, reaped only on evidence (dead PID, stale pidless dir, recycled-PID backstop). A slow first sync can no longer lose its lock, and the EXIT-trap cascade that could remove a successor's lock is closed. - The search index can't silently go stale (#29). Carry-forward keeps search alive through doc-site outages, but it also satisfied the content-share guard — so a build over a mostly-missing scratch dir could publish a largely-stale index unnoticed. New ceiling: more than half carried-forward → the build refuses (
DOCS_INDEX_MAX_CARRY_SHARE,=1disables). A tripped guard turns the scheduled run red — that red run is the alert; the last-good index stays published. - Fuzzy search is ~500× faster (#30). Single awk pass instead of ~7,000 grep forks: ~17s → ~0.03s per query, identical rankings — which unblocked wiring the 64-check search-quality harness into CI (~10 min → ~12s).
- Sync worker pool (#30):
xargs -0 -n1 -Pkeeps every slot busy instead of batch-waiting on the slowest fetch;prunenow clears orphaned.tmp.*files; the installer no longer re-shallows clones deepened for the what's-new feature (and stays bash-3.2-safe on macOS). - Drift guards (#30): a unit test locks the shell/Python host allowlists together; the requests pin/floor is cross-referenced between requirements.txt and pyproject; ~180 lines of dead mirror-era discovery deleted. Net −50 lines.
Consciously skipped, with rationale recorded: N-of-M discovery quorum (fail-closed red run is the deliberate alert channel) and extracting the duplicated install/uninstall jq snippet (both scripts must run standalone).
Full details: CHANGELOG.md → [2.0.2]. Plugin version bumped to 2.0.2.