diff --git a/README.md b/README.md
index 3a9cabbc..fc809483 100644
--- a/README.md
+++ b/README.md
@@ -101,6 +101,13 @@ Paragraph, Align, Info, Preview, Audio and the Render Queue, docked the way you
text animators with range selectors.
- **Expressions:** JavaScript with the After Effects object model (`wiggle`, `loopOut`,
`thisComp.layer("…")`, vector maths on arrays), an inline editor and the pick-whip.
+- **Timeline like you know it:** twirl layers open to Transform, masks, effects and the rest; drag
+ rows to reorder layers; rename with Enter or a double-click; the property shortcuts (A, P, S,
+ R, T, M, F, E, L, U and their double presses AA, PP, SS, RR, TT, MM, FF, EE, LL, UU), Shift to
+ add properties, Alt+Shift+A/P/S/R/T to key the current time, Ctrl+` to twirl selected layers.
+- **Puppet tools:** Position, Advanced, Bend, Starch and Overlap pins on a mesh built from the
+ layer, real-time pin recording, rotate/scale handles, pins driven by (or carrying) nulls for
+ rigging, and follow-through for hair and cloth.
diff --git a/docs/agents.md b/docs/agents.md
index 634811de..2c9c586a 100644
--- a/docs/agents.md
+++ b/docs/agents.md
@@ -287,6 +287,24 @@ A dialog's `show()` waits for the user: the `script.run` / `file.runScript` repl
that closes the dialog). File ▸ Scripts: `file.scripts.list`, `file.runScript {"name": …}`,
`file.installScript` / `file.installScriptUIPanel {"path": …}`, `window.scriptPanel {"name": …}`.
+### Timeline: layer order, properties and shortcuts
+
+* `layer.arrange {"layers": [...], "above": "Layer Name"}` moves layers to just above another
+ one (what dragging Timeline rows does: the selected layers move together, one undo step);
+ `to: front|forward|backward|back` and `index` still work.
+* The reveal shortcuts are UI commands (`ui.menu.invoke` or the keys themselves): A Anchor Point,
+ P Position, S Scale, R Rotation, T Opacity, M Mask Path, F Mask Feather, E Effects, L Audio
+ Levels, U keyframed properties; pressed twice quickly AA Material Options, PP paint / Roto
+ Brush / Puppet, SS selected properties, RR Time Remap, TT Mask Opacity, MM all mask
+ properties, FF missing effects, EE Expressions, LL Waveform, UU everything changed from its
+ default. Shift+key adds or removes a set; the same key again hides it; Ctrl/Cmd+` twirls the
+ selected layers open or closed. With no layer selected they apply to every layer.
+* `keys.toggleTransform {"layers"?: [...], "prop": "position"}` (Alt+Shift+A/P/S/R/T) adds or
+ removes a keyframe at the current time on that Transform property of each layer, in one undo
+ step (separated X/Y/Z Position; Orientation and X/Y/Z Rotation on 3D layers).
+* Rename a layer with Enter (or double-click a name): the whole name is selected, Enter or a
+ click elsewhere commits, Escape cancels; `layer.rename {layer, name}` does it directly.
+
### History, puppet recording, plug-ins
* `edit.history.list` lists every undo state as a tree (undoing then editing keeps the undone
diff --git a/docs/architecture.md b/docs/architecture.md
index b53b059d..c37511dc 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -152,7 +152,10 @@ strokes rasterize as brush-tip dabs and composite in order, and the layer cache
strokes are visible at the frame. Puppet (`effects::puppet`) holds meshes and pins: the mesh is
traced from the input alpha, expanded, and triangulated (Delaunay + constraint recovery, cached
by content); pins drive an as-rigid-as-possible solve (Igarashi et al. 2005) each frame and the
-input is texture-mapped through the deformed triangles. The renderer flattens nested effect
+input is texture-mapped through the deformed triangles. Pins are selected like properties
+(`puppet.selectPins`, marquee, Select All by kind) and rigged with expressions: Points Follow
+Nulls / Nulls Follow Points take pins as well as paths, and `puppet.follow` gives follower pins a
+Position expression that trails the leader by a delay. The renderer flattens nested effect
groups into `Params` keys (`effects::flatten_params`). Commands: `paint.*`, `puppet.*`.
Half, Third and Quarter resolution render proportionally fewer pixels end to end.
@@ -375,7 +378,9 @@ text, disables the expression and shows a warning, like After Effects. `sampleIm
sampled layer through the evaluating renderer's footage source (`EvalCtx::footage`), cached per
thread and frame; `footage(name)` reads data footage (JSON, CSV, TSV imported with File ▸ Import,
text kept in the project) through `sourceData`, `sourceText` and `dataValue`. `expr.errors`
-lists failing expressions for the viewer's error bar.
+lists failing expressions for the viewer's error bar. Each thread keeps one boa context; boa
+leaves values on its stack whenever an exception unwinds through call frames (every pending
+host request does), so a run that hits the stack limit gets a fresh context and is retried once.
## 5a. Scripting
diff --git a/docs/control-protocol.md b/docs/control-protocol.md
index 7763ee03..f70bf3f3 100644
--- a/docs/control-protocol.md
+++ b/docs/control-protocol.md
@@ -27,7 +27,7 @@ printf '{"id":1,"method":"engine.execute","params":{"command":"comp.new","params
|---|---|---|
| `engine.execute` | `{command, params?}` | The command's result. Every engine command (`effectcraft-cli commands`) runs exactly as it does headless, so it never opens a dialog: `comp.new {}` creates a default comp. UI-only ids (`tool.*`, `view.*`, `window.*`, `playback.*`, `timeline.*`, `app.*`) fall through to the menu dispatcher. Unknown top-level params are rejected, and the error lists the accepted keys. |
| `ui.menu.invoke` | `{id, params?}` | Like a menu click: commands with empty params may open their dialog (New Composition, Solid Settings, file pickers). |
-| UI commands (via either) | | `timeline.column {column, visible?}` (av, keys, label, num, comment, switches, modes, parent, in, out, duration, stretch), `timeline.sourceName {value?}`, `timeline.search {query}`, `timeline.revealAdd.`, `flowchart.options {layers?, effects?, solids?, direction?: lr\|tb, comp?}`, `flowchart.graph {comp?}` → `{nodes, edges}`, `window.workspace {name}` (all After Effects workspaces). |
+| UI commands (via either) | | `timeline.column {column, visible?}` (av, keys, label, num, comment, switches, modes, parent, in, out, duration, stretch), `timeline.sourceName {value?}`, `timeline.search {query}`, `timeline.reveal.` / `timeline.revealAdd.` (the property shortcuts and Shift+shortcut: position, scale, rotation, opacity, anchor, effects, masks, feather, levels, animated, and the double-press sets maskPath, maskOpacity, timeRemap, expressions, material, paint, selected, missingEffects, waveform), `timeline.keyAt.` (Alt+Shift+A/P/S/R/T), `timeline.twirlSelected` (Ctrl/Cmd+`), `timeline.collapseAll`, `flowchart.options {layers?, effects?, solids?, direction?: lr\|tb, comp?}`, `flowchart.graph {comp?}` → `{nodes, edges}`, `window.workspace {name}` (all After Effects workspaces). |
| `engine.commands` | `{filter?, enabledOnly?}` | `[{id, label, menu, shortcut, params, enabled, why}]` |
| `ui.menu.list` | `{}` | The menu tree with enablement. |
| `render.frame` | `{comp?, time?, max_side?, path?, base64?}` | Renders a comp frame through the session, independent of the viewer zoom or resolution. `comp` is an id or name (default: the active comp), `time` is in comp seconds (default: the CTI), `max_side` caps the longest side (0 = full size). Writes a PNG to `path` (default: a temp file) and returns `{comp, time, width, height, path}`. With `base64: true` it returns `{…, png: ""}` and writes no file. |
@@ -80,13 +80,15 @@ Points are logical window coordinates. A target is `{id}` (the element's centre;
Element ids are stable, for example `tools.Selection`, `panel.Timeline`, `panel.tab.EffectControls`,
`header.workspace.Animation`, `project.item.`, `viewer.comp`, `viewer.handle..`,
-`timeline.layer..bar`, `timeline.layer..twirl`, `timeline.prop..stopwatch`,
+`timeline.layer..bar`, `timeline.layer..twirl`, `timeline.layer..row` (click selects,
+Enter or a double-click renames, drag reorders), `timeline.prop..stopwatch`,
`timeline.key..`, `timeline.cti`, `effectControls.prop..value` and
`effects.item.`. The Composition viewer adds `viewer.magnification`, `viewer.resolution`,
`viewer.roi`, `viewer.grid`, `viewer.channel`, `viewer.exposure`, `viewer.snapshot`,
`viewer.showSnapshot`, `viewer.fastPreviews` (their popup entries are `viewer.