diff --git a/docs/ISSUES.md b/docs/ISSUES.md
index dd732a10..1a9e6af9 100644
--- a/docs/ISSUES.md
+++ b/docs/ISSUES.md
@@ -74,32 +74,50 @@ after each deliberate `Top` write for the imported-layout element. Precedent:
`MapPageController.cs:235-249` (the same fix already landed for other
runtime-repositioned imported/programmatic elements).
-## #491 — MossTank extra/blacklisted buff lists are shown but not consumed by BuffPlan.Build
+## #493 — In-game rule editors for metas and loot rules (VTank's "Edit Meta Rule" and the loot editor) — deferred by the owner
-**Status:** OPEN — found 2026-09-07 at the slice 7 architecture review.
-**Severity:** LOW (honest UI after fix round B; behavior owed)
-**Component:** `src/AcDream.Plugins.MossTank/BuffPlan.cs` (`Build`), `BuffSettings.ExtraBuffSpellNames`/`BlacklistedBuffFamilyNames`
+**Status:** OPEN — filed 2026-09-07 at the slice-7 live look (owner: "we should not implement that right now since most metas are implemented outside of the game. Same with loot rules").
+**Severity:** LOW (feature; post-Campaign VT)
+**Component:** `src/AcDream.Plugins.MossTank/mosstank-metaeditor.xml`, `mosstank-loot-editor.xml`, `MossTankPanel.cs`
-**Description.** Slice 7 added VTank's "Extra Buff Spells" and "Blacklisted Buff Families" lists to the Buffs tab. They are stored (persisted after fix round B) but `BuffPlan.Build` never reads them: extra exemplars are not cast, blacklisted families are not skipped. Belongs to VT2 slice 4 (buffs); wire `Build` to add the "best similar" spell per extra exemplar and to skip blacklisted families, with plan tests.
+**Description.** VTank's Meta tab "Create" opens its "Edit Meta Rule" view (state, condition type + fields, action type + fields, nested All/Any/Not); its loot rules are edited in VTClassic's external editor. MossTank has a minimal popup editor for both. Metas are authored as metaf `.af` outside the game and loot profiles with the external `.utl` editor, so a full in-game editor is not on the campaign path. When picked up: model the editor on VTank's `Edit Meta Rule` view (KB 07 §1.3/§1.4 for every condition/action field) with a tree for nested rules, and a loot-rule editor over the `.utl` requirement vocabulary (KB 05 §1.3); the `.af`/`.utl` writers already exist.
-## #490 — Plugin panel host: `StartVisible=false` + `ShowInSidePanel=false` is permanently unshowable; layout persistence has no revision bump
+## #492 — Vulkan device loss at frame submit crashes the client and the shutdown path throws again on the lost device
-**Status:** OPEN — found live 2026-09-07 at slice 7 fix round A (`78b42a519`), workaround in the plugin.
-**Severity:** LOW/MEDIUM (host defect; silent)
-**Component:** `src/AcDream.App/UI/RetailUiRuntime.cs` (~5735-5757, `PluginWindowVisibilityController`), `RetailWindowLayoutPersistence`
+**Status:** OPEN — observed 2026-09-07 17:56 on the owner's machine during the slice-7 live look (gate build at `2b79ca325`).
+**Severity:** MEDIUM (crash; the trigger is external)
+**Component:** `src/AcDream.App/Rendering/Gpu/Vk/` (frame submit), `GameWindowLifetime.TryComplete` / `ResourceShutdownTransaction` / `WbMeshAdapter.Dispose`
-**Description.** (1) `_requestedVisible = startVisible` and only `OnShown()` ever sets it true; a window registered with `ShowInSidePanel=false` has no shelf entry to raise `OnShown`, so `StartVisible=false` can never become visible, with no error. MossTank works around it by registering its popups `StartVisible=true` and gating on its own visibility bindings. Fix shape: validate the combination at `AddPanel` (throw, or coerce). (2) Plugin windows restore a stale persisted position over a changed authored default with no revision bump — the slice 7 screenshots needed an isolated `ACDREAM_CONFIG_DIR` to open at the authored 28,42. Fix shape: key the persisted layout by the panel's authored geometry hash (or a plugin-declared layout revision) so a redesign resets the stored position once.
+**Description.** `vkQueueSubmit2 (frame)` returned `ErrorDeviceLost` (an unhandled `VulkanCallException`); the client then ran its graceful logout (ACE confirmed it) and the ordered shutdown, where the mesh-adapter stage failed on `vkWaitSemaphores … ErrorDeviceLost` and `ResourceShutdownTransaction.CompleteOrThrow` re-threw. Crash report: `C:SERSRIKNAPPDATAocalcdreamchediagnosticsash-20260907t1556317152878z-6224-d80b3162cf1e406fadad21098b322b5a.json`. the owner reported "disconnected and crash" — the disconnect is the client's own logout after the device loss, not a network event.
-## #489 — Headless: SpewBox pending queue grows unbounded when no console ticks it; console polish
-
-**Status:** OPEN — found 2026-09-07 by the Opus re-check of the headless console (`738111239`).
-**Severity:** LOW/MEDIUM (leak in long-lived bots)
-**Component:** `src/AcDream.Runtime/.../SpewBoxState.cs` (`Enqueue` ~:110, `_pending`), `src/AcDream.Headless/Hosting/HeadlessConsoleSpewBoxPump.cs`
-
-**Description.** `RuntimeCommunicationState.AddText` routes every `ClientLocal` (0x1A) line into `SpewBoxState.Enqueue`; the only `Tick` caller in the headless host is the console pump, so with the console disabled (every scripted/CI bot) `_pending` grows for the life of the session. Pre-existing before the console; the console merely made it visible. Fix shape: tick the SpewBox from the session tick regardless of the console (or drop `ClientLocal` text when nothing observes it), with a pin that a 10,000-line burst without a console does not grow the queue.
-
-**Polish carried from the same re-check:** in `--console` mode the JSON diagnostics/resources stream still interleaves with the chat lines on stdout — quiet it or send it to stderr when the console is on; `--console` missing from `--help`; `HeadlessConsoleOptions.cs:51` re-types the env-var literal (the LaunchOptions regex needs it — a const rename would split the two reads); the `/quit`/`/status`/"not handled" writes and `Pump()` sit outside the S4 try/catch (a broken stdout pipe would fault the session); the SpewBox's 4-entry visible cap can drop interface-text lines produced between two pumps.
+**fix shape.** (1) treat `errordevicelost` at submit as a terminal render fault: stop rendering, keep the session alive long enough for the graceful logout, and exit with a clear self-report instead of an unhandled exception; (2) the shutdown transaction must tolerate a lost device (skip gpu waits/frees that cannot succeed on a lost device, report once) so teardown converges. not slice-7 scope; belongs with the renderer's fault handling.
+## #491 — mosstank extra/blacklisted buff lists are shown but not consumed by BuffPlan.Build
+
+**Status:** OPEN — found 2026-09-07 at the slice 7 architecture review.
+**Severity:** LOW (honest UI after fix round B; behavior owed)
+**Component:** `src/AcDream.Plugins.MossTank/BuffPlan.cs` (`Build`), `BuffSettings.ExtraBuffSpellNames`/`BlacklistedBuffFamilyNames`
+
+**Description.** Slice 7 added VTank's "Extra Buff Spells" and "Blacklisted Buff Families" lists to the Buffs tab. They are stored (persisted after fix round B) but `BuffPlan.Build` never reads them: extra exemplars are not cast, blacklisted families are not skipped. Belongs to VT2 slice 4 (buffs); wire `Build` to add the "best similar" spell per extra exemplar and to skip blacklisted families, with plan tests.
+
+## #490 — Plugin panel host: `StartVisible=false` + `ShowInSidePanel=false` is permanently unshowable; layout persistence has no revision bump
+
+**Status:** OPEN — found live 2026-09-07 at slice 7 fix round A (`78b42a519`), workaround in the plugin.
+**Severity:** LOW/MEDIUM (host defect; silent)
+**Component:** `src/AcDream.App/UI/RetailUiRuntime.cs` (~5735-5757, `PluginWindowVisibilityController`), `RetailWindowLayoutPersistence`
+
+**Description.** (1) `_requestedVisible = startVisible` and only `OnShown()` ever sets it true; a window registered with `ShowInSidePanel=false` has no shelf entry to raise `OnShown`, so `StartVisible=false` can never become visible, with no error. MossTank works around it by registering its popups `StartVisible=true` and gating on its own visibility bindings. Fix shape: validate the combination at `AddPanel` (throw, or coerce). Still OPEN. (2) **FIXED at `05f22d46f`.** Plugin windows restored a stale persisted SIZE over a changed authored default with no revision bump (MossTank's panel went 856x236 -> 984x271 and every stored layout stayed at 856x236 forever — not a position bug, a size bug; the earlier "28,42" framing above was about part (1)'s workaround, not this). `RetailWindowManager.ComputeAuthoredGeometryRevision` now derives the revision from the panel's own authored `(w, h, minw, minh, resizable)` tuple via a process-stable hash (deliberately not `System.HashCode`, which reseeds per process), and `MountPlugins` passes it instead of the hard-coded `0`. `RetailWindowLayoutPersistence.MigrateAuthoredGeometry` now compares revisions for inequality rather than "newer only", since a hash is not an ordered counter. Position is kept (not reset) and still clamps to the live screen; a genuinely unchanged authored size keeps the user's own resize. See `RetailWindowLayoutPersistence`'s class doc for the full contract.
+
+## #489 — Headless: SpewBox pending queue grows unbounded when no console ticks it; console polish
+
+**Status:** OPEN — found 2026-09-07 by the Opus re-check of the headless console (`738111239`).
+**Severity:** LOW/MEDIUM (leak in long-lived bots)
+**Component:** `src/AcDream.Runtime/.../SpewBoxState.cs` (`Enqueue` ~:110, `_pending`), `src/AcDream.Headless/Hosting/HeadlessConsoleSpewBoxPump.cs`
+
+**Description.** `RuntimeCommunicationState.AddText` routes every `ClientLocal` (0x1A) line into `SpewBoxState.Enqueue`; the only `Tick` caller in the headless host is the console pump, so with the console disabled (every scripted/CI bot) `_pending` grows for the life of the session. Pre-existing before the console; the console merely made it visible. Fix shape: tick the SpewBox from the session tick regardless of the console (or drop `ClientLocal` text when nothing observes it), with a pin that a 10,000-line burst without a console does not grow the queue.
+
+**Polish carried from the same re-check:** in `--console` mode the JSON diagnostics/resources stream still interleaves with the chat lines on stdout — quiet it or send it to stderr when the console is on; `--console` missing from `--help`; `HeadlessConsoleOptions.cs:51` re-types the env-var literal (the LaunchOptions regex needs it — a const rename would split the two reads); the `/quit`/`/status`/"not handled" writes and `Pump()` sit outside the S4 try/catch (a broken stdout pipe would fault the session); the SpewBox's 4-entry visible cap can drop interface-text lines produced between two pumps.
+
## #488 — MossTank `.utl` expression block: length prefix measured before newline normalization
**Status:** OPEN — found 2026-09-07 by the final Opus re-check of Campaign VT
diff --git a/docs/plans/2026-09-07-campaign-vt-slice7-tabs.md b/docs/plans/2026-09-07-campaign-vt-slice7-tabs.md
index 2b42fbc8..f18053f4 100644
--- a/docs/plans/2026-09-07-campaign-vt-slice7-tabs.md
+++ b/docs/plans/2026-09-07-campaign-vt-slice7-tabs.md
@@ -141,5 +141,9 @@ re-review, merge to the campaign branch, then the owner's visual gate.
- 2026-09-07 16:10 App-side pieces merged into the campaign branch: `b71a8ea37` retail scrollbar chrome on plain `