ats_employer_hiring has a 3 + 1 tile layout since the fourth KPI landed, which pushes Pipeline by Stage below the fold - #81
Conversation
The fourth KPI (#55) landed at w: 4, so three tiles filled row 0 and it opened row 2 alone, displacing Pipeline by Stage to y: 4 — past the 900 px fold at the screenshot set's 1440 x 900 viewport. Four w: 3 tiles now share row 0 (x 0/3/6/9) and the bar chart returns to y: 2. Two titles lose the words the dashboard header already supplies: "Applications Awaiting Action" -> "Awaiting Action" and "Average Days to Offer" -> "Days to Offer", so nothing wraps in a ~280 px tile. en.ts restates both, as check:i18n-source requires. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PbJ5Cy9KDAzeQHo8bsMadG
…tion
The Hiring Overview shot now shows what the dashboard shows: four KPI
tiles on one row and the whole Pipeline by Stage bar chart inside the
900 px fold. Same recipe as the set (CLI 17.3.0, memory driver, --fresh,
1440 x 900, after "[Seeder] Seed loading complete {inserted:818}"),
-p 4661.
The caption loses "the bars are cropped here" and gains what the re-take
measured: interviews this week reads 5, not the 6 the previous shot
recorded. Neither number is wrong and neither moved with this change --
the seed schedules Quillstone's ten rounds at boot + 1 ... + 10 days
while the tile counts a fixed Monday-to-Sunday week, so the count is 6
only when the boot is a Monday. The README now says so; the dashboard's
own header comment says so too, beside the layout it documents.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PbJ5Cy9KDAzeQHo8bsMadG
Review — 布局照做了,而且把我的理由证伪了我看了新截图,四块瓦片在同一行,四个标题都没有换行(最长的 我给的理由是错的,你测出来了派发里我写:担心 280 px 放不下 所以缩短标签是对的(97% 填充率太满,没有余量),但我给的根据不成立。我当时是按主流看板的经验推的,没有量。你去量了,并且报告的是量出来的结果而不是我想听的结果 —— 这正是我在派发里要求的那种行为,谢谢。
「本周面试 6 → 5」不是这个 diff 造成的,而且是一个真问题你的因果说明我自己独立算了一遍,完全对上: 种子把 Quillstone 的十轮面试排在 你的 open question:选 A保留周二那张(5)并在说明里写清楚它随启动日变化。理由和你给的一致:截图的职责是展示布局在折叠线以上装得下什么,它做到了;为了钉住 6 而要求在特定星期几启动,等于让仓库继续记录一个工作日读者复现不出来的数字。C 更不行 —— 用一个数据问题挡住一个布局修复。 顺带说明:这个数字也出现在我为维护者做的产品介绍材料里,我会一并改掉。这就是把它写进说明的价值。 合并。 Generated by Claude Code |
Fixes #78
ats_employer_hiringput four KPI tiles atw: 4, so three filled row 0 and the fourth opened row 2 alone, displacing Pipeline by Stage toy: 4and past the 900 px fold. This puts all four KPIs on one row atw: 3(x0 / 3 / 6 / 9) and brings the bar chart back toy: 2, and shortens the two titles that the narrower tile makes tight — the dashboard header already says "applications awaiting action" and "average days to offer", so the tiles need not repeat it.open_jobsx0 y0 w4 h2x0 y0 w3 h2awaiting_actionx4 y0 w4 h2x3 y0 w3 h2interviews_this_weekx8 y0 w4 h2x6 y0 w3 h2avg_days_to_offerx0 y2 w4 h2x9 y0 w3 h2pipeline_by_stagex0 y4 w12 h5x0 y2 w12 h5src/translations/en.tsrestates the two changed titles (pnpm check:i18n-sourcecompares the bundle to the metadata labels and fails on drift). Thezh-CNtitles are left alone: they are 62–96 px wide in the same 222 px box, and 平均到 Offer 天数 is DESIGN.md §04's own wording — measured below.Before / after, both at 1440 × 900
Before —
main(c3c6526): three tiles, a lone fourth on row 2, the chart cropped at the fold.After — this branch (37d3402), the committed re-take of
docs/screenshots/03-hiring-home-overview.png: one KPI row, no wrapped title, every bar and both axes inside the fold.Boot for the shot, the recipe
docs/screenshots/README.mdrecords, on port 4661:Headless Chromium (Playwright 1.56.1), viewport 1440 × 900,
deviceScaleFactor: 1, signed in through the Console asadmin@quillstone.example.No title wraps — measured, not eyeballed
Per title element:
Range.getClientRects()(one rect per line box), the element's height against its computedline-height, and the rendered text width against the box it sits in.All four KPI tiles report
top: 210,left: 305 / 593 / 881 / 1169— one row, 288 px pitch. The chart's SVG spanstop: 522 … bottom: 872anddocument.scrollHeightis 900, so nothing is below the fold and the page does not scroll.text-overflowisellipsison these titles, andscrollWidth === clientWidthon all five, so nothing is truncated either.One nuance worth recording against the card's estimate: the tile's title box is 222 px, not ~280 px, and the retired "Applications Awaiting Action" measures 215.5 px in the same font — it would have fitted, with 6.5 px to spare (97 % fill), rather than wrapping. The shortened labels are still the right call at that margin (a different font stack, a longer locale or a slightly narrower sidebar eats 6 px), but the honest finding is "it was tight", not "it wrapped".
zh-CN pass at the same viewport (
navigator.language = zh-CN): 在招岗位 62.4 px · 待处理投递 78.0 px · 本周面试 62.4 px · 平均到 Offer 天数 95.7 px, one line box each, same single row, chart equally inside the fold. That is why this PR does not shorten the Chinese titles.The five numbers, re-measured
Re-measured on this boot, not copied. The analytics path is
POST /api/v1/analytics/dataset/querywith{ datasetName, selection: { measures, dimensions, runtimeFilter } }, whereruntimeFiltercarries each widget's ownfilterread out ofdist/objectstack.json. Independent column:GET /api/v1/data/OBJECT?$filter=...&$count=true, assertinghasMore === falseandrecords.length === totalon every read.open_jobs[{"job_count":3}]total=3 records=3 hasMore=falseawaiting_action[{"application_count":18}]total=18 records=18 hasMore=falseinterviews_this_week[{"interview_count":5}]total=5 records=5 hasMore=falseavg_days_to_offer[{"avg_days_to_offer":30}]days_to_offer=[30], avg 30.0000pipeline_by_stageThe compiled statements, from the analytics NativeSQLStrategy (the memory driver logs the SQL as it declines to run it, then the query falls back to the driver's own aggregate):
The card's warning about the filter key reproduces exactly, and the compiled SQL is what shows it — same request, same 200, one missing
WHEREclause:Both independent paths agree on 5, this PR touches no dataset, no widget filter and no seed row, and the widget's
filteris byte-identical tomain's. The cause is the calendar:The seed schedules rounds at boot + 1 … + 10 days; the tile counts a fixed Monday-to-Sunday week. A Monday boot — which is what the previous shot was taken on — puts six inside the window, every later weekday one fewer. The other four numbers are boot-day stable.
The
03caption now says this instead of pinning a 6, andsrc/dashboards/employer-hiring.dashboard.tssays it beside the "this week" note. The wider problem (the #8 evidence table pins 3 · 18 · 6 too) is filed separately as #80, which this PR deliberately leaves alone: it lands insrc/data/or in documents this card does not own.Gates
Every exit code was captured before any pipe (
cmd > log 2>&1; EXIT=$?). A control-character scan over the three edited text files (grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') returns no matches.Scope
Touched:
src/dashboards/employer-hiring.dashboard.ts(layout, two titles, header comment),src/translations/en.ts(the same two titles),docs/screenshots/03-hiring-home-overview.png+docs/screenshots/README.md(re-take and caption). No object, field, dataset, measure, hook, flow, security or seed row is touched, and neither of the other two dashboards is.Generated by Claude Code