Skip to content

fix(control-center): align Growth with shared social release schedule - #412

Merged
i-xtsu-sixyou-ken-mei merged 13 commits into
mainfrom
fix/control-center-growth-publishing-context
Sep 8, 2026
Merged

fix(control-center): align Growth with shared social release schedule#412
i-xtsu-sixyou-ken-mei merged 13 commits into
mainfrom
fix/control-center-growth-publishing-context

Conversation

@i-xtsu-sixyou-ken-mei

Copy link
Copy Markdown
Collaborator

Intent

Make the Growth tab describe the social publishing contract that actually runs in production, and improve the visual scan path for language/platform identity.

The current page incorrectly derives a single “best shared slot” from per-platform strategy evidence and can render copy such as 09:30 JST · strongest shared slot across 1 platform, even though the production release contract is article-level and currently publishes up to three cohorts per JST day.

Context

The canonical social release policy is apps/podcast-pipeline/src/social/policy.ts:

  • SOCIAL_RELEASE_DAILY_CAP = 3
  • SOCIAL_RELEASE_SLOTS = 09:30 / 12:00 / 16:00 JST
  • one article consumes one shared slot
  • all active platform/language lanes of that article share the same scheduled timestamp

GrowthView.tsx was instead mining SocialDecision.publishSlotsJst, which is strategy/performance evidence, not the scheduler contract. That semantic mismatch made Growth look like the system only had one publishing time.

The Growth tab also duplicated the active social publish queue already represented in the Pipeline tab through GrowthDistributionBoard.tsx.

Scope

  • Show the current three shared publishing slots directly in Growth: 09:30 · 12:00 · 16:00 JST.
  • Stop deriving Growth’s release schedule from per-platform strategy evidence; keep performance evidence responsible for topic/language guidance only.
  • Add language flag emoji for visible language recommendations.
  • Add consistent platform identity (emoji + local SVG logo + label) across Growth playbooks, audience pulse, latest episode, evidence, and collection status.
  • Add local SVG assets for X, Threads, YouTube, and Rednote.
  • Remove GrowthDistributionBoard.tsx and its Growth-tab rendering/test because Pipeline is the operational queue surface.
  • Extend the social release contract check so the Growth UI slot list must match SOCIAL_RELEASE_SLOTS and SOCIAL_RELEASE_DAILY_CAP.

Out of scope

  • Changing social release frequency or slot times.
  • Changing language rotation/allocation.
  • Changing publish queue/retry behavior.
  • Removing the existing operations social API, which is still used by Reliability.

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/src/social/policy.ts, apps/podcast-pipeline/src/social/AGENTS.md, and scripts/check-social-release-contract.mjs article-level shared-slot release contract.

Why:
The UI was out of sync with the existing invariant. This PR makes it descriptive of the canonical scheduler rather than allowing strategy telemetry to imply a separate publishing policy.

Acceptance criteria

  • Growth shows all current release times: 09:30, 12:00, 16:00 JST.
  • Growth states that one article uses one shared slot across every active platform.
  • Growth no longer renders the Publishing now distribution block.
  • Platform identity is visually recognizable through emoji + logo + label.
  • Language recommendations show country/locale flag emoji.
  • CI contract guard fails if Growth’s displayed slot list drifts from the canonical release policy.

Implementation

GrowthView now owns a small display constant for the current slot strings and check-social-release-contract.mjs parses both that constant and SOCIAL_RELEASE_SLOTS, comparing them in CI. This lets the client remain package-isolated while still preventing silent contract drift.

Platform marks are served locally from apps/control-center/public/platform-icons rather than a runtime CDN dependency. platform.ts centralizes emoji, label, and icon-path lookup.

The duplicate GrowthDistributionBoard component and its dedicated test case are removed; Pipeline remains the queue/operational publishing surface.

Contract alignment

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

Validation

  • Repository diff reviewed against apps/podcast-pipeline/src/social/policy.ts and the social README contract — PASS.
  • scripts/check-social-release-contract.mjs updated to compare Growth slots with canonical policy — added, pending CI execution.

Validation gaps

No local shell/runtime is available through the GitHub connector, so package type-check, Vitest, Prettier, and the contract script are delegated to PR CI. I will inspect actionable CI failures on this PR.

Known unrelated failures

None known.

Reviewer notes

The key review boundary is semantic: schedule/timing in Growth must come from the release contract, while strategy/performance evidence should only influence content/language recommendations. The PR intentionally does not redesign the scheduler.

@i-xtsu-sixyou-ken-mei
i-xtsu-sixyou-ken-mei merged commit 26db96e into main Sep 8, 2026
12 checks passed
@i-xtsu-sixyou-ken-mei
i-xtsu-sixyou-ken-mei deleted the fix/control-center-growth-publishing-context branch September 8, 2026 00:41
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