{"version":"2.1.234","anchor":"plugin-cache-link-materialization-rewritten","canonical_anchor":"plugin-cache-link-materialization-rewritten","heading":"Plugin cache link materialization rewritten","tier":"internal","area":"Plugins","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.234\/e\/plugin-cache-link-materialization-rewritten","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.234","markdown":"### Plugin cache link materialization rewritten\n\nTurning plugin symlinks into real files now survives interruption and refuses unsafe targets.\n\n**What**\n\nThe step that turns symlinks inside installed plugins into real files was reworked to survive interruption and concurrent runs, and to refuse targets it cannot safely copy.\n\n**Details**\n\n- Has separate install and migrate modes; refuses network targets and Windows reparse points.\n- Recovers entries left parked by an earlier interrupted run, keeps a scratch directory that is re-verified before every swap, and touches a heartbeat so a concurrent run can see it is alive.\n- Only after all that does it write the marker recording that links were materialized.\n- Copies use a stream pipeline opened refusing symlinks and without blocking, preserving the exact file mode.\n- Dependency installs must first withdraw the marker and record liveness, otherwise the install is refused. The storage-backed liveness marker path is gated on `tengu_hover_rest`.\n\n**Evidence**\n\n`plugin cache staged copy replaced before the swap`\n\n- Flag `tengu_hover_rest`: Off in both readings (read for one account on one subscription tier against v2.1.234; this account: off, anonymous baseline: off, compiled default: off)\n- Area: Plugins\n- Tier: Under the hood\n- Useful: 2\/5\n- Signal: 1\/5"}