Skip to content

fix: a plugin's objects survive its removal visibly, and its tool joins the palette (0249/0251 audit riders) - #521

Merged
alicoding merged 1 commit into
mainfrom
fix/plugin-audit-hardening
Aug 29, 2026
Merged

fix: a plugin's objects survive its removal visibly, and its tool joins the palette (0249/0251 audit riders)#521
alicoding merged 1 commit into
mainfrom
fix/plugin-audit-hardening

Conversation

@alicoding

Copy link
Copy Markdown
Owner

A fresh do-not-trust-the-pattern audit of the plugin platform (owner's standing directive) found two real gaps on main:

  1. Invisible orphans. AtlasBoardObjectNode returned null for an unregistered Kind — so a disabled/uninstalled plugin's already-placed objects vanished (invisible, unselectable, undeletable), silently breaking 0249's own "objects it already placed stay on your boards untouched" promise. Same hole for an ingestion-claimed kind whose plugin never registered. They now render a neutral fallback face (dashed, muted, "Its extension isn't running…") and stay fully manageable — proven by a two-server e2e that places a bookmark, restarts WITHOUT the plugin, and deletes the orphan through the standard context menu.
  2. Palette parity. Every built-in tool has an atlas.create.<id> palette command; plugin tools had none. The host now collects one per registered canvas object through the same collector plugin commands already ride (surface-scoped to atlas via a new RuntimeCommandDecl.surface, arming the identical placement mechanism with the established one-documented-cast) — proven by a palette e2e (⌘/ on atlas → "Bookmark" option).

Full runtime-plugins suite 6/6, vitest 970/970.

🤖 Generated with Claude Code

https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq

…ns the palette (0249/0251 audit riders)

Fresh gap audit of the plugin platform found two real holes. (1) An
unregistered Kind rendered null — a disabled/uninstalled plugin's
already-placed objects became invisible, unselectable and undeletable,
silently breaking the 'objects stay untouched' promise; same for an
ingestion-claimed kind whose plugin never registered. They now render
a neutral fallback face (dashed, muted, names why it isn't live) and
stay deletable through the standard context menu — proven by a
two-server restart e2e. (2) Built-in tools each have an
atlas.create.<id> palette command; plugin tools had none — the host
now collects one per registered object through the same channel plugin
commands ride (surface-scoped to atlas, arming the identical placement
mechanism), proven by a palette e2e.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
@alicoding
alicoding enabled auto-merge (squash) August 29, 2026 19:09
@alicoding
alicoding merged commit 0d3670e into main Aug 29, 2026
30 checks passed
@alicoding
alicoding deleted the fix/plugin-audit-hardening branch August 29, 2026 19:22
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.

1 participant