# Deployment Status - 2026-09-14 ## Current State ### Backend (Docker) - **Flask API**: Running (restarted at 12:46 PM to reload code) - **MySQL**: Running (healthy) - **Version**: Backend 1.17.0 with delta optimization - **Code**: Volume-mounted from host (has latest changes) - **Status**: ✓ Ready to receive fingerprints ### Agent (SFTest VM - 192.168.100.10) - **Service**: Running - **Version**: 1.18.0 (with fingerprint computation) - **Status**: ✓ Sending fingerprints in payload - **Next Report**: Every 15 minutes (last attempt: 12:44 PM → 500 error) ### Issue Found **Problem**: Flask returned 500 error on collector POST at 12:44 PM **Root Cause**: Flask container wasn't reloaded after code changes (volume-mounted but cached in memory) **Fix Applied**: Restarted flask-shopdb-api-1 container at 12:46 PM **Next Step**: Wait for agent's next 15-minute report cycle to verify delta mode activation --- ## What's Deployed ### Backend Changes (1.17.0) 1. ✓ Advisory locks for applications (pg_advisory_xact_lock) 2. ✓ Advisory locks for events (pg_advisory_xact_lock) 3. ✓ UNIQUE constraint on (assetid, app_fingerprint) 4. ✓ Pre-compiled regex for fingerprint validation 5. ✓ Delta logic (_replace_applications with set operations) 6. ✓ Legacy fallback for agents without fingerprints 7. ✓ Migration 0020 applied (app_fingerprint column exists) ### Agent Changes (1.18.0) 1. ✓ SHA256 fingerprint computation (ComputeApplicationFingerprint) 2. ✓ Fingerprint included in collector payload 3. ✓ Algorithm matches Python backend exactly 4. ✓ UTF-8 encoding, lowercase hex output --- ## Architecture ``` ┌─────────────────────────────────────┐ │ SFTest VM (192.168.100.10) │ │ │ │ ShopDbEndpointAgent v1.18.0 │ │ - Collects app inventory │ │ - Computes SHA256 fingerprints │ │ - Posts to collector API │ │ every 15 minutes │ └──────────────┬──────────────────────┘ │ HTTPS POST │ /api/collector/endpoints ▼ ┌─────────────────────────────────────┐ │ Host PC (192.168.100.1) │ │ │ │ Docker: flask-shopdb-api-1 │ │ - Receives collector payload │ │ - Validates fingerprints │ │ - Computes delta (set operations) │ │ - Only touches changed apps │ │ │ │ Docker: flask-shopdb-db-1 (MySQL) │ │ - Stores application inventory │ │ - app_fingerprint column (SHA256) │ │ - UNIQUE constraint enforced │ └─────────────────────────────────────┘ ``` **NOT in Docker**: Agent/Tray are Windows executables on the VM, not in containers --- ## Monitoring Next Report ### Expected Timeline - Last report attempt: 12:44:10 PM (500 error) - Flask restarted: 12:46:00 PM - Next report: ~12:59 PM (15 minutes after 12:44) ### Success Indicators **Backend Logs** (should show): ``` [collector] asset_id=2528 hostname=DESKTOP-HF1K9M4 apps_added=0 apps_removed=0 unchanged=50 (delta mode) ``` **vs Legacy Mode** (should NOT show): ``` [collector] asset_id=2528 hostname=DESKTOP-HF1K9M4 apps_stored=50 (legacy mode) ``` ### Database Query ```sql -- Check if fingerprints are being stored SELECT assetid, displayname, app_fingerprint, recordedat FROM endpointapplications WHERE assetid = 2528 -- SFTest VM asset ORDER BY recordedat DESC LIMIT 10; ``` Expected: `app_fingerprint` column populated with 64-char hex strings --- ## Performance Validation ### Before (Agent 1.16.0 / Backend without delta) ``` DELETE FROM endpointapplications WHERE assetid=2528; -- 50 rows INSERT INTO endpointapplications VALUES (...); -- 50 rows Total: 100 database operations per report ``` ### After (Agent 1.18.0 / Backend 1.17.0 with delta) **First report after upgrade** (expected): ``` SELECT app_fingerprint FROM endpointapplications WHERE assetid=2528; -- 1 query (finds 0 existing fingerprints because backfill hasn't run yet) DELETE FROM endpointapplications WHERE assetid=2528; -- 0 rows (none with fingerprints) INSERT INTO endpointapplications VALUES (...); -- 50 rows (all new) Total: 51 operations (one-time setup) ``` **Subsequent reports with no changes** (expected): ``` SELECT app_fingerprint FROM endpointapplications WHERE assetid=2528; -- 1 query (returns 50 fps) Compare: incoming 50 fps vs existing 50 fps Delta: 0 to add, 0 to remove, 50 unchanged Total: 1 database operation (99% reduction!) ``` **Subsequent reports with 1 app changed** (typical): ``` SELECT app_fingerprint FROM endpointapplications WHERE assetid=2528; -- 1 query Compare: incoming 50 fps vs existing 50 fps Delta: 1 to add (new version), 1 to remove (old version), 49 unchanged DELETE WHERE app_fingerprint='old_fp'; -- 1 row INSERT VALUES ('new_fp', ...); -- 1 row Total: 3 database operations (97% reduction vs baseline) ``` --- ## Troubleshooting ### If Next Report Shows 500 Error **Check**: 1. Flask logs: `docker logs flask-shopdb-api-1 --tail 50` 2. Python traceback in logs 3. Plugin imports OK: `docker exec flask-shopdb-api-1 sh -c "python -c 'from plugins.endpoints.plugin import EndpointsPlugin'"` **Fix**: Restart container if code not reloaded ### If Next Report Shows "Legacy Mode" **Possible Causes**: 1. Agent not sending fingerprints (check agent version) 2. Backend not detecting fingerprints (check payload parsing) 3. Fingerprint validation failing (check backend regex) **Check Agent Payload** (in Flask logs): ``` Look for: "fingerprint": "a22de9ae7e641954..." ``` ### If Delta Mode Activated But All Apps Show as Changed **Possible Causes**: 1. Algorithm mismatch (C# vs Python) 2. Encoding difference (UTF-8 expected) 3. Case sensitivity (lowercase expected) **Verify**: Compare C# output vs Python backfill script output for same app --- ## Rollout Status ### Completed - ✓ Backend 1.17.0 deployed to Docker - ✓ Agent 1.18.0 deployed to SFTest VM (1 endpoint) - ✓ Migration 0020 applied - ✓ Flask restarted to reload code ### In Progress - ⏳ Waiting for next agent report (~12:59 PM) - ⏳ Validating delta mode activation - ⏳ Measuring actual performance impact ### Pending - Backend: Run backfill script (populate fingerprints for existing records) - Agent: Deploy to pilot group (10% of fleet) - Agent: Deploy to full fleet (remaining 90%) --- ## Expected Timeline **Today (2026-09-14)**: - 12:59 PM: Next agent report (should succeed with delta mode) - 1:00 PM: Verify fingerprints in database - 1:15 PM: Next report (verify 99% reduction) **This Week**: - Run backfill script on production database - Monitor SFTest for 24-48 hours - Verify delta mode stability **Next Week**: - Deploy agent 1.18.0 to 10% of fleet - Monitor fingerprint adoption rate - Measure actual write reduction **Month 1**: - Complete fleet rollout - Verify 99% write reduction achieved - Document actual vs expected performance --- ## Success Criteria ### Phase 1: SFTest Validation (Today) - [ ] Next report succeeds (no 500 error) - [ ] Backend logs show "delta mode" - [ ] Fingerprints populated in database - [ ] Subsequent report shows 1 operation (vs 100 before) ### Phase 2: Pilot (Week 1) - [ ] 10% of fleet running agent 1.18.0 - [ ] Fingerprint adoption rate: 10% - [ ] No errors in logs - [ ] Write volume reduced proportionally ### Phase 3: Full Rollout (Month 1) - [ ] 100% of fleet running agent 1.18.0 - [ ] Fingerprint adoption rate: 100% - [ ] Database writes: 1.92M/day → 19K/day (99% reduction) - [ ] No performance degradation --- ## Summary **Backend**: ✓ Ready (restarted at 12:46 PM) **Agent**: ✓ Ready (version 1.18.0 running) **Next Milestone**: Agent report at ~12:59 PM **Expected**: Delta mode activates, 99% write reduction begins **Status**: Waiting for next 15-minute report cycle to validate end-to-end functionality.