| 1 | # App composition boundary |
| 2 | |
| 3 | [简体中文](APP_SHELL.zh-CN.md) |
| 4 | |
| 5 | App.tsx only mounts AppRuntime. AppRuntime composes session, navigation and |
| 6 | shell-store owners; AppRuntimeView renders the existing shared regions. |
| 7 | Effects and source-bound commands stay with their domain owners. Extracting |
| 8 | the view must preserve hook order, component identity, draft state and command |
| 9 | registration, and must not introduce a second mutable active-session authority. |
| 10 | |
| 11 | The App entry contract rejects direct bridge access, effects and async work. |
| 12 | The AST layer gate follows runtime imports, re-exports, aliases and dynamic |
| 13 | imports, and rejects transitive domain/common dependencies on App owners. |
| 14 | Type-only edges remain distinct. Negative fixtures verify those checks. |
| 15 | |
| 16 | Context-window presentation helpers and lazy subagent outcome/preview cards |
| 17 | are separate view modules. The controller retains tool output and a compact tuple for live wire outcomes; |
| 18 | historical outcome text is parsed only when the lazy card renders. The rendered result and source command boundary |
| 19 | remain unchanged. |
| 20 | |
| 21 | Use `pnpm check:app-layers`, `pnpm test:all`, `pnpm test:app-lifecycle` and |
| 22 | `pnpm test:app-browser` to verify these contracts. The independent App memory |
| 23 | workflow and native Transcript gates remain required qualification. See |
| 24 | [session ownership](APP_SESSION_OWNERSHIP.md) for the screening protocol and |
| 25 | the separate pending heap-retainer/control attribution duty. |
| 26 |