Skip to content

[CI] (e2f7ab0) python/meeting-summarizer#2424

Closed
wizard-ci-bot[bot] wants to merge 1 commit into
mainfrom
wizard-ci-e2f7ab0-python-meeting-summarizer
Closed

[CI] (e2f7ab0) python/meeting-summarizer#2424
wizard-ci-bot[bot] wants to merge 1 commit into
mainfrom
wizard-ci-e2f7ab0-python-meeting-summarizer

Conversation

@wizard-ci-bot

@wizard-ci-bot wizard-ci-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown

Automated wizard CI run

Source: wizard-pr
Trigger ID: e2f7ab0
App: python/meeting-summarizer
App directory: apps/python/meeting-summarizer
Workbench branch: wizard-ci-e2f7ab0-python-meeting-summarizer
Wizard branch: release-please--branches--main--components--wizard
Context Mill branch: main
PostHog (MCP) branch: master
Timestamp: 2026-07-06T22:08:04.119Z
Duration: 260.7s

YARA Scanner

✓ 74 tool calls scanned, 0 violations detected

No violations: ✓ 74 clean scans

@wizard-ci-bot

wizard-ci-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Author

Now I have all the context I need. Let me produce the evaluation.


PR Evaluation Report

Summary

This PR integrates PostHog into a Python meeting-summarizer app (server.py + user_service.py backend, vanilla JS frontend). The backend integration is well-implemented using the Posthog() class constructor, exception autocapture, atexit-registered shutdown, and meaningful capture calls. However, the frontend integration is entirely non-functional because the posthog-js library is never loaded—no <script> tag was added to either HTML file—rendering all client-side identify/capture calls dead code.

Files changed Lines added Lines removed
6 +402 -58

Confidence score: 4/5 👍

  • Frontend posthog-js never loads: Neither login.html nor dashboard.html includes a <script> tag for posthog-js (CDN snippet or otherwise). The JS code checks !window.posthog and silently bails, so all client-side analytics—identify(), capture(), dashboard_loaded, meeting_viewed, logout_clicked, meeting_upload_started—are completely non-functional. [CRITICAL]
  • No .env.example committed: The .env file with the real key exists locally but is not committed (only the diff matters). There is no .env.example documenting POSTHOG_PROJECT_TOKEN and POSTHOG_HOST for collaborators. [MEDIUM]
  • No reverse proxy configured: The app intends client-side posthog-js usage, which benefits from a reverse proxy to circumvent ad blockers. None is configured. [MEDIUM]

File changes

Filename Score Description
server.py 4/5 Solid backend PostHog integration: init with Posthog(), enable_exception_autocapture, atexit shutdown, helper methods for capture/exception/person-props, events on login/create/delete, exception capture in all HTTP verb handlers. Exposes /api/posthog/config endpoint for frontend.
user_service.py 4/5 Clean PostHog integration in background service: same init pattern, capture on user registration/deactivation, person property sync, graceful shutdown. Wrapped main() in try/finally for proper cleanup.
static/app.js 2/5 Has well-structured identify/capture calls but entirely non-functional—window.posthog is never defined because no script tag loads posthog-js.
static/login.js 2/5 Same issue: identify on login and posthog init code exist but window.posthog is always undefined.
requirements.txt 5/5 Correctly adds posthog>=7.22.0.
posthog-setup-report.md 4/5 Helpful report documenting events, linking dashboards, and listing verification steps.

App sanity check ⚠️

Criteria Result Description
App builds and runs Yes Python server will run; frontend PostHog silently fails (no crash, just no analytics)
Preserves existing env vars & configs Yes No existing functionality broken
No syntax or type errors Yes All code is syntactically valid
Correct imports/exports Yes from posthog import Posthog is correct for the Python SDK
Minimal, focused changes Yes All changes relate to PostHog integration; user_service.py refactor to try/finally is reasonable
Pre-existing issues None

Issues

  • posthog-js script tag missing from HTML: login.html and dashboard.html do not include a <script> tag to load posthog-js (e.g., <script src="https://us-assets.i.posthog.com/static/array.js"></script> or equivalent CDN snippet). The JS files reference window.posthog which is never defined, so initializePostHog() always exits at the !window.posthog guard. Add the PostHog JS snippet to both HTML <head> sections before the app script loads. [CRITICAL]
  • No .env.example: Environment variables POSTHOG_PROJECT_TOKEN and POSTHOG_HOST are required but not documented in a committed .env.example file. [MEDIUM]

Other completed criteria

  • Python SDK correctly uses Posthog() class constructor (instance-based API)
  • atexit.register(posthog_client.shutdown) ensures flush on exit
  • Explicit posthog_client.shutdown() in finally blocks for both server and service
  • Helper methods (_capture_event, _capture_exception, _set_person_properties) encapsulate PostHog calls with null-safety checks

PostHog implementation ⚠️

Criteria Result Description
PostHog SDKs installed Yes posthog>=7.22.0 added to requirements.txt. Frontend intended posthog-js but script tag is missing.
PostHog client initialized No Backend: correctly initialized with Posthog() constructor. Frontend: window.posthog.init() code exists but posthog-js is never loaded (no script tag in HTML).
capture() Yes Server-side: user_logged_in, login_failed, meeting_created, meeting_deleted with rich properties. Client-side captures exist but are dead code.
identify() No Frontend posthog.identify() calls exist with correct patterns but will never execute. Server uses posthog_client.set() correctly for person properties.
Error tracking Yes enable_exception_autocapture=True on both clients; manual capture_exception() in all HTTP verb exception handlers and user_service main().
Reverse proxy No Client-side posthog-js integration was intended; no reverse proxy configured.

Issues

  • Frontend PostHog integration is non-functional: The posthog-js library is never loaded via <script> tag. All client-side identify(), capture(), and init logic silently fails. This means 4 of 10 documented events (meeting_viewed, meeting_upload_started, dashboard_loaded, logout_clicked) will never fire, and user identification on the frontend never occurs. Add the PostHog HTML snippet to both login.html and dashboard.html. [CRITICAL]
  • No reverse proxy: Since client-side posthog-js was intended, a reverse proxy should be configured to avoid ad-blocker interference. [MEDIUM]

Other completed criteria

  • API key loaded from os.getenv('POSTHOG_PROJECT_TOKEN') — not hardcoded
  • Host loaded from os.getenv('POSTHOG_HOST') — correctly configured
  • enable_exception_autocapture=True on both Python clients
  • atexit.register() used for shutdown in both modules
  • Person properties set via posthog_client.set() (correct Python SDK pattern since there's no identify() method)
  • /api/posthog/config endpoint avoids hardcoding credentials in frontend JS

PostHog insights and events ⚠️

Filename PostHog events Description
server.py user_logged_in, login_failed, meeting_created, meeting_deleted Tracks auth flow and meeting CRUD lifecycle. Properties include login method, meeting dimensions (transcript length, action items, participants). Exception capture on all HTTP verbs.
user_service.py user_registered, user_deactivated Tracks user lifecycle in background service with boolean metadata properties.
static/app.js dashboard_loaded, meeting_viewed, meeting_upload_started, logout_clicked ⚠️ Non-functional — posthog-js never loads. Would track dashboard engagement and meeting interaction funnel.
static/login.js (identify only) ⚠️ Non-functional — posthog-js never loads. Would identify user on successful login.

Issues

  • 4 of 10 events are dead code: meeting_viewed, meeting_upload_started, dashboard_loaded, logout_clicked will never fire because the posthog-js script is not loaded. This breaks the meeting engagement funnel (dashboard → upload → view). [CRITICAL]

Other completed criteria

  • Server-side events represent real user actions (login, CRUD operations, user lifecycle)
  • Events enable product insights: login success funnel, meeting creation volume, user lifecycle
  • Events include enriched properties: transcript_length, action_item_count, participant_count, duration_minutes, is_demo_user
  • No PII in event properties: emails handled via email_domain extraction (not full email); PII (email, username, full_name) correctly placed in person properties via set() / identify()
  • Event names follow consistent snake_case convention with descriptive [object]_[verb] pattern
  • login_failed uses hashed distinct_id (login_attempt_{hash}) to avoid fabricated IDs while grouping failures — acceptable for unauthenticated context

Reviewed by wizard workbench PR evaluator

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants