karthikr3ddy commited on
Commit
0bd8bb6
·
verified ·
1 Parent(s): f6b2cdb

Fix deployment and requirements

Browse files
Files changed (3) hide show
  1. .gitignore +32 -0
  2. requirements.txt +3 -715
  3. streamlit-dashboard.py +10 -1
.gitignore ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ env/
8
+ venv/
9
+ ENV/
10
+ env.bak/
11
+ venv.bak/
12
+
13
+ # Streamlit
14
+ .streamlit/secrets.toml
15
+ .streamlit/config.toml
16
+
17
+ # IDE
18
+ .vscode/
19
+ .idea/
20
+ *.swp
21
+ *.swo
22
+
23
+ # OS
24
+ .DS_Store
25
+ Thumbs.db
26
+
27
+ # Logs
28
+ *.log
29
+
30
+ # Environment variables
31
+ .env
32
+ .env.local
requirements.txt CHANGED
@@ -1,715 +1,3 @@
1
- import streamlit as st
2
- import plotly.graph_objects as go
3
- import plotly.express as px
4
- import pandas as pd
5
- import hmac
6
-
7
- # Page config
8
- st.set_page_config(
9
- page_title="ATP Trust Platform - Investor Dashboard",
10
- layout="wide",
11
- initial_sidebar_state="collapsed"
12
- )
13
-
14
- # Password protection
15
- def check_password():
16
- """Returns `True` if the user had the correct password."""
17
-
18
- def password_entered():
19
- """Checks whether a password entered by the user is correct."""
20
- if hmac.compare_digest(st.session_state["password"], st.secrets["password"]):
21
- st.session_state["password_correct"] = True
22
- del st.session_state["password"] # Don't store password
23
- else:
24
- st.session_state["password_correct"] = False
25
-
26
- # First run, show input for password
27
- if "password_correct" not in st.session_state:
28
- st.markdown("## 🔐 ATP Trust Platform - Investor Dashboard")
29
- st.text_input(
30
- "Please enter password to view dashboard",
31
- type="password",
32
- on_change=password_entered,
33
- key="password"
34
- )
35
- return False
36
-
37
- # Password not correct, show input + error
38
- elif not st.session_state["password_correct"]:
39
- st.markdown("## 🔐 ATP Trust Platform - Investor Dashboard")
40
- st.text_input(
41
- "Please enter password to view dashboard",
42
- type="password",
43
- on_change=password_entered,
44
- key="password"
45
- )
46
- st.error("😕 Password incorrect")
47
- return False
48
-
49
- # Password correct
50
- else:
51
- return True
52
-
53
- # Only show the dashboard if password is correct
54
- if not check_password():
55
- st.stop()
56
-
57
- # Custom CSS
58
- st.markdown("""
59
- <style>
60
- .main {padding-top: 0rem;}
61
- .stTabs [data-baseweb="tab-list"] button {font-size: 20px;}
62
- .metric-card {
63
- background-color: #f0f2f6;
64
- padding: 20px;
65
- border-radius: 10px;
66
- text-align: center;
67
- }
68
- </style>
69
- """, unsafe_allow_html=True)
70
-
71
- # Header
72
- st.title("🛡️ ATP Trust Platform - 24 Month Journey")
73
- st.markdown("**Building Agentic AI Trust Platform**")
74
-
75
- # Executive Metrics
76
- col1, col2, col3 = st.columns(3)
77
- with col1:
78
- st.metric("Timeline", "24 Months", "5 Phases")
79
- with col2:
80
- st.metric("Team Growth", "2 → 36", "Lean & Expert")
81
- with col3:
82
- st.metric("Focus", "Quality > Quantity", "AI-Augmented")
83
-
84
- st.divider()
85
-
86
- # Phase Data
87
- phases = {
88
- "Phase 0: Research": {
89
- "months": "1-4",
90
- "duration": 4,
91
- "team_start": 2,
92
- "team_end": 7,
93
- "key_hires": [
94
- {"role": "Sr. AI Security Researcher", "inr_lakhs": 54, "usd": 65000},
95
- {"role": "ML/AI Engineering Lead", "inr_lakhs": 60, "usd": 72000},
96
- {"role": "Mid-Level AI Security Researcher", "inr_lakhs": 27, "usd": 32000},
97
- {"role": "Security Expert", "inr_lakhs": 39, "usd": 47000},
98
- {"role": "Data Engineer (ML Pipeline)", "inr_lakhs": 33, "usd": 40000},
99
- ],
100
- "deliverables": ["Complete Security Architecture", "Threat Taxonomy (150+)", "Agentic AI Framework", "3 Research Whitepapers", "5 Patent Applications"],
101
- },
102
- "Phase 1: Security MVP": {
103
- "months": "5-10",
104
- "duration": 6,
105
- "team_start": 7,
106
- "team_end": 11,
107
- "key_hires": [
108
- {"role": "Senior Backend Engineer", "inr_lakhs": 27, "usd": 32000},
109
- {"role": "Senior Frontend Engineer", "inr_lakhs": 27, "usd": 32000},
110
- {"role": "Junior ML Engineer", "inr_lakhs": 17, "usd": 20000},
111
- {"role": "Governance Research Lead", "inr_lakhs": 45, "usd": 54000},
112
- ],
113
- "deliverables": ["Security MVP Launch", "50+ Beta Customers", "99% Detection Rate", "Governance/Compliance Research Complete"],
114
- },
115
- "Phase 2: Governance": {
116
- "months": "11-16",
117
- "duration": 6,
118
- "team_start": 11,
119
- "team_end": 19,
120
- "key_hires": [
121
- {"role": "Senior Product Manager", "inr_lakhs": 57, "usd": 68000},
122
- {"role": "Platform Engineer", "inr_lakhs": 39, "usd": 47000},
123
- {"role": "Backend Engineer", "inr_lakhs": 22, "usd": 26000},
124
- {"role": "ML Engineer", "inr_lakhs": 33, "usd": 40000},
125
- {"role": "Platform Engineer", "inr_lakhs": 28, "usd": 34000},
126
- {"role": "Sales Engineer", "inr_lakhs": 39, "usd": 47000},
127
- {"role": "Customer Success Lead", "inr_lakhs": 25, "usd": 30000},
128
- {"role": "Technical Writer", "inr_lakhs": 20, "usd": 24000},
129
- ],
130
- "deliverables": ["Governance Module Complete", "200+ Customers", "Policy Engine Live", "RBAC Implementation"],
131
- },
132
- "Phase 3: Compliance": {
133
- "months": "17-22",
134
- "duration": 6,
135
- "team_start": 19,
136
- "team_end": 29,
137
- "key_hires": [
138
- {"role": "Compliance Engineer", "inr_lakhs": 39, "usd": 47000},
139
- {"role": "Senior Backend Engineer", "inr_lakhs": 33, "usd": 40000},
140
- {"role": "Platform Engineer", "inr_lakhs": 28, "usd": 34000},
141
- {"role": "Frontend Engineer", "inr_lakhs": 24, "usd": 29000},
142
- {"role": "Data Engineer", "inr_lakhs": 33, "usd": 40000},
143
- {"role": "Sales Lead", "inr_lakhs": 46, "usd": 55000},
144
- {"role": "Sales Rep", "inr_lakhs": 21, "usd": 25000},
145
- {"role": "Customer Success Rep", "inr_lakhs": 18, "usd": 22000},
146
- {"role": "Marketing Manager", "inr_lakhs": 33, "usd": 40000},
147
- {"role": "Solutions Architect", "inr_lakhs": 42, "usd": 50000},
148
- ],
149
- "deliverables": ["Compliance Module Complete", "500+ Customers", "Multi-Jurisdiction Support", "Automated Reporting"],
150
- },
151
- "Phase 4: Full Platform": {
152
- "months": "23-24",
153
- "duration": 2,
154
- "team_start": 29,
155
- "team_end": 36,
156
- "key_hires": [
157
- {"role": "Senior AI Researcher", "inr_lakhs": 60, "usd": 72000},
158
- {"role": "Security Engineer", "inr_lakhs": 39, "usd": 47000},
159
- {"role": "ML Engineer", "inr_lakhs": 39, "usd": 47000},
160
- {"role": "Backend Engineer", "inr_lakhs": 24, "usd": 29000},
161
- {"role": "Backend Engineer", "inr_lakhs": 22, "usd": 26000},
162
- {"role": "Customer Success Rep", "inr_lakhs": 18, "usd": 22000},
163
- {"role": "Sales Rep", "inr_lakhs": 21, "usd": 25000},
164
- {"role": "Operations Manager", "inr_lakhs": 33, "usd": 40000},
165
- ],
166
- "deliverables": ["GA Release", "1000+ Customers", "Full Platform Integration", "Global Deployment"],
167
- }
168
- }
169
-
170
- # Tabs
171
- tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs(["📊 Phase Timeline", "👥 Team Scaling", "💰 Team Cost Structure", "🎯 Phase Details", "🚀 Ongoing Operations", "👨‍💻 Engineering Breakdown"])
172
-
173
- with tab1:
174
- st.header("24-Month Phase Progression")
175
-
176
- # Gantt Chart
177
- gantt_data = []
178
- for phase, details in phases.items():
179
- gantt_data.append({
180
- "Phase": phase,
181
- "Start": details["months"].split("-")[0],
182
- "End": details["months"].split("-")[1],
183
- "Team Size": f"{details['team_start']} → {details['team_end']}"
184
- })
185
-
186
- # Timeline visualization
187
- fig = go.Figure()
188
-
189
- y_pos = 0
190
- colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#F7DC6F', '#BB8FCE']
191
-
192
- for i, (phase, details) in enumerate(phases.items()):
193
- start_month = int(details["months"].split("-")[0])
194
- end_month = int(details["months"].split("-")[1])
195
-
196
- fig.add_trace(go.Bar(
197
- x=[end_month - start_month + 1],
198
- y=[phase],
199
- base=start_month - 1,
200
- orientation='h',
201
- name=phase,
202
- text=f"{details['team_start']} → {details['team_end']} people",
203
- textposition='inside',
204
- hovertemplate='%{y}<br>Months %{base} to %{x}<br>%{text}<extra></extra>',
205
- marker_color=colors[i],
206
- showlegend=False
207
- ))
208
-
209
- fig.update_layout(
210
- title="Phase Timeline with Team Scaling",
211
- xaxis_title="Months",
212
- height=400,
213
- xaxis=dict(range=[0, 25], tickmode='linear', tick0=0, dtick=3),
214
- barmode='stack'
215
- )
216
-
217
- st.plotly_chart(fig, use_container_width=True)
218
-
219
- with tab2:
220
- st.header("Team Scaling Journey")
221
-
222
- # Team growth visualization
223
- team_data = []
224
- cumulative_team = 3
225
-
226
- for month in range(1, 25):
227
- if month <= 4:
228
- team_size = 2 + (month - 1) * 1.25 # Slower ramp in research phase
229
- elif month <= 10:
230
- team_size = 7 + (month - 4) * 0.67 # Phase 1: 7->11
231
- elif month <= 16:
232
- team_size = 11 + (month - 10) * 1.33 # Phase 2: 11->19
233
- elif month <= 22:
234
- team_size = 19 + (month - 16) * 1.67 # Phase 3: 19->29
235
- else:
236
- team_size = 29 + (month - 22) * 3.5 # Phase 4: 29->36
237
-
238
- team_data.append({"Month": month, "Team Size": int(team_size)})
239
-
240
- df_team = pd.DataFrame(team_data)
241
-
242
- fig3 = px.area(df_team, x='Month', y='Team Size',
243
- title='Team Growth Over 24 Months',
244
- color_discrete_sequence=['#45B7D1'])
245
-
246
- # Add phase markers
247
- for phase, details in phases.items():
248
- start = int(details["months"].split("-")[0])
249
- fig3.add_vline(x=start, line_dash="dot", line_color="gray", opacity=0.5)
250
- fig3.add_annotation(x=start, y=details["team_end"], text=phase.split(":")[0], showarrow=False)
251
-
252
- fig3.update_layout(height=500)
253
- st.plotly_chart(fig3, use_container_width=True)
254
-
255
- # Department breakdown
256
- col1, col2 = st.columns(2)
257
-
258
- with col1:
259
- st.subheader("Team Composition by Phase 4")
260
- dept_data = {
261
- "Department": ["Engineering", "Sales", "Customer Success", "Product", "Leadership & Ops"],
262
- "Headcount": [23, 4, 3, 3, 3]
263
- }
264
- fig4 = px.pie(dept_data, values='Headcount', names='Department',
265
- title='36-Person Team Breakdown (64% Engineering)')
266
- st.plotly_chart(fig4)
267
-
268
- with col2:
269
- st.subheader("Hiring Velocity")
270
- hiring_data = {
271
- "Phase": ["Phase 0", "Phase 1", "Phase 2", "Phase 3", "Phase 4"],
272
- "New Hires": [5, 4, 9, 10, 8]
273
- }
274
- fig5 = px.bar(hiring_data, x='Phase', y='New Hires',
275
- title='Hiring by Phase',
276
- color_discrete_sequence=['#F7DC6F'])
277
- st.plotly_chart(fig5)
278
-
279
- with tab3:
280
- st.header("Team Cost Structure")
281
-
282
- # Department-wise breakdown
283
- dept_breakdown = {
284
- "Department": ["Engineering", "Product", "Sales", "Customer Success", "Leadership & Ops"],
285
- "Headcount": [23, 3, 4, 3, 3],
286
- "Avg Salary (₹L)": [36, 37, 32, 20, 44],
287
- "Annual Cost (₹Cr)": [8.28, 1.10, 1.27, 0.61, 1.33],
288
- "Annual Cost ($M)": [0.99, 0.13, 0.15, 0.07, 0.16]
289
- }
290
-
291
- df_dept = pd.DataFrame(dept_breakdown)
292
-
293
- # Visualization 1: Department Cost Distribution
294
- fig6 = go.Figure()
295
- fig6.add_trace(go.Bar(
296
- x=df_dept['Department'],
297
- y=df_dept['Annual Cost ($M)'],
298
- text=[f"${val}M<br>{hc} people" for val, hc in zip(df_dept['Annual Cost ($M)'], df_dept['Headcount'])],
299
- textposition='outside',
300
- marker_color=['#4ECDC4', '#45B7D1', '#F7DC6F', '#BB8FCE', '#FF6B6B']
301
- ))
302
-
303
- fig6.update_layout(
304
- title='Annual Department Costs (35-Person Team)',
305
- yaxis_title='Annual Cost (USD Millions)',
306
- height=400,
307
- showlegend=False
308
- )
309
-
310
- st.plotly_chart(fig6, use_container_width=True)
311
-
312
- # Visualization 2: Headcount vs Cost pie charts
313
- col1, col2 = st.columns(2)
314
-
315
- with col1:
316
- fig_hc = px.pie(df_dept, values='Headcount', names='Department',
317
- title='Team Distribution by Headcount')
318
- st.plotly_chart(fig_hc)
319
-
320
- with col2:
321
- fig_cost = px.pie(df_dept, values='Annual Cost ($M)', names='Department',
322
- title='Cost Distribution by Department')
323
- st.plotly_chart(fig_cost)
324
-
325
- # Key metrics
326
- col1, col2, col3 = st.columns(3)
327
-
328
- with col1:
329
- st.metric("Total Team Size", "36 people", "Lean & Expert")
330
- with col2:
331
- st.metric("Total Annual Cost", "$1.50M", "₹12.6 Cr")
332
- with col3:
333
- st.metric("Avg Cost per Person", "$41K", "₹34L")
334
-
335
- # Note about international hires
336
- st.info("💡 **Note**: For specialized roles like LLM Security Experts or Framework Contributors, we may hire senior researchers from UK/Europe/USA on remote/consulting basis.")
337
-
338
- # Location benefits
339
- st.subheader("Bangalore & Hyderabad Advantages")
340
-
341
- benefits = {
342
- "Factor": ["Talent Pool", "Infrastructure", "Time Zone", "English Proficiency", "Startup Ecosystem"],
343
- "Bangalore": ["IIT/IISc graduates, 2M+ IT professionals", "24/7 power, fiber connectivity",
344
- "2.5 hrs ahead of EU", "95%+ fluency", "#3 startup hub globally"],
345
- "Hyderabad": ["IIIT, ISB graduates, 600K+ IT professionals", "HITEC City, T-Hub",
346
- "Perfect for US East Coast", "90%+ fluency", "Fastest growing tech hub"]
347
- }
348
-
349
- df_benefits = pd.DataFrame(benefits)
350
- st.table(df_benefits)
351
-
352
- with tab4:
353
- st.header("Deep Dive: Phase Details")
354
-
355
- selected_phase = st.selectbox("Select a phase to explore", list(phases.keys()))
356
-
357
- phase_info = phases[selected_phase]
358
-
359
- col1, col2 = st.columns(2)
360
- with col1:
361
- st.metric("Duration", f"{phase_info['duration']} months", f"Months {phase_info['months']}")
362
- with col2:
363
- st.metric("Team Growth", f"{phase_info['team_start']} → {phase_info['team_end']}",
364
- f"+{phase_info['team_end'] - phase_info['team_start']} people")
365
-
366
- st.divider()
367
-
368
- col1, col2 = st.columns(2)
369
-
370
- with col1:
371
- st.subheader("🎯 Key Deliverables")
372
- for deliverable in phase_info['deliverables']:
373
- st.write(f"✓ {deliverable}")
374
-
375
- with col2:
376
- st.subheader("👥 Key Hires")
377
- hire_df = pd.DataFrame(phase_info['key_hires'])
378
- hire_df['India Cost'] = hire_df['inr_lakhs'].apply(lambda x: f"₹{x}L (${int(x*1200):,})")
379
- st.dataframe(hire_df[['role', 'India Cost']], hide_index=True)
380
-
381
- with tab5:
382
- st.header("🚀 Ongoing Operations Team Structure")
383
- st.markdown("### Post-Launch Team (After Month 24)")
384
-
385
- # Ongoing team structure
386
- ongoing_team = {
387
- "Department": ["Engineering", "Customer Success", "Onboarding", "Sales", "Product", "Leadership & Ops"],
388
- "Headcount": [23, 8, 4, 4, 3, 4],
389
- "Purpose": [
390
- "Maintain & enhance platform",
391
- "24/7 customer support",
392
- "Customer implementation",
393
- "New customer acquisition",
394
- "Product roadmap & features",
395
- "Strategic direction & operations"
396
- ],
397
- "Key Roles": [
398
- "Engineers, Researchers, Architects",
399
- "Support Engineers, Success Managers",
400
- "Implementation Specialists",
401
- "Sales Reps, Sales Engineers",
402
- "Product Managers, Technical Writers",
403
- "CEO, CTO, Operations Manager"
404
- ]
405
- }
406
-
407
- df_ongoing = pd.DataFrame(ongoing_team)
408
-
409
- col1, col2 = st.columns(2)
410
-
411
- with col1:
412
- # Team size comparison
413
- comparison_data = {
414
- "Phase": ["Phase 4 (Launch)", "Ongoing Operations"],
415
- "Total Team": [36, 46],
416
- "Engineering": [23, 23],
417
- "Customer Facing": [6, 16],
418
- "Others": [6, 7]
419
- }
420
- df_compare = pd.DataFrame(comparison_data)
421
-
422
- fig_compare = go.Figure()
423
- fig_compare.add_trace(go.Bar(name='Engineering', x=df_compare['Phase'], y=df_compare['Engineering']))
424
- fig_compare.add_trace(go.Bar(name='Customer Facing', x=df_compare['Phase'], y=df_compare['Customer Facing']))
425
- fig_compare.add_trace(go.Bar(name='Others', x=df_compare['Phase'], y=df_compare['Others']))
426
-
427
- fig_compare.update_layout(
428
- title='Team Evolution: Launch vs Ongoing',
429
- barmode='stack',
430
- height=400
431
- )
432
- st.plotly_chart(fig_compare)
433
-
434
- with col2:
435
- # Ongoing team distribution
436
- fig_ongoing = px.pie(
437
- values=df_ongoing['Headcount'],
438
- names=df_ongoing['Department'],
439
- title='Ongoing Operations Team (45 People)'
440
- )
441
- st.plotly_chart(fig_ongoing)
442
-
443
- # Detailed breakdown
444
- st.subheader("📋 Department Details")
445
-
446
- # Create expandable sections for each department
447
- with st.expander("🔧 Engineering (23 people) - No Change"):
448
- st.markdown("""
449
- **Maintains same size as Phase 4:**
450
- - Core platform development
451
- - Security updates and patches
452
- - New feature development
453
- - Performance optimization
454
- - Integration maintenance
455
- """)
456
-
457
- with st.expander("🤝 Customer Success (8 people) - Scaled from 3"):
458
- st.markdown("""
459
- **Expanded for 24/7 support:**
460
- - 4 Customer Success Managers (₹25-30L)
461
- - 2 Senior Support Engineers (₹20-25L)
462
- - 2 Support Engineers (₹15-18L)
463
-
464
- **Coverage:**
465
- - 24/7 support across timezones
466
- - Enterprise customer management
467
- - Technical troubleshooting
468
- - Customer health monitoring
469
- """)
470
-
471
- with st.expander("🚀 Onboarding Team (4 people) - New Addition"):
472
- st.markdown("""
473
- **New team for customer implementation:**
474
- - 2 Implementation Specialists (₹25-30L)
475
- - 1 Integration Engineer (₹30-35L)
476
- - 1 Training Specialist (₹20-25L)
477
-
478
- **Responsibilities:**
479
- - Customer onboarding (2-4 weeks)
480
- - Integration support
481
- - Training and documentation
482
- - Best practices consultation
483
- """)
484
-
485
- with st.expander("💼 Sales (4 people) - No Change"):
486
- st.markdown("""
487
- **Maintains current structure:**
488
- - 1 Sales Lead
489
- - 2 Sales Representatives
490
- - 1 Sales Engineer (Solutions Architect)
491
- """)
492
-
493
- # Cost analysis
494
- st.subheader("💰 Ongoing Operations Budget")
495
-
496
- ongoing_costs = {
497
- "Department": ["Engineering", "Customer Success", "Onboarding", "Sales", "Product", "Leadership & Ops"],
498
- "Headcount": [23, 8, 4, 4, 3, 4],
499
- "Avg Salary (₹L)": [36, 23, 27, 32, 37, 44],
500
- "Annual Cost (₹Cr)": [8.28, 1.84, 1.08, 1.28, 1.11, 1.76],
501
- "Annual Cost ($M)": [0.99, 0.22, 0.13, 0.15, 0.13, 0.21]
502
- }
503
-
504
- df_costs = pd.DataFrame(ongoing_costs)
505
-
506
- col1, col2, col3 = st.columns(3)
507
- with col1:
508
- st.metric("Total Team Size", "45 people", "+10 from launch")
509
- with col2:
510
- st.metric("Annual Cost", "$1.83M", "₹15.4 Cr")
511
- with col3:
512
- st.metric("Avg Cost/Person", "$39K", "₹33L")
513
-
514
- st.dataframe(df_costs, hide_index=True)
515
-
516
- st.info("💡 **Key Strategy**: Engineering team remains stable while customer-facing teams scale to support 1000+ customers")
517
-
518
- with tab6:
519
- st.header("👨‍💻 Engineering Team Breakdown")
520
- st.markdown("### Detailed Engineering Organization (23 People)")
521
-
522
- # Engineering breakdown data
523
- eng_breakdown = {
524
- "Department": ["Research & AI", "Backend Engineering", "Frontend Engineering", "ML/Data Engineering", "Platform Engineering", "Security", "Solutions & Architecture"],
525
- "Headcount": [6, 5, 2, 5, 3, 1, 1],
526
- "Roles": [
527
- "AI Security Researchers, Governance/Compliance Researchers",
528
- "Senior & Mid-level Backend Engineers, Platform Engineers",
529
- "Senior & Mid-level Frontend Engineers",
530
- "ML Engineers, Data Engineers, MLOps",
531
- "Platform Engineers, SRE, DevOps",
532
- "Security Expert",
533
- "Solutions Architect"
534
- ],
535
- "Focus Areas": [
536
- "Threat research, AI safety, Governance frameworks",
537
- "Core APIs, Microservices, Scalability",
538
- "Dashboard, User experience, Real-time UI",
539
- "Models, Data pipelines, Performance",
540
- "Infrastructure, CI/CD, Monitoring, Scalability",
541
- "Security architecture, Threat modeling",
542
- "Customer integration, Best practices"
543
- ]
544
- }
545
-
546
- df_eng = pd.DataFrame(eng_breakdown)
547
-
548
- # Visualization
549
- col1, col2 = st.columns(2)
550
-
551
- with col1:
552
- fig_eng = px.bar(
553
- df_eng,
554
- x='Department',
555
- y='Headcount',
556
- title='Engineering Team Distribution',
557
- color='Headcount',
558
- color_continuous_scale='Blues'
559
- )
560
- fig_eng.update_layout(height=400, showlegend=False)
561
- st.plotly_chart(fig_eng)
562
-
563
- with col2:
564
- fig_eng_pie = px.pie(
565
- values=df_eng['Headcount'],
566
- names=df_eng['Department'],
567
- title='Engineering Team Composition'
568
- )
569
- st.plotly_chart(fig_eng_pie)
570
-
571
- # Detailed role breakdown
572
- st.subheader("📊 Detailed Role Distribution")
573
-
574
- roles_detail = {
575
- "Role": [
576
- "Sr. AI Security Researcher",
577
- "ML/AI Engineering Lead",
578
- "Mid-Level AI Security Researcher",
579
- "Governance Research Lead",
580
- "Senior AI Researcher",
581
- "Compliance Engineer",
582
- "Senior Backend Engineer (2)",
583
- "Backend Engineer (3)",
584
- "Senior Frontend Engineer",
585
- "Frontend Engineer",
586
- "Junior ML Engineer",
587
- "ML Engineer (2)",
588
- "Data Engineer (2)",
589
- "Senior Platform Engineer",
590
- "Platform Engineer (2)",
591
- "Security Expert",
592
- "Solutions Architect"
593
- ],
594
- "Department": [
595
- "Research & AI", "Research & AI", "Research & AI", "Research & AI", "Research & AI", "Research & AI",
596
- "Backend", "Backend",
597
- "Frontend", "Frontend",
598
- "ML/Data", "ML/Data", "ML/Data",
599
- "Platform", "Platform",
600
- "Security",
601
- "Solutions"
602
- ],
603
- "Salary (₹L)": [
604
- 54, 60, 27, 45, 60, 39,
605
- 27, 22,
606
- 27, 24,
607
- 17, 39, 33,
608
- 39, 28,
609
- 39,
610
- 42
611
- ]
612
- }
613
-
614
- df_roles = pd.DataFrame(roles_detail)
615
-
616
- # Group by department
617
- dept_groups = df_roles.groupby('Department')
618
-
619
- for dept, group in dept_groups:
620
- with st.expander(f"{dept} Team"):
621
- st.dataframe(group[['Role', 'Salary (₹L)']], hide_index=True)
622
- avg_salary = group['Salary (₹L)'].mean()
623
- total_cost = group['Salary (₹L)'].sum()
624
- st.metric("Average Salary", f"₹{avg_salary:.0f}L", f"Total: ₹{total_cost/100:.2f} Cr")
625
-
626
- # Engineering metrics
627
- st.subheader("🎯 Engineering Team Metrics")
628
-
629
- col1, col2, col3, col4 = st.columns(4)
630
-
631
- with col1:
632
- st.metric("Research Focus", "26%", "6 of 23 engineers")
633
- with col2:
634
- st.metric("Core Development", "30%", "7 backend/frontend")
635
- with col3:
636
- st.metric("ML/Data Focus", "22%", "5 engineers")
637
- with col4:
638
- st.metric("Avg Engineering Salary", "₹36L", "$43K")
639
-
640
- # Skills distribution
641
- st.subheader("🛠️ Key Technical Skills Coverage")
642
-
643
- skills_data = {
644
- "Skill Category": ["AI/ML", "Security", "Backend", "Frontend", "Data", "DevOps", "Architecture"],
645
- "Coverage": [9, 8, 7, 2, 5, 3, 4],
646
- "Percentage": ["39%", "35%", "30%", "9%", "22%", "13%", "17%"]
647
- }
648
-
649
- df_skills = pd.DataFrame(skills_data)
650
-
651
- fig_skills = go.Figure()
652
- fig_skills.add_trace(go.Bar(
653
- x=df_skills['Skill Category'],
654
- y=df_skills['Coverage'],
655
- text=df_skills['Percentage'],
656
- textposition='outside',
657
- marker_color='lightblue'
658
- ))
659
-
660
- fig_skills.update_layout(
661
- title='Technical Skills Distribution (People can have multiple skills)',
662
- yaxis_title='Number of Engineers',
663
- height=400
664
- )
665
-
666
- st.plotly_chart(fig_skills, use_container_width=True)
667
-
668
- st.info("💡 **Engineering Philosophy**: Deep expertise in AI/Security (61% of team) with strong full-stack capabilities")
669
-
670
-
671
- # Footer
672
- st.divider()
673
- st.markdown("""
674
- ### 📌 Key Takeaways
675
- - **Lean Start**: Begin with just 5 strategic core team members in Phase 0
676
- - **AI-Augmented Team**: 36 experts doing work of 70+ with AI tools
677
- - **India Advantage**: 64% cost savings vs US hiring (with 20% premium)
678
- - **Clear Milestones**: Each phase has specific technical deliverables
679
- - **Engineering Heavy**: 64% engineers, minimal overhead
680
- """)
681
-
682
- # Download button for executive summary
683
- exec_summary = f"""
684
- ATP TRUST PLATFORM - EXECUTIVE SUMMARY
685
- ======================================
686
-
687
- TIMELINE: 24 months (5 phases)
688
- TEAM: 2 → 35 people (Lean & Expert)
689
-
690
- PHASE BREAKDOWN:
691
- - Phase 0 (M1-4): Research & Architecture | 2→7 people
692
- - Phase 1 (M5-10): Security MVP + Gov/Comp Research | 7→11 people
693
- - Phase 2 (M11-16): Governance Module | 11→19 people
694
- - Phase 3 (M17-22): Compliance Module | 19→29 people
695
- - Phase 4 (M23-24): Full Platform GA | 29→36 people
696
-
697
- INDIA ADVANTAGE:
698
- - Average salary: $41K (vs $115K in US)
699
- - 64% cost savings
700
- - Access to IIT/IIIT talent pool
701
- - Bangalore & Hyderabad tech hubs
702
-
703
- KEY DELIVERABLES:
704
- - AI Security Platform with 99% detection rate
705
- - Governance & Policy Engine
706
- - Multi-jurisdiction Compliance
707
- - Enterprise-ready Platform
708
- """
709
-
710
- st.download_button(
711
- label="📥 Download Executive Summary",
712
- data=exec_summary,
713
- file_name="ATP_Executive_Summary.txt",
714
- mime="text/plain"
715
- )
 
1
+ streamlit==1.32.0
2
+ plotly==5.19.0
3
+ pandas==2.2.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
streamlit-dashboard.py CHANGED
@@ -3,6 +3,7 @@ import plotly.graph_objects as go
3
  import plotly.express as px
4
  import pandas as pd
5
  import hmac
 
6
 
7
  # Page config
8
  st.set_page_config(
@@ -17,7 +18,15 @@ def check_password():
17
 
18
  def password_entered():
19
  """Checks whether a password entered by the user is correct."""
20
- if hmac.compare_digest(st.session_state["password"], st.secrets["password"]):
 
 
 
 
 
 
 
 
21
  st.session_state["password_correct"] = True
22
  del st.session_state["password"] # Don't store password
23
  else:
 
3
  import plotly.express as px
4
  import pandas as pd
5
  import hmac
6
+ import os
7
 
8
  # Page config
9
  st.set_page_config(
 
18
 
19
  def password_entered():
20
  """Checks whether a password entered by the user is correct."""
21
+ # Try environment variable first, then st.secrets, then default
22
+ correct_password = os.environ.get("password", None)
23
+ if correct_password is None:
24
+ try:
25
+ correct_password = st.secrets["password"]
26
+ except:
27
+ correct_password = "LangGraph@ATP2025!" # Fallback
28
+
29
+ if hmac.compare_digest(st.session_state["password"], correct_password):
30
  st.session_state["password_correct"] = True
31
  del st.session_state["password"] # Don't store password
32
  else: