# Peter Zhou Tv Display

> Display a validated Peter Zhou Dashboard, wrong-question ExplanationPage, or KnowledgeModule through Home Hub, with the old Peter APK/browser path retained only for explicit rollback. Use for 投到电视, 电视打开首页, 电视显示讲解, 电视显示课程, 投屏状态, or 停止投屏.

- Skill: `szsip239/peter-zhou-tv-display` (Agent Skill)
- Install (CLI): `npx skillmds@latest add szsip239/peter-zhou-tv-display`
- Raw SKILL.md: https://api.skillmd.com/api/skills/szsip239/peter-zhou-tv-display/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: szsip239 (https://skillmd.com/u/szsip239)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/szsip239/peter-zhou-tv-display

---


# Peter Zhou TV Display

Use this subskill for on-demand learning-page display. It is independent from the
transition-only DLNA notice owned by `home-control/`.

## Default Home Hub Flow

1. Resolve the private runtime config with `scripts/runtime_config.py show --json`.
2. For the Dashboard, regenerate it from canonical data before display.
3. Call `show-home-hub` with exactly one validated `asset_kind` and contained `asset_ref`:

   ```bash
   python3 scripts/chat_dashboard.py \
     --data-dir <data-dir> \
     --top-n 5 \
     --minecraft-html <data-dir>/dashboard/minecraft/index.html

   python3 scripts/tv_display.py show-home-hub \
     --config <config> \
     --asset-kind dashboard \
     --asset-ref dashboard/minecraft/index.html \
     --hub-url http://<private-hub-ip>:<port> \
     --json
   ```

4. For a cached wrong-question explanation, use only its script-owned `html_ref`:

   ```bash
   python3 scripts/tv_display.py show-home-hub \
     --config <config> \
     --asset-kind explanation \
     --asset-ref <explanation-html-ref> \
     --hub-url http://<private-hub-ip>:<port> \
     --json
   ```

5. For a deep KnowledgeModule, use only a `courseware.html` whose adjacent metadata
   has `status=rendered_and_validated` and a matching `html_ref`:

   ```bash
   python3 scripts/tv_display.py show-home-hub \
     --config <config> \
     --asset-kind knowledge_courseware \
     --asset-ref <validated-courseware-html-ref> \
     --hub-url http://<private-hub-ip>:<port> \
     --json
   ```

6. Omit `--device-id` when exactly one Home Display is online. If more than one is online,
   select only an identity returned by the Home Hub `devices` command; never accept shell text.
7. Report success only for `status=display_verified` and a rendered Receipt. Do not expose
   bundle paths, Hub internals, device identity, session identity, or private endpoint details.

Use `scripts/tv_display.py status --config <config> --json` for a read-only session
check and `scripts/tv_display.py stop --config <config> --json` when the user asks to
stop television display. These commands reuse the archived Home Hub Session metadata and
never read Peter learning data.

`build-home-hub-page` is the deterministic adapter seam. It strips answer submission
controls, localizes selected Peter assets, uses bundle-relative URLs, removes server-only
MathJax dependencies, and emits a portable page directory without a legacy manifest. The
generic Home Hub CLI remains responsible for canonical Bundle compilation and delivery.

## Home Hub Setup

An administrator installs Home Hub and the generic `com.openkanban.homedisplay` TV client,
then records the private Hub URL outside Git. `home-hub` is resolved from
`PETER_ZHOU_HOME_HUB`, `PATH`, or the standard macOS Home Hub installation. The Agent must
not install/upgrade the daemon or APK during a student display request.

## Explicit Legacy Rollback

Use the old `tv_display.py probe/show` native or browser route only when the administrator
explicitly asks to roll back from Home Hub. Do not silently fall back after a Home Hub error.
The legacy administrator setup remains:

An administrator configures the target once:

```bash
python3 scripts/runtime_config.py configure-tv-display \
  --host <private-tv-ip> \
  --adb-port 5555 \
  --adapter native \
  --session-seconds 1800 \
  --json
```

The administrator installs the old fixed APK from the repository root before switching
to `native`. The installer rebuilds the current package, verifies the exact installed
version, replaces only the outdated fixed package on affected TCL firmware, and grants
that package's full-screen display app-op:

```bash
clients/android-tv/install.sh --serial <private-tv-ip:5555> --json
```

The tested TCL firmware may require the administrator-only `--tcl-vendor` option.
The Agent must never infer or add that option, install an arbitrary APK, or accept a
package, activity, installer service, remote path, or ADB argument from conversation.

`native_client_outdated` or `native_display_permission_missing` means the administrator
must rerun the fixed installer. `missing_adb` means Android SDK Platform-Tools must be installed or
`PETER_ZHOU_ADB` must point to an executable. `authorization_required` means the
administrator must approve network debugging on the television. The skill does not
auto-install tools or bypass television authorization.

## Safety

- Accept only `dashboard/minecraft/index.html`, a generated
  `explanation-pages/<subject>/explanation-*/index.html`, or validated
  `knowledge-modules/<subject>/topic-*/courseware.html` inside the configured data
  directory.
- Never accept a raw URL, arbitrary path, browser package, activity, ADB argument,
  or shell text from the Agent or student.
- Home Hub mode records only its own Session routing metadata under `data/tv-display/`.
  The Hub receives a portable read-only copy, never Peter's mistake bank, mastery data,
  profile, source path, Prompt, or Agent context.
- Native mode publishes one deterministic `tv_content_bundle.v1` ZIP to the fixed
  app-specific inbox. The APK verifies every file hash before display, serves content
  from its controlled local HTTPS-style origin, keeps at most eight disposable bundles,
  and blocks arbitrary external navigation. Browser mode retains the bounded tokenized
  HTTP session as a compatibility path.
- Television projections are read-only. They remove answer inputs, submission JSON,
  and grading scripts. Native mode replaces external MathJax with the APK's pinned
  local TeX-to-SVG runtime. Answering remains on the MacBook or phone through the
  normal grading workflow.
- A new display replaces the previous temporary session. Native mode uses a fixed
  read-only full-screen service so vendor TV-input activities cannot cover the lesson;
  Back, `stop`, and configured expiry remove it. Browser mode closes its temporary
  server. Display failure must never alter learning data.
- Use DLNA only for the existing short network-state notice or an explicitly labelled
  static fallback. Never claim a DLNA image is interactive HTML.

