Skip to content

fix(control-center): make Growth language-first - #416

Closed
i-xtsu-sixyou-ken-mei wants to merge 6 commits into
mainfrom
fix/growth-language-performance-ui
Closed

fix(control-center): make Growth language-first#416
i-xtsu-sixyou-ken-mei wants to merge 6 commits into
mainfrom
fix/growth-language-performance-ui

Conversation

@i-xtsu-sixyou-ken-mei

Copy link
Copy Markdown
Collaborator

Intent

Make the Growth tab reflect the actual social publishing contract: one article is released to every active platform together, while language is the only lane-level variable.

Context

The current Growth UI still exposes stale per-platform content recommendations such as Prioritize <topic>, title-shaping advice, and Rednote-specific hashtag guidance. That conflicts with the current shared release cohort and language-rotation model.

LatestEpisodePanel also renders a bare metric number without saying it is views, hardcodes 24h even when the response window is latest, and loses a published platform entirely when that platform has no usable metric snapshot.

Scope

  • Replace topic/title/hashtag prioritization UI with language-performance cards.
  • Redesign the publishing summary around the three shared JST article slots.
  • Make the latest-episode panel explain its metric window and label views explicitly.
  • Link each latest-episode platform to its persisted post_url.
  • Keep published lanes visible when telemetry is missing and render them as a collection gap instead of zero.
  • Prefer the zh-Hant published title for the shared episode summary.
  • Add regression coverage for the language-first UI, post links, missing metrics, and zh-Hant title preference.

Out of scope

  • Changing the social release schedule or daily cap.
  • Changing language-rotation assignment.
  • Removing historical topic/packaging telemetry from the backend learning model.
  • Changing metric collectors for Rednote or YouTube.

Product contract / invariants

  • This PR does not change a documented product/architecture invariant.
  • This PR intentionally changes an invariant with explicit product approval.

Affected invariant:

apps/podcast-pipeline/AGENTS.md / social release contract: each episode releases as one cross-platform cohort; language coverage/rotation remains the lane-level variation.

Why:

The UI is being aligned with the existing release invariant rather than presenting obsolete per-platform content decisions.

Acceptance criteria

  • Growth no longer renders Prioritize <topic>, Shape the title like this, or What to publish next.
  • Growth presents language performance as the actionable comparison.
  • The publishing summary shows 09:30 / 12:00 / 16:00 JST as shared article slots.
  • Latest episode shows an explicit metric window and views label.
  • Published platform links remain available even when metrics are unavailable.
  • Missing metrics are represented as unavailable telemetry, not zero views.
  • Shared episode title prefers zh-Hant when a zh-Hant social post exists.

Implementation

  • GrowthView.tsx now renders PublishingCadence, LanguagePerformanceCard, and a window-aware LatestEpisodePanel.
  • Language leaders are ranked by follower conversion first, then median 24h reach/sample count as fallback evidence.
  • buildEpisodes() now builds summaries from published posts even when no usable metric exists, preserving postUrl with null metric fields.
  • buildEpisodes() tracks language_code and replaces a fallback title with the zh-Hant published title when available.

Contract alignment

  • Implementation matches the invariant.
  • Regression / contract tests cover it.
  • Scoped AGENTS.md remains accurate.
  • README / runbook remains accurate.

Validation

  • GitHub branch diff review — PASS; four intended Control Center files changed and branch is based directly on current main.
  • Social release contract slot constant remains 09:30, 12:00, 16:00, so the existing repository contract check continues to compare the same values.

Validation gaps

Executable test/type-check commands could not be run in the connector-only environment. CI should run the repository gates on this PR.

Known unrelated failures

None known.

Reviewer notes

Please scrutinize the buildEpisodes() behavior change: a published lane with unavailable/no standardized metric now intentionally survives into the episode summary with null metric fields so the UI can expose its post link and collection gap.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant