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 sector → SECTOR_LABEL_ZH | rounded pill |
| critical_point_state | API critical_point_state → CPS_BADGE + CPS_ICON + CPS_LABEL_ZH | colored badge with icon |
| dynamics_family | API dynamics_family → DYNAMICS_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)¶
web/phase-detector/lib/labels.ts— added 3 new maps:INDICATOR_LABEL_ZH(ar1_trend → 记忆效应趋势 (AR1)etc.)INDICATOR_TOOLTIP_ZH(hover hint explaining what rising trend means)-
INDICATOR_VALUE_LABEL_ZH(rising → 上升 / stable → 稳定etc.) -
web/phase-detector/app/company/[ticker]/page.tsx: - Import the new label maps +
next/link - Indicators panel renders CN labels +
title=tooltip; values translated to CN -
Added bottom
<nav aria-label="继续浏览">CTA row:← 返回公司表 · 方法说明 · 查看相关 universality class ↗ -
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=...§or=...&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/ | ||
| 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.