Skip to content

Latest commit

 

History

History
567 lines (445 loc) · 31.6 KB

File metadata and controls

567 lines (445 loc) · 31.6 KB

ArtFramework open tasks

Checkbox list for open work. Tick when done; milestone notes stay short.

Infrastructure (P0–P2)

  • OpenCode junit-test + local-env + opencode.json
  • AGENTS subagent table + delegation order
  • docs/development testing + deploy notes
  • Expand pure API JUnit beyond smoke
  • Optional @android-deploy-jar (default D1)
  • D1/D2 serial keys documented for optional device UI smoke
  • tools/art-verify scaffold + offline unittest + @art-verify agent
  • Design: ui-ops-probe.md + ui-layer-verification.md + dual-track roadmap 6–8
  • Optional @android-arthas + android-arthas.md + ART_ARTHAS_PORT (not a default gate)

Product roadmap (from dual-track)

46. Traditional ECS convergence

Design: docs/design/traditional-ecs.md. Entity IDs only; components are data only; systems are stateless and own all ART interaction handling.

  • 46.0 Define strict ECS contract; add data-only entity identity, component query, and ordered stateless system pipeline with JUnit
  • 46.1 Registered presentation scopes share one ART world; scope close/reset now destroys only owned entities while preserving the registered context identity
  • 46.2 Materialize C1 declarations through ECS systems; control current values now live on ECS entities, control normalization runs during runtime ticks, WidgetSession is constructed as an immutable declaration/index compatibility data, C1 visual entities include ECS host-binding keys, and UiOps/probe/scene2d widgets/UiActions/FX read ECS values; WindowManager no longer owns a layout root map. C1 target/effect projection now consumes ECS frames only and StageHost reconciles its actor cache from ECS host bindings; context/entity lifecycle queries resolve registered ECS scope data, while signal callback objects remain a disposable host cache
  • [~] 46.3 Materialize STS observations and C2 surfaces through ECS systems; card projections now create/update/destroy shared-world entities and data-only card components, with frame lifecycle metadata, drag interaction metadata, and immutable frame snapshots on a projection root entity; card lookup, listing, counts, and cleanup now resolve through ECS card components, while the CardEntity compatibility view is derived on demand; C2 surface mount state and Entity lookup are now ECS-derived; native template facades no longer retain local active flags and template probe reads use ECS bind/pin/end-turn data
  • [~] 46.4 Route every native input/intercept through ECS input, action, intent, and result data; C2 surface submissions now record data-only action/intent/result components before and after the existing SignalBus compatibility executor, and the STS1 combat router records native input plus intercept decisions per surface ECS entity for hand, controls, and executor paths; native map, event, select, and end-turn hooks now record their unbound, emitted, disabled, and rejected paths through the same model
  • [~] 46.5 Derive all rendering/effects/skeleton host caches from ECS data; animation playback, pulse envelopes, and skeleton identity/snapshot state are ECS authoritative, while RenderHost C1/C2 item target caches are ECS-frame-derived; surface/full-frame and host resource paths now consume ECS render-state components; D1 d1_full_present_combat_ready passes
  • [~] 46.6 Derive Probe/API compatibility views from ECS only and remove legacy stores; C1 probe, lifecycle queries, render-state projection, and business confirmation are ECS-derived, while callback/resource caches remain explicit host boundaries

46.x completion checklist

  • 46.1.1 One ART World; context-owned entity index; scope close/reset isolation tests

  • 46.2.1 C1 control values and normalization are ECS authoritative

  • 46.2.2 C1 window/entity lifecycle, visibility, hierarchy, and host actor bindings are ECS data; StageHost reconciles actor objects through HostBindingComponent; scoped signals and callbacks are disposable host caches

  • 46.3.1 C2 card projection entities and card data components are ECS authoritative

  • 46.3.2 Projection root stores frame lifecycle, interaction, and immutable snapshot data

  • 46.3.3 C2 surface mount state and surface Entity identity are ECS authoritative

  • 46.3.4 Native template state is observed into ECS; bind, native component mounted state, event ID, end-turn enabled state, and map pins are ECS data while adapter callbacks remain host cache

  • 46.3.4a Native template bind/unbind state is stored in NativeTemplateStateComponent and runtime bound queries read the shared ECS world

  • 46.4.1 Surface action, intent identity, and immediate result are ECS recorded

  • 46.4.2 Combat router input/intercept records are ECS data per surface

  • 46.4.3 Map, event, select, and end-turn native hook records are ECS data per surface

  • [~] 46.4.4 Intent execution lifecycle records requested/sent/queued/rejected/confirmed in ECS; combat router now records requested/sent/executed/queued/rejected and the next authority-frame observation; business confirmation now records pending/confirmed/failed ECS data from card, map, event, reward, select, and room snapshot evidence

  • 46.4.5 Declarative signal connections/state-machine transitions are ECS data; subscriptions are cache-only, node state is stored in NodeStateComponent, and connection/legacy-trigger declarations are immutable ConnectionDeclarationsComponent data

  • 46.4.6 Node properties and effect attachments are immutable ECS values; writes replace the corresponding Component through PresentationWorld

  • [~] 46.5.1 C1/C2 render plans, effects, and profiles derive from ECS data only; animation playback and pulse state are data-only components, C1 declarations now materialize draw/bounds/ visibility/effects into ECS frames, C1 and active C2 item targets rebuild in shared projections, and EffectPulse, animation property effects, and Lightwave intensity replace ECS effect/property components before a C1 frame reprojects the host cache; surface/full-frame host APIs now consume RenderSurfaceComponent and FullFrameRenderComponent; D1 d1_full_present_combat_ready passes

  • [~] 46.5.2 Skeleton animation/pose/binding lifecycle derives from ECS data only; identity, frame, asset, pose, animation, and visual state are ECS components, while native binding lookup remains a provider cache pending D1 draw verification

  • [~] 46.5.3 EntityPresent slot identity, snapshot, and transform state are ECS components; EntitySlot is an on-demand immutable compatibility view and listeners are host callbacks; the RenderHost entity target cache rebuilds from ECS slot queries

  • [~] 46.6.1 UiProbe, UiOps, console, and inspect query ECS only; C1 UiOps control lookup and C1 window/component probe snapshots and native template pin/end-turn snapshots read ECS data, while C2 EntityPresent snapshots also read ECS data; C1 window control/title/profile probe fields now query registered context components directly, while console/render legacy paths remain; UiOps no longer retains a second last-result map

  • 46.6.2 Remove or demote remaining legacy stores after each matching checklist row passes

  • 0. Scaffold — registry API + tests

  • 1a. C1 logic runtime + layout DSL + demo resource + open dispatch

  • 1b. Stage host + StsSkin + StageBackend (optional on-device when D1 set)

  • 2. C2 map template intercept + pin decorator hooks (logic; patches later)

  • 3. C2 event/select/end-turn templates (logic; patches later)

  • 4. EntityPresent lifecycle API (logic; STS draw later)

  • 5. Consumer contract: versioned jar + compileOnly + MTS dep

6. UiOps / UiProbe (unified UI commands + snapshot)

  • 6.1 Pure UiOps / UiProbe / UiOpResult + FakeNativeOps + JUnit
  • 6.2 Select grid/hand + confirm ops
  • 6.3 Map node click + pin query on probe
  • 6.4 Event option + end-turn press ops
  • 6.5 Hand play gesture + C1 clickButton
  • 6.6 Console art probe / art op + StsNativeOps install

7. C2 SpirePatch thin hooks

  • 7.1 Map transition → NativeUiHooks.onMapNodeClick (BLOCK clears nextRoom)
  • 7.2 Grid confirm button → onSelectConfirm(GRID); grid/hand update observe stubs
  • 7.3 Event buttonEffect prefix → onEventOption
  • 7.4 EndTurn enable/disable(true) UI gates (no protocol broadcast)

8. UI-layer verification

  • 8.0 Fixture YAML + assert runner offline
  • 8.1 Device mode: Amethyst connector console + ART_PROBE log scrape (device_console.py)
  • 8.2 Fixture smoke: probe shape + C1 window + intercept-related template flags (JUnit owns BLOCK/ALLOW)
  • 8.3 Lab doc: android-device-lab.md (Amethyst D1 UI only)
  • 8.4 On-device pass of tests/ui-scenarios/device/* (D1 READY; enabled_mods + cold start)

9. Lab intercept + deploy hardening

  • 9.1 GateLab + console art gate … block|clear + JUnit
  • 9.2 Device scenario d1_gate_block_ops (ops under lab gate)
  • 9.3 scripts/ensure-enabled-mods.sh + deploy agent note
  • 9.4 Remove empty select update stub patches

10. Component composition framework

  • 10.1 Design: component-composition.md + component-layout-fx.md
  • 10.2 Pure UiNode AST + Nest containers (row/col/stack/panel/fragment)
  • 10.3 LayoutEngine bounds + id index (JUnit)
  • 10.4 ComponentRegistry + ref / slot expand (JUnit)
  • 10.5 UiNodeLoader JSON + shorthand props; legacy LayoutLoader still works
  • 10.6 Scenario fixtures / offline art-verify coverage for composition samples
  • 10.7 Leaf runtime (WidgetSession) + UiOps slider/hitarea/click + probe controls
  • 10.8 RenderHost + Effect/Shader registry + glow GLSL assets + entity Attach + probe render
  • 10.9 Composition Stage inflate (ComponentActors + attachComposition) + effect SpriteBatch draw
  • 10.10 ShaderRuntime compile path + glow ShaderProgram draw fallback + probe shader status
  • 10.11 FULL_FRAME enable/sync/bind + console artframework fx + StageHost screen bounds
  • 10.12 FrameCapture + blur/glass post-process + glass component + glass_demo layout

11. Godot-aligned UI core

Design: docs/design/godot-aligned-ui.md.

  • 11.0 Design: godot-aligned-ui.md + dual-track / composition / layout-fx / ui-ops-probe / AGENTS links
  • 11.1 UiInstance + UiTree + SignalHub (C1) + JUnit
  • 11.2 LayoutSpec size flags + minSize + LayoutEngine
  • 11.3 Theme MVP + StsTheme
  • 11.4 C1 widgets: textfield / checkbox / progress / scroll (priority order)
  • 11.5 C2 NativeControl (sts.*) + UiOps invoke + probe components
  • 11.6 API mount/unmount + HostBackend SPI + consumer.md
  • 11.7 Optional: C1 end-turn chrome pilot (endturn_chrome_pilot layout + JUnit)

12. ART Framework (presentation graph)

Design: docs/design/art-framework.md. Breaking identity rename done in phase 12.0 prep.

  • 12.0 Identity rename (artframework package/mod/jar/console/probe/env) + art-framework.md + task links
  • 12.1 Declared signals on AST + connect/emit validation + JUnit
  • 12.2 NodeRegistry / type SPI; loaders resolve registered types; namespaced third-party types
  • 12.3 LML → AST loader + resource dispatch (.json / .lml) + art-verify sample
  • 12.4 C1 node factory SPI; migrate ComponentActors built-ins
  • 12.5 RenderGraph / host render backend boundary (behavior-preserving)
  • 12.6 Built-in animation_player + shader_effect nodes
  • 12.7 Skeleton provider SPI + fake provider JUnit
  • 12.8 Native id namespace sts1.* + presenter bridge naming (consumer-visible)
  • 12.9 Signal completion: C2 native emit/validation, C1 interceptors, SignalHub sugar, registry defaults, stable anonymous keys, and legacy actor routing

13. Runtime hardening

  • 13.0 Freeze public IDs/API; canonical native aliases, handle lifecycle, and probe contract
  • 13.1 Unify UiTree / WidgetSession / Host lifecycle and cleanup guarantees
  • 13.2 Complete Host SPI capabilities, input, and unified tick
  • 13.3 Converge UiOps delegation and versioned UiProbe results
  • 13.4 Verify the C1 real input and signal loop on Stage/D1
  • 13.5 Harden C2 NativeControl lifecycle, payloads, and screen recreation
  • 13.6 Capability-aware render fallback and D1 effects verification
  • 13.7 Consumer fixture, API stability checklist, and release versioning

14. Component action convergence

  • 14.1 Route legacy C2 UiOps sugar through UiComponent.action; keep gate/gesture dispatch internal
  • 14.2 Expose mounted C1 windows as UiComponent actions and probe slices

15. Backend / full C2 present / HostAssets

Design: docs/design/backend-context.md, docs/design/c2-full-present.md, docs/design/host-assets.md.

Done (contract): pluggable Primary Backend + context frames; C2 full-present surfaces; HostAssets packs. Thin C2 intercept remains migration bridge. STS1 host draw for combat/map is milestone 16/19; event/select host draw is milestone 22.

  • 15.0 Design docs + task / AGENTS / design cross-links
  • 15.1 Context / Backend pure interfaces + FakeBackend frame/intent JUnit
  • 15.2 HostAssets pure merge/config/FakeHostAssets + JUnit (no GL)
  • 15.3 ResourceId conventions + minimal vanilla catalog (card / map / UI)
  • 15.4 ART draw paths through resolve (Theme icon/style + present hand art probe)
  • 15.5 Combat hand / card_slots snapshot hard-sync present (projection + probe)
  • 15.6 Drag / play intent + signal intercept chain (CardRef multi-instance)
  • 15.7 Map / controls / skeleton surfaces (full-present slices)
  • 15.8 Pack register API for beautify mods + probeAssets / console art assets
  • 15.9 Consumer notes: intents replace native UI callbacks; sts.* aliases

Default gate remains ./scripts/with-art-env.sh test. Device: optional D1 only.

16. STS1 full-present host implementation

Design: docs/design/backend-context.md, docs/design/c2-full-present.md, docs/design/host-assets.md.

15.x completed the host-agnostic contract and pure-logic surfaces. 16.x is the separate STS1 host/render/input implementation required before a surface may claim full-present D1 coverage.

  • 16.0 Strong typed frame views (ControlsView / MapView), scene epoch policy, PresentLevel OFF|OBSERVE|FULL + FullPresentMode probe; JUnit + f5 fixture
  • 16.1 Sts1PresentationBackend strong-typed snapshot + intent gate by present level (D1 probe optional; still READ_ONLY until 16.5 executor)
  • 16.1b D1 probe smoke: d1_full_present_observe / d1_full_present_combat_on (D1 PASS)
  • 16.2 STS1 HostAssets vanilla catalog (Sts1VanillaCatalog / Sts1HostAssets) + JUnit (texture handle materialization deferred to 16.3/16.4 draw path)
  • 16.3 C2 render plan: layers, BatchStateGuard, clip, overlay observe + JUnit (host SpriteBatch still delegates card.render; true atlas path in 16.4)
  • 16.4 Hand draw path + geometry compare (pure JUnit); host applies projection pose before card.render; D1 geometry fixture optional later
  • 16.4b Hand geometry compare remains pure JUnit (GeometryCompare); live D1 pose fixture optional when combat room scripted
  • 16.5 CombatInputRouter + IntentExecutor SPI + RecordingIntentExecutor JUnit; Sts1PresentationBackend delegates submitIntent; native input suppress flag (live STS play/drag executor host body still thin — uses Fake/Recording in tests)
  • 16.5b Sts1IntentExecutor (drag/play/end-turn/map ack) + hand input suppress patch; installed at PostInitialize; JUnit soft-reject without dungeon
  • 16.6 ControlsDrawPath + end-turn suppress patch + ART label draw when FULL; art present combat sets controls level; probe controlsDraw
  • 16.6b Covered by D1 d1_full_present_combat_on controlsDraw/presentLevel FULL
  • 16.7 MapDrawPath + MapPanZoom + hitTest + map suppress patch + art present map; JUnit + f10; D1 d1_full_present_map
  • 16.8 ArtAudioBridge + Sts1SkeletonBridge + host recreate cleanup via PresentSafety
  • 16.9 PresentSafety panic/clear-panic, probe matrix f11, consumer freeze notes, D1 d1_full_present_panic

17. Dev UI console (art ui)

Design: docs/design/dev-ui-console.md.

Inspect ART trees, emit signals, invoke actions, limited STS native dump/click for lab/D1. Does not block 16.x full-present host work.

  • 17.0 Design: dev-ui-console.md + task / ui-ops-probe / ui-layer-verification links
  • 17.1 Pure UiInspect + UiLabListeners + JUnit
  • 17.2 Console art ui list|tree|node|emit|invoke|listen
  • 17.3 StsUiReflect native dump/click whitelist
  • 17.4 Device scenario + D1 smoke (optional after deploy)

18. Lab run navigation (art lab)

Design: docs/design/lab-run-nav.md.

Atomic + composite console commands to reach main menu / fresh run / embark for D1 full-present scenarios. Lab-only (not consumer API).

  • 18.0 Design: lab-run-nav.md + task / console / device-lab links
  • 18.1 LabStateSnapshot / LabHost / FakeLabHost + art lab dump + JUnit
  • 18.2 L1: clear-saves / strip-resume / open-char-select / char / embark / seed
  • 18.3 L1: menu-click / abandon / abandon-confirm / return-menu / proceed
  • 18.4 L2: ensure-menu / ensure-fresh-menu / start-run + D1 YAML (d1_lab_*)
  • 18.5 Console art lab … + docs (console-commands, device-lab, ui-layer-verify)

19. STS1 full-present production readiness

  • 19.1 Effective capability state: FULL requires mounted scene + ready executor before ART suppresses native UI or owns input; probe state/reason + JUnit
  • 19.2 HostAssets-native hand/card draw path (no AbstractCard.render delegation); D1 fight Cultist combat-ready scenario confirms FULL_READY, native suppression, and ART hand draw
  • 19.3 HostAssets controls/map draw path + real STS1 map intent execution; D1 d1_full_present_map_ready (FULL_READY, texture nodes, art op map first leaves map)
  • 19.4 Scene lifecycle/recovery: PresentSafety matrix JUnit + D1 d1_full_present_lifecycle (combat FULL → map fallback → re-arm → panic/clear)
  • 19.5 Event/select full-present surfaces (sts1.event, sts1.select.grid|hand) + JUnit
  • 19.6 HostAssets consumer pack/release validation (ConsumerFixture + verify script)

20. Historical FrameSignal authority boundary

Design: backend-context.md.

  • Superseded by milestone 21; endpoint categories and transaction types were removed.

21. Unified SignalBus

  • 21.1 One ordered bus for C1, C2, frame, backend, and host signals; exact and regex subscriptions
  • 21.2 Generic continue / replace / stopHandled / stopRejected delivery decisions
  • 21.3 C2 imperative actions, native hooks, GateLab, full-present actions, and frame publish use bus delivery
  • 21.4 Remove FrameEndpoint transaction API and migrate fixtures to FakeSignalBackend
  • 21.5 HostPatchResults + hooks return SignalDispatchResult; patches use single adapter

22. STS1 event / select full-present host

19.5 delivered pure surfaces + FakeBackend JUnit (draw deferred). 22.x is the STS1 host draw / executor / suppress / D1 path for sts1.event and sts1.select.grid|hand.

  • 22.0 Design/task links + c2-full-present status note
  • 22.1 EventView / SelectView + ContextFrame + projection + JUnit
  • 22.2 SurfaceDrawPlan event/select + PresentSafety unmount + pipeline
  • 22.3 EventDrawPath / SelectDrawPath + renderer + backend snapshot + suppress patches
  • 22.4 Sts1IntentExecutor SELECT_* + StsNativeOps hand select
  • 22.5 Console art present event|select + probe eventDraw / selectDraw
  • 22.6 D1 YAML + consumer freeze notes

23. Release hardening

Post-22 product freeze for consumers. No new full-present surfaces in this milestone.

  • 23.0 Design/task status pass (c2-full-present / dual-track / AGENTS / README)
  • 23.1 API stability ↔ consumer freeze alignment
  • 23.2 Probe schema contract (v1 field groups)
  • 23.3 Consumer fixture expansion (frames / present / CardRef)
  • 23.4 Release gate script (scripts/release-gate.sh)
  • 23.5 CHANGELOG + versioning notes
  • 23.6 Version bump 1.0.0-alpha.3

24. EntityPresent host draw

Co-op chrome slots: typed snapshot → EntityDrawPath → probe → optional host paint. Combat HAND full-present remains authoritative for in-combat cards.

  • 24.0 Design note + task links (entity-present.md)
  • 24.1 Typed EntitySnapshot + parse helpers (JUnit)
  • 24.2 EntityDrawPath pure projection (JUnit)
  • 24.3 Probe entities.slots + RenderHost bounds by kind
  • 24.4 Policy: combat HAND FULL wins over EntityPresent CARD
  • 24.5 CARD host paint path (reuse hand renderer pattern; flag)
  • 24.6 RELIC icon path
  • 24.7 PLAYER / MONSTER minimal chrome path
  • 24.8 Skeleton PostRender draw when shouldDraw
  • 24.9 Offline fixture + optional D1 entity smoke

25. More STS1 full-present surfaces

Extend Backend scene() + View → DrawPath → suppress → executor → D1. Reuse 16/22 pipeline. Meta menus stay C1 + art lab.

Wave A — combat chrome

  • 25.1 sts1.combat.proceed (+ cancel) controls extension
  • 25.2 sts1.combat.energy orb present from ControlsView.energy

Wave B — run decisions

  • 25.3 sts1.reward.combat View / DrawPath / host / D1
  • 25.4 sts1.reward.card View / DrawPath / host / JUnit
  • 25.5 sts1.rest View / DrawPath / host / JUnit
  • 25.6 sts1.treasure View / DrawPath / host / JUnit
  • 25.7 sts1.shop View / DrawPath / host / JUnit
  • 25.8 sts1.reward.boss_relic View / path / JUnit

Wave C — HUD + combat clarity

  • 25.9 sts1.top_panel View / DrawPath / probe
  • 25.10 sts1.combat.intents observe-first path
  • 25.11 Console art present … + probe fields for new surfaces
  • 25.12 D1 YAML smoke for reward/rest (lab-reachable) + offline fixtures

26. Room FULL production readiness

Raise 25 room/chrome surfaces to combat/map-class FULL_READY (scene match + suppress + executor + host paint).

  • 26.0 Design/task matrix + c2-full-present / CHANGELOG status
  • 26.1 Capability / sceneReady for room surfaces (not mount-only) + JUnit
  • 26.2 Real room IntentExecutor gestures + soft-reject without dungeon + JUnit
  • 26.3 Suppress patches (reward/rest/shop/treasure) + shop/treasure/proceed render
  • 26.4 Probe capability fields + offline fixture f13_room_full_ready
  • 26.5 D1: reward capability fields + d1_full_present_combat_chrome

27. C1 / beautify components

  • 27.1 grid / tabs containers (LayoutEngine + Stage + sample layout)
  • 27.2 HostAssets beautify pack sample JUnit
  • 27.3 Register grid_tabs_demo window

28. Release hardening (alpha.4)

  • 28.1 Known-limits / consumer freeze notes refresh
  • 28.2 Version bump 1.0.0-alpha.4 + CHANGELOG

29. PresentProfile + Lightwave (theme / cascade / declarative)

Design: PresentProfile aggregates Theme + PresentChromeStyle + optional pack; not a mid-draw RenderInterceptor. Suppress still owned by FullPresentMode.

  • 29.1 PresentProfile / PresentProfiles + sts / lightwave builtins + probe
  • 29.2 LightwaveTheme (semi-transparent panel, white border, cool accent, Card alpha)
  • 29.3 Theme cascade: font/icon/style + themeType variation
  • 29.4 Declarative present_profile / theme on window root + JUnit

30. Lightwave FX + animation triggers + demo

  • 30.1 LightwaveEffect + GLSL + fallback strips + art fx lightwave
  • 30.2 White border via effect fallback / chrome tokens
  • 30.3 animation_player auto_play + triggers (no new LML component type)
  • 30.4 C1 opacity prop applied on actors
  • 30.5 layouts/lightwave_demo.json + window register

31. C1 StsSkin from Theme

  • 31.1 StsSkin.create(Theme) + pure mapping helpers JUnit
  • 31.2 StageHost uses Themes.getDefault() at init

32. C2 PresentChromeStyle consumption

  • 32.1 PresentChromeStyle + fromTheme / probe
  • 32.2 Hand card alpha + white border; controls label colors from chrome
  • 32.3 HandDrawPath probe includes chrome + presentProfile

33. Console / docs / scenarios

  • 33.1 art profile|theme list|get|set
  • 33.2 Offline fixture f14_present_profile_lightwave + D1 d1_lightwave_demo
  • 33.3 task / design / CHANGELOG notes

34. Node-scoped PresentProfile (no process active)

Design: Present resources + ProjectPresent fallback + art.present_profile attach/override; effects stay explicit nodes. See present-profile.md.

  • 34.1 ProjectPresent + PresentResolve + PresentBinding / PresentMode
  • 34.2 Remove process active; registry is resources only
  • 34.3 UiTree/UiInstance resolve; root sugar + art.present_profile
  • 34.4 C1 StageHost + C2 chrome via resolve / project
  • 34.5 Probe projectPresent + windows.*.present; console project/resolve
  • 34.6 JUnit + f14 + d1_lightwave_demo (node assert, no global set required)

35. Present production (hot restyle / C2 surface / pack)

Design: close Known limits from PresentProfile/Lightwave showcase — restyle open C1, surface-scoped chrome, packId → HostAssets. See present-profile.md.

  • 35.1 Hot restyle: project/present change refreshes trees + re-attaches Stage (project-fallback windows)
  • 35.2 SurfacePresent bind + PresentResolve.chromeForSurface for C2 draw paths
  • 35.3 C2 chrome expand: event/select/room/proceed/energy/intents/top labels via chrome
  • 35.4 packId → HostAssets prefer/enable + JUnit + probe
  • 35.5 API stability + CHANGELOG notes (setProjectPresent restyles; SurfacePresent)

36. Lightwave visual deepen (optional polish)

  • 36.1 Lightwave border/band tokens from effect params (theme-aligned defaults)
  • 36.2 glass_lightwave_demo layout (glass + lightwave co-window)
  • 36.3 Third-party PresentProfile register sample JUnit (namespaced theme + chrome)

37. Global PresentProfile catalog (skin register facade)

Design: PresentProfiles is the sole skin resource catalog; facade register ≠ apply. See present-profile.md.

  • 37.1 PresentProfiles.register syncs Themes (name / profile id)
  • 37.2 ArtFramework.registerPresentProfile / get / ids / presentProfiles()
  • 37.3 JUnit PresentProfileCatalogTest (register no apply; set applies; reset)
  • 37.4 Probe presentProfiles + f16 fixture; design / api-stability / consumer

38. PresentPack + enabled profiles (regex select/modify)

Design: Profile = skin; Pack = LML/JSON templates + windows. Select profile → activate pack by packId / profileId link. No profile-id special cases in core. Regex enable/select/modify.

  • 38.1 PresentPack / PresentPacks / manifest loader
  • 38.2 activate/deactivate → ComponentRegistry + WindowDef
  • 38.3 ProjectPresent.setactivateForProfile
  • 38.4 EnabledPresents + regex select/modify + packId patch
  • 38.5 Builtin lightwave pack + facade / probe / console
  • 38.6 JUnit PresentPackTest + f18 + D1 d1_present_packs

39. Signal wiring aligned with bus (exact + regex)

Design: node-signal-runtime.md. Backend ↔ Signal ↔ Node.

  • 39.1 SignalHub / UiTree.connectBus exact + Pattern
  • 39.2 NodeConnections + connections decl; legacy triggers normalize
  • 39.3 JUnit exact / regex / unmount clear

40. UiActions (full builtin set)

  • 40.1 UiActions registry + ArtFramework.registerUiAction
  • 40.2 Builtins: play/pause/stop/resume/set_prop/pulse_effect/emit/close_window
  • 40.3 PropEffectBridge + EffectPulse (signal path for lightwave pulse)
  • 40.4 JUnit actions + third-party register + pulse binding

41. NodeStateMachine + AnimationPlayer once/loop/pause

  • 41.1 NodeStateMachine / NodeStateMachines from states decl
  • 41.2 AnimationPlayer pause/resume/loop + state idle/playing/paused
  • 41.3 Signals paused/resumed/looped; JUnit

42. Integration / demo / docs / D1

  • 42.1 lightwave_demo connections (pulse_effect + set_prop); no imperative ok pulse
  • 42.2 Design node-signal-runtime.md + task / consumer notes
  • 42.3 D1 d1_node_connections + existing d1_lightwave_demo

43. C2 Lightwave chrome + surface FX

  • 43.1 Baseline coverage and C2 surface target lifecycle
  • 43.2 Surface chrome panels/borders for ART-owned C2 draw regions
  • 43.3 Pack-driven per-surface LightwaveEffect bindings with inactive-surface cleanup
  • 43.4 Probe + offline fixture + C2LightwaveSurfaceTest
  • 43.5 D1 d1_lightwave_c2_full scenario for combat C2 visual verification

44. Spine 4.2 present architecture

Design: docs/design/spine42-present.md.

Boundary: STS2 assets are never committed or packaged. Spine runtime users must satisfy the Spine Runtime license; 4.2 runtime integration is provider-side and kept separate from core presentation contracts.

  • 44.1 Design: Spine 4.2 present architecture, license/resource boundary, dual provider plan
  • 44.2 Pure atlas 4.x parser for compact bounds / offsets / rotate:90 regions
  • 44.3 AnimState, AnimGraph, SkeletonMixTable, and STS2-style SkeletonAnimator
  • 44.4 Extended SkeletonProvider commands with fake-provider JUnit coverage
  • 44.5 STS1 Spine 3.4 provider baseline using host-bundled runtime
  • 44.6 Spine 4.2 provider probe shell for shaded runtime detection and safe degradation
  • 44.7 JUnit coverage for parser, graph, animator, provider commands, and provider probes
  • 44.8 Optional spine42-runtime sub-build: relocated runtime jar, Java 8 output, license, and artifact allowlist verification; separate from the main jar and test lifecycle
  • 44.9 ART_STS2_ROOT local asset bundle script and gitignored Sts2Assets.jar
  • 44.10 Independent tests/spine42-assets bundle checks; standard JUnit has no asset dependency
  • 44.11 Developer runtime loader, device asset deployment, and spine42 dev console controls
  • 44.12 D1 resource status/load/animation/lifecycle scenario skeletons

45. Unified Presentation Entity Runtime

Design: docs/design/presentation-entity-runtime.md.

  • 45.1 Add dependency-neutral presentation runtime: context, stable keys, common entity components, immutable frame snapshots, and pure ECS tests.
  • 45.2 Replace UiInstance and the temporary object-tree facade with PresentationContext + EntityId; migrate lifecycle, path lookup, props, theme resolution, and public API.
  • 45.3 Migrate signals, declarative connections, state machines, and animation to node/entity identity while retaining declared-port and first-stop semantics.
  • 45.4 Migrate C1 Stage materialization and render synchronization to presentation frames.
  • 45.5 Migrate C2 surfaces, projection items, entity present, and skeleton lifecycle into the unified context; retain STS policy and intent authority in the host adapter.
  • 45.6 Derive render attachments from entities; migrate Lightwave chrome/effects to exact visual-item attachments and remove target-map authority.
  • 45.7 Replace legacy runtime/docs/fixtures and complete JUnit, offline verifier, and D1 C1/C2 visual verification.
  • 44.13 D1 data-path evidence: source-patched runtime loads a real 4.2 .skel, animates, reports a bone transform, and cleans lifecycle state; pixel renderer intentionally deferred