# Pi capabilities on DSH, area by area Every surface a Pi package can touch, what it maps onto in DeepSeek Harness, and where the mapping differs. These tables are generated from the rules the bridge itself consults at runtime (`src/compatibility.ts`, also reported by `pi2dsh matrix --json`), so they cannot drift from the implementation. **112 Pi surfaces total** — 24 same semantics · 83 mapped, difference stated · 5 not available — plus **202 imported symbols** from the three Pi runtime packages (`pi-coding-agent`, `pi-tui`, `pi-ai`), which the bridge serves from vendored or headless shims so a package's own Pi pins never load — listed in [Imported Pi runtime symbols](imports.md). Each area page carries two things per surface: what it does on DSH, and **how it is built** — the DSH seam, service or waterfall behind it. | Area | Surfaces | Status | |---|---|---| | [Tools](tools.md) | 12 | 3 same semantics · 9 mapped, difference stated | | [Commands, flags and editor input](commands.md) | 13 | 13 mapped, difference stated | | [Messages, context and the agent loop](conversation.md) | 20 | 9 same semantics · 11 mapped, difference stated | | [Sessions, branching and side conversations](sessions.md) | 24 | 6 same semantics · 18 mapped, difference stated | | [Models, providers and credentials](models.md) | 15 | 1 same semantics · 11 mapped, difference stated · 3 not available | | [Asking the user, and rendering](interaction.md) | 24 | 4 same semantics · 20 mapped, difference stated | | [Project environment, skills and resources](environment.md) | 4 | 1 same semantics · 1 mapped, difference stated · 2 not available | ## What the statuses mean | Status | Meaning | |---|---| | **Same semantics** | The DSH behaviour matches Pi's, including edge cases | | **Mapped, difference stated** | The capability works; the row says exactly where the behaviour differs from Pi (representation, timing, or scope). Most surfaces sit here because the bridge documents differences rather than glossing over them | | **Not available** | No safe mapping. The surface is accepted so packages keep running, and the gap is reported once through the capability ledger rather than throwing mid-turn | | **Fails loud** | Calling it raises a structured, catchable error instead of returning a fabricated result | A package that hits a "not available" surface during startup is marked unusable with a removal hint, instead of half-working silently.