Checkbox list for open work. Tick when done; milestone notes stay short.
- OpenCode
junit-test+local-env+opencode.json - AGENTS subagent table + delegation order
-
docs/developmenttesting + 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-verifyscaffold + offline unittest +@art-verifyagent - 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)
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_readypasses - [~] 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.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
NativeTemplateStateComponentand 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 immutableConnectionDeclarationsComponentdata -
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
RenderSurfaceComponentandFullFrameRenderComponent; D1d1_full_present_combat_readypasses -
[~] 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;
EntitySlotis 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.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+StsNativeOpsinstall
- 7.1 Map transition →
NativeUiHooks.onMapNodeClick(BLOCK clears nextRoom) - 7.2 Grid confirm button →
onSelectConfirm(GRID); grid/hand update observe stubs - 7.3 Event
buttonEffectprefix →onEventOption - 7.4 EndTurn enable/disable(true) UI gates (no protocol broadcast)
- 8.0 Fixture YAML + assert runner offline
- 8.1 Device mode: Amethyst connector console +
ART_PROBElog 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.1
GateLab+ consoleart 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.1 Design:
component-composition.md+component-layout-fx.md - 10.2 Pure
UiNodeAST + Nest containers (row/col/stack/panel/fragment) - 10.3
LayoutEnginebounds + id index (JUnit) - 10.4
ComponentRegistry+ref/slotexpand (JUnit) - 10.5
UiNodeLoaderJSON + shorthand props; legacyLayoutLoaderstill 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 +
glasscomponent + glass_demo layout
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
LayoutSpecsize 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 + probecomponents - 11.6 API mount/unmount +
HostBackendSPI + consumer.md - 11.7 Optional: C1 end-turn chrome pilot (
endturn_chrome_pilotlayout + JUnit)
Design: docs/design/art-framework.md. Breaking identity rename done in phase 12.0 prep.
- 12.0 Identity rename (
artframeworkpackage/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
ComponentActorsbuilt-ins - 12.5 RenderGraph / host render backend boundary (behavior-preserving)
- 12.6 Built-in
animation_player+shader_effectnodes - 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.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.1 Route legacy C2 UiOps sugar through
UiComponent.action; keep gate/gesture dispatch internal - 14.2 Expose mounted C1 windows as
UiComponentactions and probe slices
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 +
FakeBackendframe/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 (
CardRefmulti-instance) - 15.7 Map / controls / skeleton surfaces (full-present slices)
- 15.8 Pack register API for beautify mods +
probeAssets/ consoleart 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.
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,PresentLevelOFF|OBSERVE|FULL +FullPresentModeprobe; JUnit + f5 fixture - 16.1
Sts1PresentationBackendstrong-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 combatsets controls level; probecontrolsDraw - 16.6b Covered by D1
d1_full_present_combat_oncontrolsDraw/presentLevel FULL - 16.7 MapDrawPath + MapPanZoom + hitTest + map suppress patch +
art present map; JUnit + f10; D1d1_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
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
StsUiReflectnative dump/click whitelist - 17.4 Device scenario + D1 smoke (optional after deploy)
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.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.renderdelegation); D1fight Cultistcombat-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 firstleaves 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)
Design: backend-context.md.
- Superseded by milestone 21; endpoint categories and transaction types were removed.
- 21.1 One ordered bus for C1, C2, frame, backend, and host signals; exact and regex subscriptions
- 21.2 Generic
continue/replace/stopHandled/stopRejecteddelivery 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 returnSignalDispatchResult; patches use single adapter
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
SurfaceDrawPlanevent/select + PresentSafety unmount + pipeline - 22.3
EventDrawPath/SelectDrawPath+ renderer + backend snapshot + suppress patches - 22.4
Sts1IntentExecutorSELECT_* +StsNativeOpshand select - 22.5 Console
art present event|select+ probeeventDraw/selectDraw - 22.6 D1 YAML + consumer freeze notes
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
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
EntityDrawPathpure 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
Extend Backend scene() + View → DrawPath → suppress → executor → D1.
Reuse 16/22 pipeline. Meta menus stay C1 + art lab.
- 25.1
sts1.combat.proceed(+ cancel) controls extension - 25.2
sts1.combat.energyorb present from ControlsView.energy
- 25.3
sts1.reward.combatView / DrawPath / host / D1 - 25.4
sts1.reward.cardView / DrawPath / host / JUnit - 25.5
sts1.restView / DrawPath / host / JUnit - 25.6
sts1.treasureView / DrawPath / host / JUnit - 25.7
sts1.shopView / DrawPath / host / JUnit - 25.8
sts1.reward.boss_relicView / path / JUnit
- 25.9
sts1.top_panelView / DrawPath / probe - 25.10
sts1.combat.intentsobserve-first path - 25.11 Console
art present …+ probe fields for new surfaces - 25.12 D1 YAML smoke for reward/rest (lab-reachable) + offline fixtures
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.1
grid/tabscontainers (LayoutEngine + Stage + sample layout) - 27.2 HostAssets beautify pack sample JUnit
- 27.3 Register
grid_tabs_demowindow
- 28.1 Known-limits / consumer freeze notes refresh
- 28.2 Version bump
1.0.0-alpha.4+ CHANGELOG
Design: PresentProfile aggregates Theme + PresentChromeStyle + optional pack; not a mid-draw RenderInterceptor. Suppress still owned by FullPresentMode.
- 29.1
PresentProfile/PresentProfiles+sts/lightwavebuiltins + probe - 29.2
LightwaveTheme(semi-transparent panel, white border, cool accent, Card alpha) - 29.3 Theme cascade: font/icon/style +
themeTypevariation - 29.4 Declarative
present_profile/themeon window root + JUnit
- 30.1
LightwaveEffect+ GLSL + fallback strips +art fx lightwave - 30.2 White border via effect fallback / chrome tokens
- 30.3
animation_playerauto_play+triggers(no new LML component type) - 30.4 C1
opacityprop applied on actors - 30.5
layouts/lightwave_demo.json+ window register
- 31.1
StsSkin.create(Theme)+ pure mapping helpers JUnit - 31.2 StageHost uses
Themes.getDefault()at init
- 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.1
art profile|theme list|get|set - 33.2 Offline fixture
f14_present_profile_lightwave+ D1d1_lightwave_demo - 33.3 task / design / CHANGELOG notes
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)
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
SurfacePresentbind +PresentResolve.chromeForSurfacefor 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.1 Lightwave border/band tokens from effect params (theme-aligned defaults)
- 36.2
glass_lightwave_demolayout (glass + lightwave co-window) - 36.3 Third-party PresentProfile register sample JUnit (namespaced theme + chrome)
Design: PresentProfiles is the sole skin resource catalog; facade register ≠ apply.
See present-profile.md.
- 37.1
PresentProfiles.registersyncsThemes(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
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.set→activateForProfile - 38.4
EnabledPresents+ regex select/modify + packId patch - 38.5 Builtin lightwave pack + facade / probe / console
- 38.6 JUnit
PresentPackTest+ f18 + D1d1_present_packs
Design: node-signal-runtime.md. Backend ↔ Signal ↔ Node.
- 39.1
SignalHub/UiTree.connectBusexact +Pattern - 39.2
NodeConnections+connectionsdecl; legacytriggersnormalize - 39.3 JUnit exact / regex / unmount clear
- 40.1
UiActionsregistry +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.1
NodeStateMachine/NodeStateMachinesfromstatesdecl - 41.2 AnimationPlayer pause/resume/loop + state idle/playing/paused
- 41.3 Signals paused/resumed/looped; JUnit
- 42.1
lightwave_democonnections (pulse_effect + set_prop); no imperative ok pulse - 42.2 Design
node-signal-runtime.md+ task / consumer notes - 42.3 D1
d1_node_connections+ existingd1_lightwave_demo
- 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_fullscenario for combat C2 visual verification
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:90regions - 44.3
AnimState,AnimGraph,SkeletonMixTable, and STS2-styleSkeletonAnimator - 44.4 Extended
SkeletonProvidercommands 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-runtimesub-build: relocated runtime jar, Java 8 output, license, and artifact allowlist verification; separate from the main jar and test lifecycle - 44.9
ART_STS2_ROOTlocal asset bundle script and gitignoredSts2Assets.jar - 44.10 Independent
tests/spine42-assetsbundle checks; standard JUnit has no asset dependency - 44.11 Developer runtime loader, device asset deployment, and
spine42dev console controls - 44.12 D1 resource status/load/animation/lifecycle scenario skeletons
Design: docs/design/presentation-entity-runtime.md.
- 45.1 Add dependency-neutral
presentationruntime: context, stable keys, common entity components, immutable frame snapshots, and pure ECS tests. - 45.2 Replace
UiInstanceand the temporary object-tree facade withPresentationContext+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