-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild_report.py
More file actions
540 lines (460 loc) · 24.7 KB
/
Copy pathbuild_report.py
File metadata and controls
540 lines (460 loc) · 24.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
"""Build clean commercial DOCX report for GEM ATS demo deliverables."""
import os, shutil
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.style import WD_STYLE_TYPE
BASE = r"C:\Users\adm_r\Clients\GEM-BOOM"
OUT = os.path.join(BASE, "GEM_ATS_Demo_Deliverable_Report.docx")
# Evidence files mapped to new names and deliverable references
RENAMES = {
"evidence_01_jobs_list_overview.png": "VS1_D1_jobs_list_start_reviews.png",
"evidence_02_software_engineer_job_high_volume.png": "VS1_D1_high_volume_210_candidates.png",
"evidence_03_review_workflow_full.png": "VS1_D1_review_workflow_3panel.png",
"evidence_04_keywords_filter.png": "VS1_D1_keywords_filter_modal.png",
"evidence_05_source_filter.png": "VS1_D5_source_filter_7sources.png",
"evidence_06_candidate_profile_review.png": "VS1_D3_candidate_profile_experience.png",
"evidence_07_stage_selector_dropdown.png": "VS1_D1_stage_selector_dropdown.png",
"evidence_08_talent_pipeline_table_view.png": "VS6_D6_pipeline_table_enriched.png",
"evidence_09_pipeline_card_view_offer.png": "VS1_D1_pipeline_offer_stage.png",
"evidence_10_full_pipeline_card_view.png": "VS1_D1_full_pipeline_all_stages.png",
"evidence_11_scheduling_queue.png": "VS2_D2_scheduling_queue_154.png",
"evidence_12_interviewers.png": "VS2_D2_interviewers_9_members.png",
"evidence_13_my_interviews.png": "VS2_D2_my_interviews_upcoming.png",
"evidence_14_pipeline_analytics.png": "VS4_D4_pipeline_analytics_funnel.png",
"evidence_15_roi_calculator.png": "VS5_D5_roi_calculator_full.png",
"evidence_16_dashboards_list.png": "VS4_D4_dashboards_list.png",
"evidence_17_recruiting_health_dashboard.png": "VS4_D4_recruiting_health_kpis.png",
"evidence_18_dashboard_pipeline_metrics.png": "VS4_D4_passthrough_rates.png",
"evidence_19_reports_list.png": "VS4_D4_reports_4_prebuilt.png",
"evidence_20_training_programs.png": "VS2_D2_training_programs.png",
"evidence_21_openings_open.png": "VS4_D4_openings_open_draft.png",
"evidence_22_openings_closed_filled.png": "VS4_D4_openings_filled_headcount.png",
"evidence_23_folders_list.png": "VS6_D6_folders_silver_medalists.png",
"evidence_24_candidates_page.png": "VS6_D6_candidates_359_all_stages.png",
}
# Rename evidence files
renamed_dir = os.path.join(BASE, "evidence_renamed")
os.makedirs(renamed_dir, exist_ok=True)
for old, new in RENAMES.items():
src = os.path.join(BASE, old)
dst = os.path.join(renamed_dir, new)
if os.path.exists(src):
shutil.copy2(src, dst)
# Build document
doc = Document()
# Styles
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(10)
# Helper functions
def add_heading_styled(text, level=1):
h = doc.add_heading(text, level=level)
for run in h.runs:
run.font.color.rgb = RGBColor(0x1A, 0x1A, 0x2E)
return h
def add_goal_quote(text):
p = doc.add_paragraph()
p.paragraph_format.left_indent = Inches(0.3)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(4)
run = p.add_run(f'"{text}"')
run.font.italic = True
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0x55, 0x55, 0x55)
return p
def add_delivered(text):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(6)
run = p.add_run(text)
run.font.size = Pt(10)
return p
def add_image(filename, width=6.0):
path = os.path.join(renamed_dir, filename)
if os.path.exists(path):
doc.add_picture(path, width=Inches(width))
last = doc.paragraphs[-1]
last.alignment = WD_ALIGN_PARAGRAPH.CENTER
last.paragraph_format.space_after = Pt(8)
else:
doc.add_paragraph(f"[Image: {filename}]")
def add_click_path(text):
p = doc.add_paragraph()
run = p.add_run("Click path: ")
run.font.bold = True
run.font.size = Pt(9)
run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
run2 = p.add_run(text)
run2.font.size = Pt(9)
run2.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(12)
def add_separator():
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(4)
p.paragraph_format.space_after = Pt(4)
run = p.add_run("─" * 80)
run.font.size = Pt(6)
run.font.color.rgb = RGBColor(0xCC, 0xCC, 0xCC)
# ═══════════════════════════════════════════════════════════════
# HEADER
# ═══════════════════════════════════════════════════════════════
title = doc.add_heading('GEM ATS Demo — Deliverable Verification', level=0)
for run in title.runs:
run.font.color.rgb = RGBColor(0x1A, 0x1A, 0x2E)
p = doc.add_paragraph()
run = p.add_run("Client: TestBox | Platform: GEM (www.gem.com) | Date: February 8, 2026\n")
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
run2 = p.add_run("Org: TestBox (thiago@testbox.com) | Environment: ATS-only (no CRM dependencies)")
run2.font.size = Pt(10)
run2.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
p2 = doc.add_paragraph()
run3 = p2.add_run("Status: ALL 6 VALUE STORIES — DELIVERED")
run3.font.bold = True
run3.font.size = Pt(12)
run3.font.color.rgb = RGBColor(0x00, 0x7A, 0x33)
p2.paragraph_format.space_after = Pt(16)
# Quick stats
p3 = doc.add_paragraph()
p3.paragraph_format.space_after = Pt(16)
stats = "359 candidates • 9 jobs • 7 sources • 5 hires • 24 screenshots • Zero CRM dependencies"
run4 = p3.add_run(stats)
run4.font.size = Pt(10)
run4.font.bold = True
add_separator()
# ═══════════════════════════════════════════════════════════════
# VS1: AI APPLICATION REVIEW
# ═══════════════════════════════════════════════════════════════
add_heading_styled("VS1 — AI Application Review for High-Volume Inbound", level=1)
# Goal
add_heading_styled("Goal", level=3)
add_goal_quote("Show reviewers triaging large inbound pools efficiently")
add_delivered(
"Software Engineer job has 210 active candidates with 139 waiting in Application Review. "
"\"Start reviews (139)\" button on Jobs list launches a full 3-panel triage UI. "
"Left panel lists candidates, center shows profile/resume, right panel has candidate info + actions."
)
add_image("VS1_D1_high_volume_210_candidates.png")
add_click_path("ATS > Jobs > Software Engineer (R1) > \"Start reviews (139)\"")
# ATS Features
add_heading_styled("ATS Features", level=3)
add_goal_quote("Job > Applications > Review workflow")
add_delivered(
"Review UI shows \"To review (139)\" and \"Reviewed (0)\" tabs. Header reads "
"\"Reviewing Software Engineer (ID: R1) in Application review\". "
"Resume viewer with zoom/download. Profile tab with Experience/Education."
)
add_image("VS1_D1_review_workflow_3panel.png")
add_click_path("ATS > Jobs > Software Engineer > Start reviews (139)")
add_goal_quote("Keywords/Filters")
add_delivered(
"Keywords button opens modal with resume keyword search, save/load keywords, and filter options "
"(1+ keyword / no keywords / all). Resume search bar: \"Search resumes (e.g. excel AND accounting)\". "
"Source filter shows 7 sources. Additional filters: Referrals (20), Prev contacted (29), Seen (1), "
"Recently rejected, Multiple apps, Prev screened. Sort by Oldest first. Bulk action button. "
"\"Enable AI ranking\" button in review header."
)
add_image("VS1_D1_keywords_filter_modal.png")
add_image("VS1_D5_source_filter_7sources.png")
add_click_path("Inside review > \"Keywords\" button | \"Source\" dropdown")
add_goal_quote("Start reviews")
add_delivered(
"Every open job shows \"Start reviews (N)\" on the Jobs list. "
"Also accessible from job detail page header and inside the pipeline card view."
)
add_image("VS1_D1_jobs_list_start_reviews.png")
add_goal_quote("Candidate profile review")
add_delivered(
"Profile tab: Experience + Education. Resume tab: Generated Resume with viewer. "
"Activity feed tab. Applications tab. Sidebar: name, pronouns, company, title, school, location, "
"source, email, reminders. Notes with @mention + Private toggle."
)
add_image("VS1_D3_candidate_profile_experience.png")
add_goal_quote("Move forward/reject decisions")
add_delivered(
"Green \"Advance to Phone screen\" button with dropdown for stage selection. "
"Red \"Reject with message\" button with options. Stage dropdown in header: "
"Application review → Phone screen → Onsite → Offer. Left/right arrows to navigate candidates."
)
add_image("VS1_D1_stage_selector_dropdown.png")
add_goal_quote("Transition into interview steps")
add_delivered(
"Advance button moves candidates to Phone Screen (57 already there). "
"Interview plan configured: Phone Screen (30 min), Technical Interview (60 min), "
"Culture Fit (45 min). Full pipeline: 139 → 57 → 13 → 1 → 2."
)
add_image("VS1_D1_full_pipeline_all_stages.png")
add_click_path("Job > Talent pipeline > Card view > Stages: All")
# Synthetic Data
add_heading_styled("Synthetic Data", level=3)
add_goal_quote("High-volume job with many applications across a spectrum of quality")
add_delivered(
"Software Engineer: 210 active / 232 total. Candidates range from basic profiles to enriched hero candidates "
"(Marcus Chen - Sr SW Eng at Stripe, Mia Brown - Data Scientist at Meta). "
"Pipeline funnel: 139 → 57 → 13 → 1 → 2. 6 open jobs for comparison."
)
add_goal_quote("Realistic resumes/attachments")
add_delivered(
"Every candidate has a Generated Resume. Marcus Chen has uploaded PDF resume (via referral). "
"In-app PDF viewer with zoom in/out and download."
)
add_goal_quote("Candidate tags/fields used for filtering")
add_delivered(
"7 sources: LinkedIn (29), Company career site (23), Indeed (13), Direct referral (13), "
"LinkedIn Basic Jobs (11), Work at a Startup (7), Github (4). "
"Enriched fields: company, title, school, location, LinkedIn links. 1-4 internal notes per candidate."
)
add_goal_quote("Applications distributed across stages")
add_delivered("5 stages: 139 + 57 + 13 + 1 + 2 = 212. Classic funnel shape with progressive reduction.")
add_separator()
# ═══════════════════════════════════════════════════════════════
# VS2: INTERVIEW SCHEDULING
# ═══════════════════════════════════════════════════════════════
add_heading_styled("VS2 — Interview Scheduling at Scale", level=1)
add_heading_styled("Goal", level=3)
add_goal_quote("Demo scheduling at volume — queue management, interviewer load balancing, availability requests")
add_delivered(
"Scheduling Queue has 154 candidates across 7 pages. 9 interviewers listed with workload distribution. "
"1 upcoming interview scheduled (Leila Robinson - Feb 11 - Onsite Technical Interview). "
"Training program configured for interviewer onboarding."
)
add_image("VS2_D2_scheduling_queue_154.png")
add_click_path("Scheduling > Scheduling Queue")
add_heading_styled("ATS Features", level=3)
add_goal_quote("Scheduling Queue with candidates awaiting scheduling")
add_delivered(
"154 candidates in queue with columns: Candidate, Status, Job, Stage, Interview date(s). "
"\"Request availability\" button on each candidate card. 7 pages of candidates to schedule."
)
add_goal_quote("Interviewer management & load balancing")
add_delivered("9 team members on Interviewers page with email, trained-on, and tags columns.")
add_image("VS2_D2_interviewers_9_members.png")
add_click_path("Scheduling > Interviewers")
add_goal_quote("Interview plan per job (stages, durations, panels)")
add_delivered(
"Each job has configured interview plan: Phone Screen (30 min), Technical Interview (60 min), "
"Culture Fit (45 min). Visible on job detail page under Interview Plan tab."
)
add_goal_quote("My Interviews page (upcoming + completed scorecards)")
add_delivered(
"My Interviews shows 1 upcoming: Leila Robinson - Feb 11 - Onsite Technical Interview - Product Manager R4. "
"Completed scorecards section available with time filter."
)
add_image("VS2_D2_my_interviews_upcoming.png")
add_click_path("ATS > My Interviews")
add_goal_quote("Training Programs for interviewer onboarding")
add_delivered(
"1 training program: \"Technical Interview\" with Shadow (2 sessions) and Reverse Shadow (1 session) phases. "
"Columns: Eligibility, Trainees, Graduates, Training phases."
)
add_image("VS2_D2_training_programs.png")
add_click_path("Scheduling > Training Programs")
add_separator()
# ═══════════════════════════════════════════════════════════════
# VS3: HIRING TEAM COLLABORATION
# ═══════════════════════════════════════════════════════════════
add_heading_styled("VS3 — Hiring Team Collaboration & Candidate Experience", level=1)
add_heading_styled("Goal", level=3)
add_goal_quote("Show hiring team working together on candidates — notes, scorecards, templates, handoffs")
add_delivered(
"13+ candidates have internal notes (1-4 each) with @mention capability. "
"Scorecard template configured. 3 canned response templates for candidate communication. "
"Offer letter template. 4 reminders set. 2 review requests between team members."
)
add_image("VS1_D3_candidate_profile_experience.png")
add_heading_styled("ATS Features", level=3)
add_goal_quote("Internal notes with @mentions on candidate profiles")
add_delivered(
"Notes section on every candidate profile with \"@mention someone to notify them\" placeholder. "
"Private toggle for sensitive notes. Post button. "
"Note count badges visible on candidate cards (1-4 per candidate)."
)
add_goal_quote("Scorecard templates for structured feedback")
add_delivered(
"\"Technical Interview Scorecard\" template created. "
"Scorecards accessible from My Interviews page after interview completion."
)
add_goal_quote("Interview templates for standardized process")
add_delivered("\"Technical Phone Screen\" interview template configured and linked to interview plans.")
add_goal_quote("Canned response templates for candidate communication")
add_delivered(
"3 canned responses: \"Interview Scheduling\" (schedule interview), "
"\"Application Received\" (confirmation), \"Rejection - General\" (standard rejection)."
)
add_goal_quote("Offer letter templates")
add_delivered(
"\"Standard Offer Letter\" template. 3 draft offers active: "
"$165K (SW Eng), $145K (UX Designer), $185K (DevOps). All in San Francisco."
)
add_goal_quote("Reminders for follow-ups")
add_delivered(
"4 reminders set: 1 due today (Marcus Chen), 3 future-dated. "
"To-do page shows Reminders (1 Due), accessible from sidebar."
)
add_goal_quote("Review requests between team members")
add_delivered("2 review requests sent: Drew Regitsky + Nick Bushak → Gabriel Taufer.")
add_separator()
# ═══════════════════════════════════════════════════════════════
# VS4: EXECUTIVE RECRUITING VISIBILITY
# ═══════════════════════════════════════════════════════════════
add_heading_styled("VS4 — Executive Recruiting Visibility (Headcount / Pipeline Health)", level=1)
add_heading_styled("Goal", level=3)
add_goal_quote("Give executive stakeholders real-time visibility into pipeline health, headcount tracking, and hiring progress")
add_delivered(
"2 dashboards with live KPI widgets. Pipeline Analytics with full funnel: "
"425 → 165 (39%) → 52 (32%) → 12 (23%) → 5 (42%). "
"4 pre-built reports. 8 openings tracked across 4 lifecycle states."
)
add_image("VS4_D4_recruiting_health_kpis.png")
add_click_path("Talent Compass > Dashboards > \"Recruiting health\"")
add_heading_styled("ATS Features", level=3)
add_goal_quote("Dashboards with recruiting KPIs")
add_delivered(
"\"Recruiting health\" dashboard (favorited): Total hires = 5, Avg time to hire = 1 day "
"(vs 44-day benchmark), Current open jobs = 6. Sections: Overview, By recruiter, By office, "
"KPIs, Referrals, Pipeline metrics. \"Hiring Overview Q1 2026\" dashboard also available."
)
add_image("VS4_D4_dashboards_list.png")
add_goal_quote("Pipeline Analytics with funnel visualization")
add_delivered(
"Full funnel chart: 425 → 165 (39%) → 52 (32%) → 12 (23%) → 5 (42%). "
"Per-job breakdown for all 6 open jobs. Passthrough rates by stage: "
"7% out of App Review, 100% Phone Screen, 100% Onsite, 100% Offer."
)
add_image("VS4_D4_pipeline_analytics_funnel.png")
add_image("VS4_D4_passthrough_rates.png")
add_click_path("Talent Compass > Pipeline Analytics")
add_goal_quote("Reports (Hire Rate, Rejection Reasons, Recruiter Activity, Time to Hire)")
add_delivered("4 pre-built reports available: Hire Rate by Source, Rejection Reasons, Recruiter Activity, Time to Hire by Department.")
add_image("VS4_D4_reports_4_prebuilt.png")
add_click_path("Talent Compass > Reports")
add_goal_quote("Openings / headcount tracking")
add_delivered(
"8 openings: Open (1), Draft (1), Closed/filled (5), Closed/unfilled (1). "
"Filled openings show candidate assigned: OP1 SW Eng → Sophia Brown, "
"OP2 SW Eng → Charlotte Miller, OP3 PM → Emma Nakamura, "
"OP5 UX → Kenji Thompson, OP6 DevOps → Andrew Moore."
)
add_image("VS4_D4_openings_filled_headcount.png")
add_click_path("ATS > Openings > Closed (filled) tab")
add_separator()
# ═══════════════════════════════════════════════════════════════
# VS5: SOURCE & VENDOR ROI
# ═══════════════════════════════════════════════════════════════
add_heading_styled("VS5 — Source & Vendor ROI Optimization", level=1)
add_heading_styled("Goal", level=3)
add_goal_quote("Help recruiting ops measure and optimize spend across sources and job boards")
add_delivered(
"ROI Calculator fully populated: US$2,127 total across 6 sources, "
"US$7/application, US$532/hire. \"Lowest cost per hire\" and \"Highest overall cost\" "
"comparison charts. \"Manage expenses\" button for cost input."
)
add_image("VS5_D5_roi_calculator_full.png")
add_click_path("Talent Compass > ROI Calculator")
add_heading_styled("ATS Features", level=3)
add_goal_quote("ROI Calculator with cost per hire and cost per application")
add_delivered(
"Per-source breakdown:\n"
"• LinkedIn (Sourced): US$532 cost, 141 apps, US$4/app, 3 hired, US$177/hire\n"
"• Indeed (Sourced): US$266 cost, 65 apps, US$4/app\n"
"• Github (Sourced): US$53 cost, 23 apps, US$2/app\n"
"• LinkedIn Basic Jobs: US$128 cost, 39 apps, US$3/app, 1 hired, US$128/hire\n"
"• Work at a Startup: US$85 cost, 24 apps, US$4/app\n"
"• Direct referral: 61 apps, 1 hired (no cost tracked)\n"
"• Company career site: 72 apps (no cost tracked)"
)
add_goal_quote("Source distribution and effectiveness tracking")
add_delivered(
"7 distinct sources visible in review workflow source filter and on candidate cards. "
"Source column in pipeline table view. Pipeline Analytics shows source-to-hire conversion."
)
add_separator()
# ═══════════════════════════════════════════════════════════════
# VS6: TALENT REDISCOVERY
# ═══════════════════════════════════════════════════════════════
add_heading_styled("VS6 — Talent Rediscovery inside ATS", level=1)
add_heading_styled("Goal", level=3)
add_goal_quote("Enable recruiters to rediscover past candidates — silver medalists, previously screened talent, prior applicants")
add_delivered(
"Candidates page shows 359 total candidates searchable with filters. "
"3 curated folders including \"Silver Medalists - Future Roles\" (2 items). "
"Resume search with boolean operators. Card/Compact/Table views."
)
add_image("VS6_D6_candidates_359_all_stages.png")
add_click_path("ATS > Candidates")
add_heading_styled("ATS Features", level=3)
add_goal_quote("Candidates page with searchable database")
add_delivered(
"\"Showing 251 of 359 candidates\" with activity-based filtering (past 45 days). "
"Filter by Status, Filter by Milestones, Add filter button. "
"\"Show rejected candidates\" checkbox. Card, Compact, and Table views."
)
add_goal_quote("Folders for organizing talent pools")
add_delivered(
"3 folders: Top Engineering Candidates (3 items), Q1 2026 Hiring Pipeline (3 items), "
"Silver Medalists - Future Roles (2 items). New Folder button for creating more."
)
add_image("VS6_D6_folders_silver_medalists.png")
add_click_path("Home > Folders")
add_goal_quote("Resume search and filters for rediscovery")
add_delivered(
"Resume search: \"Search resumes (e.g. excel AND accounting)\" in review UI. "
"Filters: Prev contacted (29), Prev screened, Multiple apps, Source, Referrals (20), "
"Recently rejected, Seen. Sort options. Bulk action."
)
add_goal_quote("Enriched profiles for candidate evaluation")
add_delivered(
"Hero candidates with full profiles: Marcus Chen (Sr SW Eng, Stripe, UC Berkeley), "
"Mia Brown (Data Scientist, Meta), Charlotte Miller (Airbnb), Sophia Brown (Adobe), "
"Ella Johnson (UX Designer, Uber), Matthew Robinson (UX Designer, Meta), "
"Ava Taylor (Data Scientist, Salesforce), Harper Davis (QA Engineer, Zoom). "
"LinkedIn profile links on candidate cards."
)
add_image("VS6_D6_pipeline_table_enriched.png")
add_click_path("Jobs > Software Engineer > Talent pipeline > Table view")
add_separator()
# ═══════════════════════════════════════════════════════════════
# FINAL SUMMARY
# ═══════════════════════════════════════════════════════════════
doc.add_page_break()
add_heading_styled("Audit Summary", level=1)
# Summary table
table = doc.add_table(rows=7, cols=3)
table.style = 'Light Shading Accent 1'
headers = ["Value Story", "Status", "Key Evidence"]
for i, h in enumerate(headers):
table.rows[0].cells[i].text = h
for p in table.rows[0].cells[i].paragraphs:
for r in p.runs:
r.font.bold = True
r.font.size = Pt(9)
data = [
("VS1: AI Application Review", "DELIVERED", "210 candidates, 139 in review, 7 sources, keywords/filters"),
("VS2: Interview Scheduling", "DELIVERED", "154 in queue, 9 interviewers, 1 upcoming, training program"),
("VS3: Team Collaboration", "DELIVERED", "13+ notes, scorecards, 3 templates, 4 reminders, 2 reviews"),
("VS4: Executive Visibility", "DELIVERED", "2 dashboards, funnel 425→5, 8 openings, 4 reports"),
("VS5: Source & Vendor ROI", "DELIVERED", "US$2,127 across 6 sources, cost-per-hire by channel"),
("VS6: Talent Rediscovery", "DELIVERED", "359 candidates, 3 folders, Silver Medalists, resume search"),
]
for i, (vs, status, evidence) in enumerate(data):
row = table.rows[i + 1]
row.cells[0].text = vs
row.cells[1].text = status
row.cells[2].text = evidence
for cell in row.cells:
for p in cell.paragraphs:
for r in p.runs:
r.font.size = Pt(9)
p_end = doc.add_paragraph()
p_end.paragraph_format.space_before = Pt(16)
run_end = p_end.add_run("All 6 value stories verified and delivered. Demo ready for client presentation.")
run_end.font.bold = True
run_end.font.size = Pt(11)
# Save
doc.save(OUT)
print(f"Report saved: {OUT}")
print(f"Renamed evidence files in: {renamed_dir}")
print(f"Total renamed files: {len(os.listdir(renamed_dir))}")