@tony01/astroneum 0.4.1-beta.2 → 0.4.1-beta.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +280 -237
  2. package/LICENSE +21 -21
  3. package/README.md +250 -198
  4. package/dist/{Indicator-BBI3L_lx.d.ts → Indicator-BQQcVGGT.d.ts} +51 -227
  5. package/dist/astroneum.css +1 -1
  6. package/dist/chunk-47YGQEL5.js +399 -0
  7. package/dist/chunk-67XM5LOK.js +2 -0
  8. package/dist/{chunk-2YYGUSVX.js → chunk-DFJMDDL5.js} +1 -1
  9. package/dist/chunk-EFAS6F4C.js +59 -0
  10. package/dist/chunk-EHZN52CY.js +2 -0
  11. package/dist/chunk-HKLWNPMP.js +35 -0
  12. package/dist/chunk-ONPPQW65.js +2 -0
  13. package/dist/chunk-SCTHEM27.js +3 -0
  14. package/dist/chunk-UQXYMB6X.js +2 -0
  15. package/dist/chunk-WSIR5T2M.js +3 -0
  16. package/dist/entries/alerts.d.ts +36 -10
  17. package/dist/entries/alerts.js +1 -1
  18. package/dist/entries/datafeeds/crypto.d.ts +5 -1
  19. package/dist/entries/datafeeds/crypto.js +1 -1
  20. package/dist/entries/datafeeds/polygon.d.ts +3 -1
  21. package/dist/entries/datafeeds/polygon.js +1 -1
  22. package/dist/entries/headless.d.ts +78 -0
  23. package/dist/entries/headless.js +2 -0
  24. package/dist/entries/multichart.d.ts +12 -1
  25. package/dist/entries/multichart.js +1 -1
  26. package/dist/entries/replay.d.ts +3 -1
  27. package/dist/entries/script.d.ts +2 -68
  28. package/dist/entries/script.js +1 -1
  29. package/dist/entries/watchlist.d.ts +32 -2
  30. package/dist/entries/watchlist.js +1 -1
  31. package/dist/entries/workspace.d.ts +61 -0
  32. package/dist/entries/workspace.js +2 -0
  33. package/dist/index-BiXdqLA4.d.ts +45 -0
  34. package/dist/index-_JgHTy8X.d.ts +19 -0
  35. package/dist/index.d.ts +188 -27
  36. package/dist/index.js +1 -1
  37. package/dist/script-BU9StbN-.d.ts +120 -0
  38. package/dist/types-W6SIYQ9m.d.ts +232 -0
  39. package/dist/types-yETgeYsE.d.ts +28 -0
  40. package/dist/zh-CN-NDTUDZGZ.js +3 -0
  41. package/docs/MIRROR-PLAN-SYMBOL-SEARCH-WATCHLIST.md +255 -0
  42. package/docs/STRUCTURE.md +51 -37
  43. package/docs/TODO-DESIGN.md +111 -37
  44. package/docs/TODO.md +26 -16
  45. package/docs/WORKSTREAMS.md +55 -0
  46. package/docs/api.md +655 -528
  47. package/docs/datafeed-guide.md +329 -311
  48. package/docs/design-astroneum.md +204 -65
  49. package/docs/plugin-development.md +569 -565
  50. package/docs/tv-functions-skill.md +88 -64
  51. package/package.json +158 -147
  52. package/dist/chunk-4YOLQ5DC.js +0 -2
  53. package/dist/chunk-I4YQBP2M.js +0 -3
  54. package/dist/chunk-OOMZRONH.js +0 -35
  55. package/dist/chunk-PV2GAINM.js +0 -2
  56. package/dist/chunk-YW3STIPY.js +0 -653
  57. package/dist/zh-CN-Y2C6RSOI.js +0 -3
package/docs/TODO.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Astroneum — TODO & Feature-Gap Backlog
2
2
 
3
3
  > **Actionable gap index.** One row per gap with status + next action. Shipped items (no gap) are omitted — they live in `docs/tv-functions-skill.md` §3 as `widget-native` / `api-bridged`.
4
- > **Last updated:** 2026-07-08
5
- > Deployed at: `https://72.62.73.180/astroneum/` · Library `astroneum` v0.4.1-beta.2 · Demo app `astroneum-demo-next`
4
+ > **Last updated:** 2026-07-12
5
+ > Deployed at: `https://72.62.73.180/astroneum/` · Library `@tony01/astroneum` v0.4.1-beta.24 · Demo app `astroneum-demo-next`
6
6
  >
7
7
  > **Authority:** TV-vs-Astroneum status lives in `docs/tv-functions-skill.md` §3 (6-bucket taxonomy). This file is the scannable gap index. When statuses conflict, tv-functions-skill.md wins.
8
8
  > **Update this file on every functional change** (see §Maintenance).
@@ -55,7 +55,7 @@
55
55
  | # | Feature | Status | Gap / next action |
56
56
  |---|---|---|---|
57
57
  | 3.4 | `ta.*` subset (sma/ema/rsi/macd/bbands) | 🔧 | Limited set. Expand per §3.14 |
58
- | 3.5 | `strategy()` + `strategy.*` family | ❌ | No backtest runtime. Blocks #4 |
58
+ | 3.5 | Bounded `strategy()` signal contract | 🔧 | `ScriptEngine.compileStrategy()` accepts deterministic `strategySignals()` output and runs the local backtest core; Pine-compatible `strategy.*` semantics remain incomplete |
59
59
  | 3.6 | `request.security` (multi-TF) | ❌ | Library has `resampleBars`/`mtfIndicator` — expose in script |
60
60
  | 3.7 | `request.financial / quandl / seed / splits / dividends` | ❌ | v2-future |
61
61
  | 3.8 | `table.new / table.cell / merge_cells` | ❌ | Needed for strategy dashboard (#4) |
@@ -71,12 +71,12 @@
71
71
 
72
72
  | # | Feature | Status | Gap / next action |
73
73
  |---|---|---|---|
74
- | 4.1 | Strategy Tester panel | ❌ | `StrategyTesterPanel` = stub ("No strategy running") |
75
- | 4.2 | Backtest engine (replay trades on history) | ❌ | Needs `strategy()` runtime (#3.5) |
76
- | 4.3 | Performance summary (net profit, PF, expected payoff, B&H, DD, sharpe, sortino) | ❌ | — |
77
- | 4.4 | Trade list (entry/exit/P&L) | ❌ | — |
78
- | 4.5 | Equity curve | ❌ | — |
79
- | 4.6 | Drawdown curve | ❌ | — |
74
+ | 4.1 | Strategy Tester panel | ✅ | `PineEditorPanel` compiles bounded strategies and `ChartTerminal` runs them against current chart history; `StrategyTesterPanel` consumes the result |
75
+ | 4.2 | Backtest engine (replay trades on history) | 🔧 | Deterministic bar-close engine is live against current history; replay lifecycle integration remains |
76
+ | 4.3 | Performance summary (net profit, PF, expected payoff, B&H, DD, sharpe, sortino) | ✅ | Runtime report supplies all listed metrics |
77
+ | 4.4 | Trade list (entry/exit/P&L) | 🔧 | Runtime trades render; pagination/filtering remain |
78
+ | 4.5 | Equity curve | 🔧 | Runtime equity values render as a list; visual curve remains |
79
+ | 4.6 | Drawdown curve | 🔧 | Runtime drawdown values render in equity rows; visual curve remains |
80
80
  | 4.7 | Trade markers on chart | ❌ | Library has overlay API — add entry/exit arrows |
81
81
  | 4.8 | Strategy properties (commission/slippage/capital/sizing) | ❌ | Config UI for `strategy()` args |
82
82
  | 4.9 | 38-row on-chart dashboard | ❌ | Needs `table.*` (#3.8). Spec in §3.16 |
@@ -113,8 +113,8 @@
113
113
  | 7.1 | Chart right-click context menu | ⏳ | v1-in-scope (design §11). Not built. `ContextMenu.tsx` |
114
114
  | 7.2 | Crosshair OHLC legend / data window | ⏳ | v1-in-scope (design §11). Not built. `OhlcLegend.tsx` |
115
115
  | 7.3 | TopBar (symbol/timeframe/chart-type/indicators) | 🔧 | Library `PeriodBar` + demo brand bar. Hotkeys: `/` `Alt+A` `Shift+F` `Ctrl+Z/Y`. Undo/redo (`UndoManager`) + Save/Load (`SaveLoadMenu`) wired. Remaining gap: 1.5 `,` interval dropdown (library `PeriodBar` pass). See `TODO-DESIGN.md` §1 |
116
- | 7.4 | LeftToolbar (drawing tools dock) | 🔧 | Library has 20 tools; dock UI partial. See `TODO-DESIGN.md` §2 |
117
- | 7.5 | RightRail (watchlist + details) | ✅ | `SidebarContent` toggle bar (7 tabs) + `WatchlistPanel`/`AlertsPanel`/`StubPanel`. See `TODO-DESIGN.md` §3 |
116
+ | 7.4 | LeftToolbar (drawing tools dock) | 🔧 | `DrawingBar` is the sole left rail and remains pinned through the bottom dock. Batch A shipped cursor submenu, measure, zoom, keep-drawing toggle, Ctrl+Alt+H hide-all. Batch B shipped forecasting group (12 tools in 3 sections) + fixed popup clipping (overflow moved to `@media max-height:620px`). Remaining gaps: brush/freehand, text/note/label, favorite drawings, some fib/pattern variants. See `TODO-DESIGN.md` §2. |
117
+ | 7.5 | RightRail (watchlist + details) | 🔧 | Shipped persistent outer-right 5-tab strip with left-opening panel body; Watchlist/Details/News sub-tabs; horizontal list tabs; sortable quote columns; context actions; list toolbar; empty/retry states; cross-list drag; colors; view presets; column chooser; validated search; and live quote polling. Remaining: drag-reorder list tabs and inferred Hide/Lock row actions. Fundamentals/P&L remain 🟦 v1.1. See `TODO-DESIGN.md` §3 |
118
118
  | 7.6 | Multi-chart grid (2/4/8/16) | ✅ | `LayoutPicker` in demo topbar (1/2/4/8/16). `MultiChartView` renders grid. See `TODO-DESIGN.md` §1.15 |
119
119
  | 7.7 | Multi-period stacked | 🟦 | Library supports (`MultiPeriodLayout`); app deferred v1.1 |
120
120
  | 7.8 | Compare / overlay | 🟦 | Library supports (`createCompareIndicator`); app deferred v1.1 |
@@ -123,10 +123,10 @@
123
123
  | 7.11 | Light theme | ⟫ | Library supports; v1 dark-only |
124
124
  | 7.13 | Full mobile/touch UX | ⟫ | v1 collapses to chart-only <lg |
125
125
  | 7.14 | Logo / brand mark | ⟫ | Separate design pass |
126
- | 7.15 | Drawing tools (20 vs TV ~50) | 🔧 | Missing: brush/freehand, text/note/label, some fib variants. See `TODO-DESIGN.md` §2 |
127
- | 7.16 | Bottom dock tab bar | ✅ | `DockContent` tab bar (Pine/Strategy/Trading) + collapse toggle. See `TODO-DESIGN.md` §4 |
126
+ | 7.15 | Drawing tools (32 vs TV ~50) | 🔧 | Batch A shipped cursor submenu, measure, zoom, keep-drawing toggle, hide-all hotkey, icon/i18n fixes. Batch B shipped forecasting group (12 tools: long/short position, position forecast, bars pattern, ghost feed, sector, anchored VWAP, fixed/anchored volume profile, price/date/date+price range). Fixed popup clipping bug (demo/terminal.css overflow override moved to @media max-height:620px). Missing: brush/freehand, text/note/label, favorite drawings, some fib/pattern variants. See `TODO-DESIGN.md` §2 |
127
+ | 7.16 | Bottom dock tab bar | ✅ | Persistent Pine/strategy/trading panels, report tab menu, More menu, resize, fixed-overlay maximize, collapse, and keyboard navigation. CSS Grid guarantees the dock begins right of the pinned drawing rail without chart bleed or rail reflow. See `TODO-DESIGN.md` §4 |
128
128
  | 7.17 | Footer date-range navigator | ✅ | `DateRangeNavigator` — 7 presets + live visible-range readout. Engine bridge via `ChartPlugin`. See `TODO-DESIGN.md` §6 |
129
- | 7.18 | Shell collapse persistence + responsive <lg | ✅ | `TerminalShell` sidebar/dock collapse state in `localStorage` key `astroneum:shell` (decoupled from chart `serializeState`). `@media(max-width:1024px)` hides rail, forces sidebar+dock collapsed, slims topbar. FAB overlay deferred v1.1. See `TODO-DESIGN.md` §0 |
129
+ | 7.18 | Shell collapse persistence + responsive <lg | ✅ | `TerminalShell` sidebar/dock collapse state in `localStorage` key `astroneum:shell` (decoupled from chart `serializeState`). On desktop, a collapsed sidebar retains its 52px icon strip; below `1024px`, the rail is hidden and sidebar/dock collapse. FAB overlay deferred v1.1. See `TODO-DESIGN.md` §0 |
130
130
  | 7.28 | Pattern dialog / auto-detection | 🔧 | `PatternDialog` exists; auto-detection via `zigzagPlugin` |
131
131
 
132
132
  ## 8. DB / persistence / auth → (no existing doc — new territory)
@@ -163,10 +163,11 @@
163
163
  | 10.2 | Playwright visual regression | ❌ | Deferred (CHANGELOG §0.3.0) |
164
164
  | 10.3 | Mobile audit | ❌ | Deferred |
165
165
  | 10.4 | Storybook site | ❌ | Deferred |
166
- | 10.5 | i18n — 19 locales | 🔧 | Only en-US + zh-CN carry new alert keys; 16 fall back to en-US. Translate |
166
+ | 10.5 | i18n — 18 locale JSON files | 🔧 | Only en-US + zh-CN carry new alert/drawing keys; 16 fall back to en-US. Translate |
167
167
  | 10.8 | Datafeed — WebTransport (HTTP/3) | 🔧 | Experimental `WebTransportDatafeed` |
168
168
  | 10.9 | Datafeed — stock/forex/futures (beyond Polygon) | ❌ | — |
169
- | 10.10 | BYO datafeed docs / examples | 🔧 | 4-method interface exists; `datafeed-guide.md` present. More examples |
169
+ | 10.10 | BYO datafeed docs / examples | 🔧 | Four required methods plus optional `getQuotes?` are documented in `datafeed-guide.md`; add more production REST/WebSocket examples |
170
+ | 10.11 | Headless engine package | ✅ | Released in `@tony01/astroneum@0.4.1-beta.24`; the supported headless entry has no React/widget/datafeed/style/network/keyboard dependency, and its direct bars, typed outputs, bounded viewport recovery, screenshot, lifecycle, SSR, package, size, multi-instance, hidden-container, and Chromium gates pass. |
170
171
 
171
172
  ## 11. Out of scope (v2-future — noted, not tracked)
172
173
 
@@ -214,6 +215,15 @@ On invocation ("refresh todo"), re-scan the live tree (`/opt/astroneum` + `demo/
214
215
 
215
216
  ## Changelog
216
217
 
218
+ - **2026-07-13** — Watchlist v1 implementation. Shipped horizontal list tabs and overflow, validated symbol search, sortable configurable quote columns, Simple/Advanced presets, list actions and colors, keyboard/context actions, same-list and cross-list symbol drag, Watchlist/Details/News sub-tabs, 5-item rail, and quote error recovery. Added optional `Datafeed.getQuotes`, Binance/Bitget/OKX snapshot adapters, persisted `WatchlistManager` configuration, non-persisted live quote updates, and manager/datafeed tests. Remaining gaps: drag-reorder list tabs, inferred Hide/Lock actions, fundamentals/P&L, and a real news provider.
219
+
220
+ - **2026-07-12** — §7.5 watchlist full TV parity spec. Three-tier plan: Tier 1 (A1-A8 pure UI), Tier 2 (B1 fold Details+News into watchlist panel as sub-tabs — sidebar 7→5 tabs; B2 Advanced/Simple toggle; B3 column chooser), Tier 3 (C1 `Datafeed.getQuotes?` + 2s quote polling; C2 `SymbolSearchModal` replaces text input; C3 error/retry states; C4 fundamentals/P&L deferred 🟦 v1.1). Added rows 7.5a (getQuotes), 7.5b (WatchlistManager API extensions), 7.5c (quote polling hook), 7.5d (symbol validation). Updated 7.5 🔧→⏳, 10.10 (getQuotes noted). All marked ⏳ (spec'd, not yet built). See `TODO-DESIGN.md` §3b for design rows.
221
+
222
+ - **2026-07-12** — Dock/runtime pass: bounded scripts compiled in Pine Editor now run through `BacktestEngine` against `AstroneumHandle.getDataList()`. The Strategy Tester consumes the runtime result; performance metrics include expected payoff, Sharpe, and Sortino. Dock report tabs are persistent and support Rename/Duplicate/Close, More, resize, and maximize.
223
+
224
+ - **2026-07-12** ??? §2.5 forecasting group + popup clipping fix. 12 new drawing overlays in `src/extension/`. New `forecasting` group in `DrawingBar` with 3 section headers (Forecasting, Volume-based, Measurers). 13 new SVG icons, 15 new i18n keys. Fixed popup clipping: `demo/terminal.css` overflow moved to `@media(max-height:620px)`. Drawing tools count 20 to 32. `pnpm verify` passes (35/35 tests). Deployed + verified (HTTP 200, SSR HTML has `draw.forecasting`, no PM2 errors).
225
+ - **2026-07-11** — §2 left drawing toolbar Batch A + shell rail cleanup. `DrawingBar` is now the sole left rail after removing dead demo `term-rail`/`RailContent`. Shipped cursor submenu (Cross/Dot/Arrow/Eraser), measure + Shift-click, zoom-in, keep-drawing UI toggle, Ctrl+Alt+H hide-all, icon sizing fixes, new draw i18n keys, and proper drawing group tagging. `TODO-DESIGN.md` §0.2/§2 updated.
226
+ - **2026-07-12** — Right rail pass: active symbol state now follows chart/watchlist selection, Details shows live OHLC and metadata, and persisted watchlists support rename plus drag reorder. Calendar/News/Ideas remain sidebar-local empty states until their feeds ship. Repeating the active rail tab now collapses only the panel body and retains the 52px icon strip. §7.5 updated; deferred TV surfaces stay deferred.
217
227
  - **2026-07-08 (d)** — §1 top toolbar: undo/redo + save/load (demo-side, no library/`tsup`). `UndoManager` wired: brand-bar buttons + `Ctrl+Z`/`Ctrl+Y`/`Ctrl+Shift+Z` in `ChartTerminal` hotkey effect (input-field guard). `record()` via 600ms poll (`drawing-end` not emitted — `EventBus` defined but uninstantiated, no overlay `ActionType`). New `SaveLoadMenu.tsx` backed by `ChartTemplateManager`: "Unnamed" label + Save-as/Load/Clear/Delete dropdown — folds 1.9/1.16/1.17. Closes `TODO-DESIGN.md` 1.9/1.12/1.13/1.16/1.17. 1.5 (`,` interval dropdown) stays 🔧 — deferred to a library `PeriodBar` pass. Built (6.2s, types valid) + restarted + verified (HTTP 200, undo button SSR-rendered, PM2 error log empty).
218
228
  - **2026-07-08 (c)** — §0 shell grid/behavior aligned to `design-astroneum.md` §4. Added 7.18 (Shell collapse persistence + responsive <lg) ✅. `globals.css` dimension tokens 48/60/300/300px+200ms → 44/48/260/220px+240ms. Fixed sidebar collapse animation (removed inline `display:none` that defeated the grid-track slide). `TerminalShell` now persists sidebar+dock collapse to `localStorage` `astroneum:shell`. `@media(max-width:1024px)` hides rail + forces sidebar/dock collapsed + slims topbar. FAB overlay deferred v1.1. See `TODO-DESIGN.md` §0 changelog.
219
229
  - **2026-07-08 (b)** — §1 top toolbar audit + build. Wired 3 modal hotkeys in library `AstroneumChart.tsx`: 1.7 `/` (indicators), 1.10 `Alt+A` (alerts), 1.20 `Shift+F` (fullscreen). Built 7.9 Command palette (Ctrl+K) — `CommandPalette.tsx`: symbol search + timeframe + actions. Promoted 7.6 (multi-chart grid) 🟦→✅ (LayoutPicker already built). Patched `AstroneumHandle` `useImperativeHandle` (local clone behind server). Library + demo rebuilt, deployed, verified.
@@ -0,0 +1,55 @@
1
+ # Astroneum Workstreams
2
+
3
+ > **Purpose:** delivery sequencing, ownership, and acceptance gates.
4
+ > **Owns:** work IDs, dependencies, file boundaries, and handoffs.
5
+ > **Does not own:** feature status ([`tv-functions-skill.md`](tv-functions-skill.md)), functional gaps ([`TODO.md`](TODO.md)), or layout gaps ([`TODO-DESIGN.md`](TODO-DESIGN.md)).
6
+
7
+ ## Operating rules
8
+
9
+ - One active owner claims a work ID at a time. The claim must name the changed paths, prerequisite IDs, tests, docs, and unresolved risks.
10
+ - A handoff records the commit or patch, verification output, remaining work, and which authority documents changed. The next owner must not widen the claimed path scope without a new claim.
11
+ - TradingView evidence stays outside product source. Never ship captures, HTML, scripts, screenshots, hashed classes, or TradingView assets in the demo/library bundle.
12
+ - A work item is complete only after its acceptance checks and relevant documentation updates pass.
13
+
14
+ ## Delivery ledger
15
+
16
+ | ID | Workstream | Owner | Scope | Depends on | Acceptance gate | Status |
17
+ |---|---|---|---|---|---|---|
18
+ | WS-01 | Evidence and contracts | `astroneum-parity-checker` + `astroneum-doc-syncer` | `docs/`, agent guidance | — | Semantic-ID parity rows and evidence boundaries are documented | complete |
19
+ | WS-02 | Terminal workspace | `astroneum-demo-builder` | `demo/src/app/components/` | WS-01 | Keyboard dismissal, responsive shell, curtains/split view, route smoke test | complete |
20
+ | WS-03 | Alerts and drawing UX | `astroneum-builder` + `astroneum-demo-builder` | `src/chart/`, `src/widget/`, `demo/` | WS-01 | Alert unit/UI tests; Gann/Fib family menu acceptance | complete |
21
+ | WS-04 | Strategy report UI | `astroneum-demo-builder` | `demo/src/app/components/panels/` | WS-01 | Deterministic fixture report and accessible tab navigation | complete |
22
+ | WS-05 | Strategy runtime | `astroneum-builder` | `src/strategy/`, `src/scripting/` | WS-04 | Deterministic backtest unit/performance tests | complete |
23
+ | WS-06 | AI OS operations | `astroneum-doc-syncer` | `.opencode/`, `AGENTS.md` | WS-01 | Claim/handoff convention and parity command documented | complete |
24
+ | WS-07 | Release verification | `astroneum-auditor` | tests and docs | WS-02–WS-06 | `pnpm verify`, demo build, E2E/accessibility checks | complete with size-tool environment limitation |
25
+ | WS-08 | Watchlist parity | `OpenCode` | `src/types.ts`, `src/datafeed/StandardCryptoDatafeed.ts`, `src/chart/WatchlistManager.ts`, `src/index.ts`, `src/entries/watchlist.ts`, `src/__tests__/`, `demo/src/app/components/`, watchlist authority docs | WS-01–WS-03 | 38 tests pass, changed-source lint passes, size passes, library/demo builds pass, live quote smoke passes, outer-right rail placement ships, HTTP 200; full lint blocked by pre-existing unrelated dropdown/alert errors | complete with unrelated lint blocker |
26
+ | WS-09 | Headless engine package | `OpenCode` | `src/index.ts`, `src/engine/`, `src/entries/headless.ts`, `src/__tests__/{headless*.test.ts,ssr-smoke.test.ts}`, `demo/visual/headless.spec.ts`, `package.json`, `tsup.config.ts`, `.size-limit.json`, `README.md`, `CHANGELOG.md`, `docs/{api.md,STRUCTURE.md,TODO.md,WORKSTREAMS.md}` | WS-01, WS-07 | Public UI-free subpath, deterministic lifecycle/data APIs, SSR/package/browser smoke, `pnpm verify`, `pnpm size`, package-content audit | released in `0.4.1-beta.24` |
27
+ | WS-10 | Headless consumer hardening | `OpenCode` | `src/entries/headless.ts`, `src/engine/{Chart.ts,Store.ts,widget/DrawWidget.ts,common/Animation.ts}`, `src/plugin/`, `src/types.ts`, `src/__tests__/`, `demo/visual/headless.spec.ts`, `README.md`, `CHANGELOG.md`, `docs/{api.md,STRUCTURE.md,TODO.md,WORKSTREAMS.md}` | WS-09 | Typed study/drawing output, bounded viewport roundtrip, post-destroy work cancellation, GPU-inclusive screenshot, truthful capability manifest, `pnpm verify`, `pnpm size`, browser smoke | released in `0.4.1-beta.24` |
28
+
29
+ ## WS-09 handoff
30
+
31
+ - Changed paths: headless entry/export/build budget; engine lifecycle, direct-bar, and type boundaries; package/unit/SSR/browser tests; public and authority docs.
32
+ - Verification: `pnpm verify` passed 53 tests; `pnpm size` passed with headless at 67.65 kB Brotli; demo production build and Chromium headless lifecycle smoke passed; `npm pack --dry-run --json` included only licensed package files and excluded `tv-mirror-reference/`.
33
+ - Release record: the supported headless package ships in `0.4.1-beta.24`; downstream consumers record its exact source commit and registry integrity.
34
+
35
+ ## WS-10 handoff
36
+
37
+ - Changed paths: React-independent study-plugin types/exports; bounded viewport APIs; animation, loader, and deferred-work teardown; ordered accelerated-layer screenshot compositing; package/unit/SSR/browser tests; public and authority docs.
38
+ - Verification: `pnpm verify` passed 54 tests; `pnpm size` passed with headless at 68.58 kB Brotli; demo production build passed; Chromium passed lifecycle, 16 study outputs, 16 host overlays, exact left-scroll viewport roundtrip, invalid-state rejection, active-animation teardown, and GPU-inclusive screenshot pixel checks.
39
+ - Release record: the hardened headless package ships in `0.4.1-beta.24`; downstream consumers must complete exact-artifact acceptance.
40
+
41
+ ## Handoff template
42
+
43
+ ```text
44
+ Work ID:
45
+ Owner:
46
+ Changed paths:
47
+ Dependencies satisfied:
48
+ Tests run and results:
49
+ Authority docs updated:
50
+ Known limitations / follow-up:
51
+ ```
52
+
53
+ ## Reference refresh
54
+
55
+ Refresh external evidence only through a non-destructive capture. Record capture date, viewport, chart state, theme, and account state in controlled evidence storage. Extract requirements into canonical documents; never treat raw capture material as a product API or implementation source.