Files
iptvnator/.codex/skills/stalker-portal/SKILL.md
T
4gray 2ac0de752f fix(skills): align repository guidance with implementation (#1315)
* docs(skills): design implementation synchronization

* docs(skills): plan implementation synchronization

* fix(release): filter internal notes from public body

* docs(release): synchronize release workflow guidance

* fix(stalker): normalize catalog series flags

* fix(stalker): preserve progress with scoped episode IDs

* fix(playback): expose strict position persistence

* docs(stalker): record series position compatibility

* test(skills): validate repository skill contracts

* fix(database): keep SQL trace values private

* docs(skills): refresh Nx and SQLite ownership

* docs(skills): align provider and UI guidance

* docs(skills): tighten validated guidance

* docs(release): require exact release pushes

* style(electron): remove trailing blank line

* fix(ci): classify repository skills coverage
2026-07-31 08:00:59 +02:00

3.0 KiB

name, description
name description
stalker-portal Use when changing Stalker or Ministra routes, stores, catalog or series shapes, playback progress, favorites and recent items, EPG, or remote control.

Stalker Portal

Read First

  • docs/architecture/stalker-portal.md
  • docs/architecture/stalker-epg.md for ITV EPG
  • docs/architecture/remote-control.md for live remote control

Ownership

  • Routed UI: libs/portal/stalker/feature/src/lib/
  • API, session, store, and normalization: libs/portal/stalker/data-access/src/lib/
  • Electron transport: apps/electron-backend/src/app/events/stalker.events.ts
  • Provider-neutral collections: libs/portal/shared/data-access/src/lib/

Keep Stalker request and shape rules in Stalker data access. Shared portal UI must remain provider-neutral.

Series Contract

Inside Stalker portal code, isStalkerSeriesFlag() is the canonical predicate and accepts exactly true, 1, and '1'. normalizeStalkerSeriesFlag() delegates to it and produces the normalized positive marker true or undefined. The activity normalizer in shared interfaces keeps its dependency-neutral equivalent for favorites/recent and dashboard classification. Preserve all three modes: regular /series, VOD with embedded series[], and lazy Ministra VOD is_series.

Favorites/recent preserve the normalized positive marker and VOD origin so reopening still uses the correct lazy or embedded mode. Keep quick-start translation parameters and the naturally ordered season fallback when season_number is absent.

Lazy episodes use a deterministic tracking ID scoped by parent series, provider episode, season key, and episode number. legacyTrackingId is only a guarded compatibility alias. Reconciliation is limited to the current parent series and optional matching season/episode metadata; an exact scoped row always wins the resolved display position, while a compatible legacy row may remain tracked only for cleanup. The scoped ID is the in-memory key. At the strict migration boundary, save the scoped row before clearing a confirmed legacy row, and keep legacy progress when the save fails.

Before inline or external handoff, attach parent seriesXtreamId and resolved season/episode numbers. Keep them on subsequent position writes.

Live Contract

  • Start bulk ITV EPG eagerly once channel rows exist. Rows read the bulk cache; only the active channel may fall back to get_short_epg.
  • Radio skips EPG and external players, preserves live collection identity with radio: 'true', and uses the shared inline audio player.

Validation

Run:

  • pnpm nx test shared-interfaces
  • pnpm nx test portal-stalker-data-access
  • pnpm nx test portal-stalker-feature
  • the affected portal-shared-data-access / portal-shared-ui target for collection or radio behavior
  • the affected workspace-dashboard-data-access and workspace-dashboard-feature test targets

For the user workflow, run pnpm nx run web-e2e:e2e-ci--src/stalker.e2e.ts or document the missing fixture and strongest focused coverage.