Skip to content

Unlist Basilisk: inert CLI, notice-only extensions, one message on every surface - #428

Merged
MelbourneDeveloper merged 5 commits into
mainfrom
withdrawal
Aug 10, 2026
Merged

Unlist Basilisk: inert CLI, notice-only extensions, one message on every surface#428
MelbourneDeveloper merged 5 commits into
mainfrom
withdrawal

Conversation

@MelbourneDeveloper

Copy link
Copy Markdown
Collaborator

TLDR

Strip every public surface down to the withdrawal statement, make the CLI and all three editor extensions inert, and repair the release pipeline so the one final version can actually ship before anything is unlisted.

What Was Added?

  • delist/ — the unlisting runbook. Nine dry-run-by-default scripts (00-publish-zed-final08-verify-unlisted), each requiring you to type UNLIST before touching anything public, plus a manual table for the channels with no API (PyPI yanking, Open VSX, secret revocation, third-party listings). 01-verify-final-release.sh refuses to let anything else run until every channel reports the final version live.
  • scripts/check_public_copy.py + scripts/test_check_public_copy.py — scans all 34 public surfaces (crate READMEs, SECURITY.md, package manifests, Homebrew/Scoop templates, site templates) for anything [WITHDRAWAL-PROHIBITED] bars: percentages, conformance scores, install commands, rule counts, feature marketing, scoping reassurance, shipped-status claims, and a quoted apology. Wired into make lint and CI.
  • scripts/verify-vsix-inert.sh — unzips the packaged VSIX and fails on any binary, any bin/, bundled/, or any out/*.js beyond the notice.
  • crates/basilisk-cli/tests/inert_cli.rs — drives the real binary over 21 argument shapes.
  • Generated notice carriers for the CLI, VS Code, Zed and Neovim, all written from one fence in the messaging spec.

What Was Changed or Deleted?

The release pipeline was broken and is now fixed. scripts/stamp-version.sh still listed website/src/_data/site.json, deleted when the site collapsed to one statement page. A missing carrier is fatal (exit 2) and the script is the first step of the build, release, vsix and pypi-wheels jobs — tagging a release failed every job and shipped nothing to anyone. Carrier removed; the site displays no version and derives its metadata from the generated copy in site.js.

The CLI is inert. main.rs parses no arguments and links no Basilisk crate — Shipwright only. Every invocation prints the statement to stderr and exits 4; stdout is always empty so --output json > report.json yields an empty file; --version still answers with exit 0 so package managers and installed extensions don't hang.

The VS Code extension ships no checker. One command, one read-only statement document, one warning per installed version. 143 source files, every setting, view, debugger, keybinding, walkthrough and runtime dependency deleted. 8 files, 370 KB, no binary.

The Zed extension ships no checker. It previously registered a language server that launched basilisk lsp, fourteen slash commands (profiling, memory, tests), and a DAP adapter, and downloaded the release binary itself — so with an inert binary a Zed user would see "server failed to start" and never see the statement. It now declares no [language_servers.*], [debug_adapters.*] or [grammars.*] table, drops basilisk-common and serde_json (leaving zed_extension_api alone, which is why the mirror render no longer vendors a workspace crate), and prints the statement under /basilisk.

Crate READMEs carry a record banner and accurate status; the unsourced "sub-10ms incremental checks", "battle-tested" and "Working — ... all shipping" claims are gone. SECURITY.md no longer promises response windows or a supported version line on an unlisted project.

The website is one statement page; every retired URL redirects to /. basilisk-db's cross-session result cache and the LSP stdio/Zed spawn suites are deleted along with the checking they served.

How Do The Automated Tests Prove It Works?

  • inert_cli.rs — six tests over 21 argument shapes assert the exact stderr bytes, empty stdout, exit 4, that no file in the workspace is created/deleted/rewritten, that --version exits 0, and that the version JSON advertises no lsp/mcp/dap/profiler capability.
  • basilisk-zed/src/logic_tests.rs — 7 tests read the shipped extension.toml and fail if a language server, debug adapter or grammar table returns, if there is more than one slash command, if the description drifts from the approved one-line copy, or if latest_github_release/download_file reappears in the glue.
  • test_check_public_copy.py — every rule is exercised against text it must reject, no rule fires on another rule's example (so failures point at the right prohibition), and the approved copy trips nothing (a rule that couldn't tell python/typing#2330 from a score would force the copy to be watered down).
  • withdrawal.test.ts — extension at 100% coverage; verify-vsix-inert.sh confirms the packaged 8-file VSIX ships no binary.
  • withdrawal.spec.ts — 50 E2E tests assert the served bytes of every retired URL carry noindex, a canonical link and a meta-refresh, and land on /.
  • Release rehearsed locally at v0.42.0: stamper exits 0 across all five carriers; cargo build --release --bin basiliskbasilisk 0.42.0; archive packaged and verify_release_attribution.py --kind binary passes; VSIX packages at 8 files and passes the inert check; gen_release_notes.py renders the statement from the spec.
  • Full local gate run: make lint, test-rust.sh (all 8 crates at or above threshold), _test_vsix (100%), test-nvim.sh (48% ≥ 47%), test-zed.sh + wasm build + clippy + standalone mirror build, test_publish_zed_registry.py (9), unittest discover -s conformance, cargo build --release.

Spec / Doc Changes

  • DOCS-WITHDRAWAL-MESSAGING-SPEC.md is the single source of truth: {#WITHDRAWAL-SURFACES} now maps every surface to its block and generator and names the scan; {#WITHDRAWAL-UNLIST} fixes the order publish → verify live → unlist; {#WITHDRAWAL-INERT-TEXT} is the one fence every notice is generated from.
  • ZED-SPEC.md gains {#ZED-NOW} and moves the feature sections below a "record of what was built" line; {#ZED-DIST} is marked superseded.
  • CLAUDE.md normalised to one vocabulary — "unlisted" throughout, never delisted/withdrawn/deprecated.
  • Superseded banners on the retired specs; WEBSITE-ERROR-PAGES-SPEC.md and WEBSITE-SCREENSHOTS-SPEC.md restored as record.

Breaking Changes

Yes, deliberately. The basilisk CLI fails on every invocation with exit 4 — a pipeline that still calls it breaks loudly rather than reading a clean run out of a checker that was wrong. Every editor feature is removed. This is the point of the release.

Coverage thresholds ratcheted up only: vsix 93→99, nvim 44→47.

🤖 Generated with Claude Code

MelbourneDeveloper and others added 4 commits August 10, 2026 17:48
…ease

The release workflow could not run: stamp-version.sh still required
website/src/_data/site.json, which was deleted when the site collapsed to one
statement page. It exits 2 on a missing carrier and is the first step of the
build, release, vsix and pypi-wheels jobs, so tagging shipped nothing.

The Zed extension still advertised a language server, fourteen slash commands
and a debug adapter, and downloaded the binary itself. It now registers none of
those and prints the statement under /basilisk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
const text = statementText();
assert.ok(text.startsWith("Basilisk is unlisted."), text);
assert.ok(text.includes("checks nothing"), text);
assert.ok(text.includes("https://github.com/python/typing/pull/2330"), text);
walk(full, `${prefix}${entry}/`);
} else if (entry.endsWith(".html")) {
const url = entry === "index.html" ? prefix : `${prefix}${entry}`;
pages.push({ url, html: readFileSync(full, "utf-8") });
*/
function visibleText(html: string): string {
return html
.replace(/<script[\s\S]*?<\/script>/g, " ")
{ label: "an editor install link", pattern: /vscode:extension/i },
{
label: "a marketplace or package listing",
pattern: /marketplace\.visualstudio\.com|open-vsx\.org|pypi\.org/i,
Only the Zed job installs pytest. The Lint and Website Build jobs run the same
suites and do not, so `python3 -m pytest` failed both. Both files are plain
unittest with `unittest.main()`, so invoke them directly rather than adding a
pip install to two more jobs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@MelbourneDeveloper
MelbourneDeveloper merged commit 4d2d14b into main Aug 10, 2026
25 checks passed
@MelbourneDeveloper
MelbourneDeveloper deleted the withdrawal branch August 10, 2026 09:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants