From ece210418934d4043647caebe49c8a6ff8250c45 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 6 Sep 2026 16:49:17 +0200 Subject: [PATCH] chore(plugins): remove the Smoke gate plugin; MossTank shelf icon 0x06002C41 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner direction 2026-09-06: the owner visually accepted all three connected gates from the plugin-shelf/DAT-icon work — the movable plugin shelf (Slice A), the DAT icon markup (Slice B), and the retained-UI outline-order fix (761a7519f). With that gate passed, the Smoke plugin's job as the gate artifact is done, so it is deleted outright rather than merely hidden: src/AcDream.Plugins.Smoke/ (SmokePlugin.cs, SmokeIconPanel.cs, csproj, lock files). Reference sites cleaned: - AcDream.slnx: removed the project entry. - src/AcDream.App/AcDream.App.csproj: removed the Smoke ProjectReference and the CopySmokePluginToBuildOutput/CopySmokePluginToPublishOutput targets; the MossTank equivalents are untouched. - .github/workflows/headless-portability.yml: the Linux package-contract step no longer asserts a Smoke plugin.dll/plugin.json pair — repointed at MossTank's, since the step's job was to prove the plugin-copy packaging mechanism works end to end, not specifically to prove Smoke. - tests/AcDream.Core.Tests/Plugins/PluginManifestTests.cs: the inline JSON fixture used Smoke's manifest values as arbitrary test data; swapped for MossTank's so the parser test still proves the same thing. - tests/AcDream.App.Tests/Rendering/LinuxPlatformBoundaryTests.cs: the shipped-plugin-copy shape test counted 4 GetTargetPath targets (Smoke + MossTank, build + publish); now 2 (MossTank only). - tests/AcDream.App.Tests/Plugins/AppAutomationSurfaceIconInstalledDatTests.cs: reworded a doc comment that named the now-deleted SmokeIconPanel. - README.md, docs/plugin-ui-markup.md: dropped Smoke-specific mentions, kept the icon markup example/grammar (now citing MossTank's own real IconSurfaceId). - docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md: recorded the owner's 2026-09-06 acceptance and the Smoke removal in the review ledger; deleted the now-moot "before shipment" Smoke-in-release-zip warning. - docs/reviews/coverage-ledger.md, docs/reviews/findings-ledger.md: left untouched — both are frozen audit snapshots ("complete for baseline "), so their Smoke rows are historical record, not live claims. - docs/ISSUES.md: left untouched — its Smoke mentions are inside closed issue #193's historical write-up of a past investigation. MossTank plugin shelf icon: MossTankPlugin.cs's PluginPanelDescriptor now sets IconSurfaceId = 0x06002C41 (IconText = "MT" remains the fallback). Verified against the installed retail DAT with a new InstalledDat-lane test, tests/AcDream.App.Tests/UI/MossTankIconInstalledDatTests.cs, mirroring RetailMarkupIconResolverInstalledDatTests's convention: confirms the id is a real Portal/HighRes RenderSurface and that RetailMarkupIconResolver.ResolveDid returns a non-zero texture for it. Verified: dotnet build AcDream.slnx -c Release green; a stale plugins/AcDream.Plugins.Smoke output folder from a prior build was deleted and a fresh build does not recreate it. Full App suite: 7,363 passed / 97 skipped / 36 failed (was 7,362/97/36) — the failing set is unchanged and none are plugin-related; the one new pass is the MossTank DAT-icon test. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/headless-portability.yml | 4 +- AcDream.slnx | 1 - README.md | 2 +- .../2026-09-06-plugin-shelf-and-dat-icons.md | 32 ++-- docs/plugin-ui-markup.md | 13 +- src/AcDream.App/AcDream.App.csproj | 57 +----- .../MossTankPlugin.cs | 5 + .../AcDream.Plugins.Smoke.csproj | 17 -- src/AcDream.Plugins.Smoke/SmokeIconPanel.cs | 168 ------------------ src/AcDream.Plugins.Smoke/SmokePlugin.cs | 45 ----- .../packages.linux-x64.lock.json | 11 -- .../packages.neutral.lock.json | 10 -- .../packages.win-x64.lock.json | 11 -- ...pAutomationSurfaceIconInstalledDatTests.cs | 6 +- .../Rendering/LinuxPlatformBoundaryTests.cs | 2 +- .../UI/MossTankIconInstalledDatTests.cs | 65 +++++++ .../Plugins/PluginManifestTests.cs | 12 +- 17 files changed, 102 insertions(+), 359 deletions(-) delete mode 100644 src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj delete mode 100644 src/AcDream.Plugins.Smoke/SmokeIconPanel.cs delete mode 100644 src/AcDream.Plugins.Smoke/SmokePlugin.cs delete mode 100644 src/AcDream.Plugins.Smoke/packages.linux-x64.lock.json delete mode 100644 src/AcDream.Plugins.Smoke/packages.neutral.lock.json delete mode 100644 src/AcDream.Plugins.Smoke/packages.win-x64.lock.json create mode 100644 tests/AcDream.App.Tests/UI/MossTankIconInstalledDatTests.cs diff --git a/.github/workflows/headless-portability.yml b/.github/workflows/headless-portability.yml index 7d498278..f1389c9f 100644 --- a/.github/workflows/headless-portability.yml +++ b/.github/workflows/headless-portability.yml @@ -211,8 +211,8 @@ jobs: test -f "$root/libglfw.so.3" test -f "$root/libopenal.so" test -f "$root/Rendering/Shaders/mesh_modern.vert" - test -f "$root/plugins/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.dll" - test -f "$root/plugins/AcDream.Plugins.Smoke/plugin.json" + test -f "$root/plugins/AcDream.Plugins.MossTank/AcDream.Plugins.MossTank.dll" + test -f "$root/plugins/AcDream.Plugins.MossTank/plugin.json" test "$(grep -RIl --include='*.cs' 'LibraryImport(\"kernel32.dll\"' \ src/AcDream.App | wc -l)" -eq 1 diff --git a/AcDream.slnx b/AcDream.slnx index 892b0ee3..2699c534 100644 --- a/AcDream.slnx +++ b/AcDream.slnx @@ -12,7 +12,6 @@ - diff --git a/README.md b/README.md index 616035ea..02bacc48 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ src/ AcDream.UI.Abstractions/ shared UI/input models and contracts AcDream.UI.ImGui/ developer-tool presentation AcDream.Plugin.Abstractions/ BCL-only plugin contracts - AcDream.Plugins.Smoke/ example plugin + AcDream.Plugins.MossTank/ example plugin tests/ AcDream.*.Tests/ layer-matched xUnit projects diff --git a/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md b/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md index a7076079..b83e748d 100644 --- a/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md +++ b/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md @@ -290,22 +290,16 @@ all four places, list icon column aligned with rows. now throws at `Build` instead of silently ignoring the attribute; stale `SampleData.cs:64` citations corrected to `:69` (Melee Defense's real line). -- **Before shipment:** the Smoke plugin's "Icon Smoke" panel - (`src/AcDream.Plugins.Smoke/SmokeIconPanel.cs`) keeps `StartVisible=true` - on purpose, for the owner's connected gate — flip it to - `StartVisible=false` (or drop `AcDream.Plugins.Smoke` from the release - payload entirely) once that gate is done. Checked whether the LAUNCHER - release payload actually ships it: `tools/publish-bin.ps1`'s - `New-PayloadZip` zips App's ENTIRE publish output directory - (`[IO.Compression.ZipFile]::CreateFromDirectory`, no file filtering - beyond checking `$RequiredFiles` exist) into `client-.zip`, and - `AcDream.App.csproj`'s `CopySmokePluginToPublishOutput` target - (`AfterTargets="Publish"`, gated only on `IsCrossTargetingBuild`, not on - `Configuration`) copies `plugins/AcDream.Plugins.Smoke/` straight into - that same publish directory during `dotnet publish`. **The Smoke plugin - — auto-open panel included — ships in today's release zip.** (The - MossTank plugin has the equivalent `CopyMossTankPluginToPublishOutput` - target and ships the same way; a quick grep shows several of its own - panels also set `StartVisible = true` — worth the same "before shipment" - look, but out of scope for this residual round, which only covers the - Smoke plugin per N9.) +- **Owner acceptance (2026-09-06):** the owner visually accepted all three + connected gates — the plugin shelf (Slice A), the DAT icon markup + (Slice B), and the retained-UI outline-order fix (`761a7519f`, landed + alongside this plan's residual round). With the visual gate passed, the + Smoke plugin's job as the gate artifact is done. Per owner direction, + `src/AcDream.Plugins.Smoke/` (including its "Icon Smoke" proof panel, + `SmokeIconPanel.cs`) was deleted outright rather than merely hidden — + the shipped-in-the-release-zip risk this ledger flagged above is now + moot because the plugin no longer exists to ship. Every build/CI/test/doc + reference to it was removed or repointed at the MossTank plugin in the + same commit; see `chore(plugins): remove the Smoke gate plugin; MossTank + shelf icon 0x06002C41`. MossTank's own panels defaulting to + `StartVisible = true` remains open — same look, still out of scope here. diff --git a/docs/plugin-ui-markup.md b/docs/plugin-ui-markup.md index 57fb5edb..055d048e 100644 --- a/docs/plugin-ui-markup.md +++ b/docs/plugin-ui-markup.md @@ -21,8 +21,8 @@ icon, and the parser that turns markup into a live `UiElement` tree host.Ui.AddPanel( new PluginPanelDescriptor("main", "MossTank") { - IconText = "MT", // fallback initials if IconSurfaceId is 0 - IconSurfaceId = 7735, // Decal-style bare index OR a full DID — both normalize + IconText = "MT", // fallback initials if IconSurfaceId is 0 + IconSurfaceId = 0x06002C41, // Decal-style bare index OR a full DID — both normalize StartVisible = true, ShowInSidePanel = true, }, @@ -32,9 +32,8 @@ host.Ui.AddPanel( `RegisterPanel` (same signature, returns `IDisposable`) removes the window independently of the plugin's own lifetime. `RegisterPanelContent` takes an -in-memory KSML string instead of a file path — the route `AcDream.Plugins.Smoke` -uses for its icon-surface proof panel (`SmokeIconPanel.cs`), when a panel is -small enough not to need its own shipped `.xml` asset. +in-memory KSML string instead of a file path — the route to reach for when a +panel is small enough not to need its own shipped `.xml` asset. Every registered window gets a stable persisted key (`plugin:{pluginId}:{windowId}`), drag, resize (where the markup opts in), @@ -263,9 +262,7 @@ There is no way to mix kinds within a single list. Two consequences: that wants the badge look has no `did`-space escape hatch. MosswartMassacre-style example — a list column composited from spell ids, -with the spell's own raw art DID printed alongside the name for comparison -(`AcDream.Plugins.Smoke`'s own proof panel, `SmokeIconPanel.cs`, is exactly -this pattern): +with the spell's own raw art DID printed alongside the name for comparison: ```csharp // iconkind="spell": the values MUST be spell ids (what ResolveSpell composites diff --git a/src/AcDream.App/AcDream.App.csproj b/src/AcDream.App/AcDream.App.csproj index 3ccc68c8..b4a7c436 100644 --- a/src/AcDream.App/AcDream.App.csproj +++ b/src/AcDream.App/AcDream.App.csproj @@ -100,62 +100,7 @@ - - - - false - true - - - - - <_SmokePluginDestDir>$(OutputPath)plugins/AcDream.Plugins.Smoke - - - - - - - - - - - - <_SmokePluginPublishDestDir>$(PublishDir)plugins/AcDream.Plugins.Smoke - - - - - - - - - - diff --git a/src/AcDream.Plugins.MossTank/MossTankPlugin.cs b/src/AcDream.Plugins.MossTank/MossTankPlugin.cs index dbcd3974..40f5fa46 100644 --- a/src/AcDream.Plugins.MossTank/MossTankPlugin.cs +++ b/src/AcDream.Plugins.MossTank/MossTankPlugin.cs @@ -41,6 +41,11 @@ public sealed class MossTankPlugin : IAcDreamPlugin new PluginPanelDescriptor("main", "MossTank") { IconText = "MT", + // A real installed portal.dat RenderSurface — see + // MossTankIconInstalledDatTests for the DAT-presence proof. + // IconText remains the fallback if this id is ever absent + // from an install. + IconSurfaceId = 0x06002C41u, StartVisible = true, ShowInSidePanel = true, }, diff --git a/src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj b/src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj deleted file mode 100644 index 0f5b0c92..00000000 --- a/src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - enable - enable - latest - - - - - false - runtime - - - diff --git a/src/AcDream.Plugins.Smoke/SmokeIconPanel.cs b/src/AcDream.Plugins.Smoke/SmokeIconPanel.cs deleted file mode 100644 index 76d1dc46..00000000 --- a/src/AcDream.Plugins.Smoke/SmokeIconPanel.cs +++ /dev/null @@ -1,168 +0,0 @@ -using AcDream.Plugin.Abstractions; - -namespace AcDream.Plugins.Smoke; - -/// -/// Slice B proof panel (docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md -/// item 9): exercises every new plugin-markup icon surface in one place — -/// registered from in-memory KSML via -/// (no plugin-side XML file), with the descriptor's own -/// also set to the bare -/// Decal-style index used below, so the shelf button and the panel's own -/// <icon did="0x165"> prove -/// the same way at both sinks. -/// -/// -/// Review fix round (2026-09-06): was -/// 7735 (an unverified literal) and is now retail's Melee Defense -/// skill icon index 0x165SampleData.cs:69 attests -/// 0x06000165 is a real installed-DAT RenderSurface, so the -/// descriptor and the bare-index <icon> both draw ART a tester -/// can actually verify against retail, not a guess. The list's -/// iconkind="spell" column also had a wiring bug: it fed -/// (a raw RenderSurface DID) to the -/// SPELL-id resolver, which composites a badge from a SpellTable entry -/// looked up by SPELL id — the two numbers are unrelated, so every row -/// silently resolved the wrong (or no) composited badge. See -/// . -/// -internal static class SmokeIconPanel -{ - /// - /// A Decal/VirindiViewService-style bare portal.dat index for retail's - /// Melee Defense skill icon (0x06000165 — attested in - /// src/AcDream.App/UI/Layout/SampleData.cs:69) rather than an - /// unverified literal. Deliberately used on BOTH the descriptor and the - /// first <icon> below to prove the host normalizes it - /// identically at each sink. - /// - public const uint BareIndexIconId = 0x165u; - - /// A literal, already-normalized RenderSurface DID (a portal icon). - private const uint LiteralDidIconId = 0x06002D14u; - - /// - /// Retail's Strength Other I — the plan's named fallback when the local - /// character has not learned any self-castable buff yet. - /// - private const uint FallbackSpellId = 1u; - - public static readonly PluginPanelDescriptor Descriptor = new("icons", "Icon Smoke") - { - IconSurfaceId = BareIndexIconId, - StartVisible = true, - ShowInSidePanel = true, - }; - - public const string Markup = """ - - - - -