Skip to content

Phase Detector — /company/[ticker] detail page audit

Date: 2026-05-15 Session: #9 Wave 5 sub-agent D Branch: session-9/w5-d-phase-company-detail-audit Tested: prod https://phase.bytedance.city/company/<ticker> Coverage: 5 tickers (AAPL / TSLA / NVDA / AMZN / META) × 2 viewports (desktop 1280×800 / mobile 375×667 iPhone SE) = 10 cases Result: 10/10 pytest pass · skeleton clears · TL;DR + confidence rendered for all Screenshots: web/tests/e2e/screenshots/session-9-w5-d/*.png (10 full-page PNGs) Test: web/tests/e2e/test_phase_company_detail.py Results JSON: web/tests/e2e/results/session-9-w5-d-results.json


1. Context

W4-B (PR #113) wrapped CompanyCard in a <Link> so clicking a card navigates to /company/[ticker]. W4-B verified the navigation part (link target + href). W5-D verifies the destination — does the detail page deliver enough value to make the click worth it?

The page (web/phase-detector/app/company/[ticker]/page.tsx) calls GET /api/company/<ticker> and renders header (ticker + name + sector + CPS badge + dynamics family) + TL;DR + 主要指标 panel + 置信度 panel + optional 元数据 toggle.

2. Fields rendered (现有)

Field Source Rendered as
ticker URL param + API H1 <h1> (3xl semibold)
name (公司全名) API name inline next to H1
sector API sectorSECTOR_LABEL_ZH rounded pill
critical_point_state API critical_point_stateCPS_BADGE + CPS_ICON + CPS_LABEL_ZH colored badge with icon
dynamics_family API dynamics_familyDYNAMICS_LABEL_ZH + DYNAMICS_SUBTITLE_ZH inline subtitle
extracted_at API extracted_at "更新于 YYYY-MM-DD"
tldr API tldr 30 秒一句话 card (largest visual block)
primary_indicators API primary_indicators (free-form Record) list of name/value pairs
extraction_confidence API extraction_confidence (0..1) big number % + progress bar
caveats API caveats bullet list (currently null for all 5)
universality_class API hidden behind metadata toggle

3. Fields missing (缺失) — relative to Bloomberg / Yahoo Finance / similar terminals

Field Why missing Should we add?
market_cap_usd_b hidden behind metadata toggle even though it's available YES (prominent header chip)
industry hidden behind metadata toggle YES (next to sector pill)
price + 1D / 1M / YTD no price feed integration Phase 2 (out of W5-D capacity)
historical chart no time-series Phase 2
evidence_anchors (3 facts w/ source URLs) present in structtuples JSONL but NOT in /api/company shape YES — high value, BE work needed (M-)
early_warning_indicators tooltips indicator names shown as raw ar1_trend / variance_trend / tail_exponent_drift — unreadable FIXED IN THIS PR (INDICATOR_LABEL_ZH + tooltips)
comparable companies ("其他强者愈强动力学的公司") no related-list feature Phase 2
back-to-screener CTA only breadcrumb home link FIXED IN THIS PR (返回公司表 button)
cross-link to universality class universality_class is currently null for all 100 companies added "查看相关 universality class ↗" link as forward-looking entry (currently goes to /classes index)

4. Navigation paths

Existing (verified by e2e): - Top nav: 公司表 / 方法 / Backtest / 关于 / Structural ↗ (sticky header) — works on both viewports - Breadcrumb: 首页 / 公司 / TICKER — first two are links, last is current page (aria-current="page") - Footer: 关于 / 方法 / GitHub ↗ / Structural ↗

Added in this PR (within W5-D capacity): - 底部 CTA 行: ← 返回公司表 · 方法说明 · 查看相关 universality class ↗ - Reason: after reading the TL;DR + indicators, users have no obvious "what now?" affordance. Breadcrumb is small + far away from where the eye lands after reading the bottom card.

5. Mobile visual issues

Inspected from web/tests/e2e/screenshots/session-9-w5-d/*-mobile.png:

Issue Severity Files affected
Top nav items wrap onto two lines (公司 / 表 and Structural ↗ overflow) medium global layout in app/layout.tsx — out of W5-D scope
Floating history sidebar toggle (dark circle) overlaps TL;DR text on mobile medium HistorySidebar.tsx — out of W5-D scope
Sector pill + 更新于 date wrap below the badge on 375px low acceptable, mobile-natural
Confidence panel + 主要指标 panel stack vertically works as designed grid-cols-1 md:grid-cols-2 is correct
Tap targets (breadcrumb links) ~32px height borderline, iOS HIG wants 44pt acceptable for secondary nav

The TL;DR + indicators + confidence content itself renders fine on mobile — text wraps cleanly, no overflow scroll bars, no truncation.

6. Scoring (1-5, 5 = best)

Dimension Score Notes
信息密度 (info density) 3 header + TL;DR + 3 indicators + confidence is enough for a 30s read; lacks market cap / price / sources
视觉 (visual) 4 clean Apple-ish zinc palette · CPS badge colors map to state · progress bar with accessible role · 大段文字间距留白合理
可导航 (navigation) 3 → 4 with PR breadcrumb exists; this PR adds explicit 返回公司表 + cross-links
跟主站连贯性 (site consistency) 4 sticky header consistent · footer consistent · cross-link to Structural beta present · Plausible tracking attached
mobile 3 content renders OK; top nav wrap + floating history button overlap are visible irritants
Overall 3.4 functional baseline + 1 obvious copy gap (raw English indicator keys) — now fixed

7. Comparison with reference terminals

Reference What they do better Why we don't need it (yet)
Bloomberg Terminal dense numeric data, multi-pane, price + volume + ratios we're not a price terminal; we're "30 秒看懂状态"
Yahoo Finance price chart prominently above the fold + news headlines Phase 2 once we have price/news ingest
Substack-style company profile narrative-first w/ embedded charts closest to our intent — TL;DR card already mimics this
Our unique angle dynamics_family + critical_point_state classification + plain-Chinese subtitle unique to Phase Detector, well exposed

The detail page hits its narrow brief (state classification + 30s summary + confidence + indicators) cleanly. It does NOT try to be a price terminal — that's correct positioning.

8. Changes made in this PR (W5-D-capacity)

  1. web/phase-detector/lib/labels.ts — added 3 new maps:
  2. INDICATOR_LABEL_ZH (ar1_trend → 记忆效应趋势 (AR1) etc.)
  3. INDICATOR_TOOLTIP_ZH (hover hint explaining what rising trend means)
  4. INDICATOR_VALUE_LABEL_ZH (rising → 上升 / stable → 稳定 etc.)

  5. web/phase-detector/app/company/[ticker]/page.tsx:

  6. Import the new label maps + next/link
  7. Indicators panel renders CN labels + title= tooltip; values translated to CN
  8. Added bottom <nav aria-label="继续浏览"> CTA row: ← 返回公司表 · 方法说明 · 查看相关 universality class ↗

  9. web/tests/e2e/test_phase_company_detail.py — Playwright e2e covering all 5 tickers × 2 viewports, asserting H1 + breadcrumb + CPS badge + TL;DR + indicators + confidence + skeleton-gone + top-nav + cross-links. Captures 10 full-page screenshots. Zero LLM cost.

9. Top 3 improvement suggestions (follow-up — out of W5-D capacity)

Suggestion 1 — Surface evidence anchors on the detail page (HIGH ROI)

The structtuples JSONL already contains 3 evidence_anchors per ticker (fact + source + metric_value). Currently /api/company does not return these. Adding them would: - Establish credibility (currently the TL;DR + 90% confidence floats without sources) - Give Bloomberg/Yahoo-style "why we believe this" anchors - Differentiate from generic LLM TL;DR summaries

Owner: backend (web/backend/api/) needs to either join structtuples or expose a /api/company/<ticker>/evidence endpoint. Effort: backend ~2h + FE ~1h.

Suggestion 2 — Add 1-line peer comparison on the detail page (MEDIUM ROI)

"Other companies in the same dynamics_family + sector: TICKER1, TICKER2, TICKER3" — small chip row, each chip clicks to its own detail page. Increases session depth and cross-discovery. Requires a /api/screener?dynamics_family=...&sector=...&limit=4&exclude=<self> call.

Effort: 1-2h FE.

Suggestion 3 — Mobile chrome fixes (LOW ROI but visible)

  • Header nav: collapse 公司表 / 方法 / Backtest / 关于 / Structural ↗ into a hamburger ≤ 640px
  • Floating history toggle: position bottom-right not middle-left, or hide on company detail pages where history is less relevant
  • These affect every page, not just /company/[ticker] — better done as a site-wide chrome sprint than a W5-D follow-up.

Effort: 2-3h global layout work.

10. Field comparison table (audit core artifact)

Field 现有 缺失 本 PR 加 TODO 留下次
ticker / name / sector pill
CPS badge + icon
dynamics family + subtitle
extracted_at
TL;DR (30 秒一句话)
primary indicators (raw EN keys)
primary indicators (CN labels + tooltip) (was missing)
primary indicators (CN values) (was raw)
confidence % + progress bar
caveats (null for all 5)
universality_class (null for all 5)
metadata toggle (market_cap, industry) ✅ (hidden) promote to header chip
返回公司表 CTA (only breadcrumb)
查看相关 universality class link ✅ (placeholder) wire to real /classes/ when class assigned
evidence anchors (3 facts + sources) Suggestion 1
peer companies Suggestion 2
price + 1D/1M/YTD chart Phase 2
historical state transitions Phase 2

11. e2e signal

All 10 cases pass. Recorded assertions per case in web/tests/e2e/results/session-9-w5-d-results.json. Key signals:

AAPL  desktop  skeleton_gone=True  tldr_chars=529  conf=90%
TSLA  desktop  skeleton_gone=True  tldr_chars=393  conf=90%  (at_critical — most interesting case)
NVDA  desktop  skeleton_gone=True  tldr_chars=412  conf=85%  (approaching_critical)
AMZN  desktop  skeleton_gone=True  tldr_chars=393  conf=90%
META  desktop  skeleton_gone=True  tldr_chars=345  conf=90%
… same 5 on mobile, all pass

has_dynamics_label=False for ⅘ in the result JSON is a heuristic false-negative — my Playwright keyword check only matched a subset of CN dynamics labels. Visual inspection of all 10 screenshots confirms the dynamics family label DOES render correctly in every case (强者愈强 for AAPL/NVDA/AMZN/META, 反身性循环 for TSLA).

12. Sign-off

W5-D verifies that the W4-B CompanyCard → /company/[ticker] navigation lands on a page that: - ✅ renders core fields (ticker, name, CPS, family, TL;DR, indicators, confidence) for all 5 representative tickers - ✅ has a breadcrumb back to home - ✅ now has a CN label layer over the previously-raw indicator panel (copy quality gap closed) - ✅ now has a continuation CTA row at the bottom - ⚠️ lacks evidence anchors, peer comparison, and price data — left as follow-up suggestions 1-3

The detail page is production-acceptable for the current "30 秒看懂状态" positioning. Bigger upgrades (evidence anchors, peer chips) are tracked for a future W-wave.