#!/usr/bin/env python3 import json,urllib.request,ssl,time ts = time.strftime("%Y-%m-%dT%H:%M:%S") ctx = ssl._create_unverified_context() req = urllib.request.Request("https://127.0.0.1/api/architecture-scanner.php", headers={"Host":"weval-consulting.com"}) data = json.loads(urllib.request.urlopen(req, context=ctx, timeout=30).read()) # Handle nested recommendations structure recs_data = data.get("recommendations", {}) if isinstance(recs_data, dict): recs = recs_data.get("recommendations", []) archi_score = recs_data.get("score", data.get("score", "?")) else: recs = recs_data if isinstance(recs_data, list) else [] archi_score = data.get("score", "?") SQUAD = { "INFRA":{"sq":"infra","lead":"CORTEX"}, "DOCKER":{"sq":"infra","lead":"CORTEX"}, "SECURITY":{"sq":"security","lead":"Dark Tools"}, "OPTIMIZATION":{"sq":"ia","lead":"WEVIA Master"}, "SCALABILITY":{"sq":"dev","lead":"NonReg"}, "KNOWLEDGE":{"sq":"ia","lead":"DeerFlow"}, "AI":{"sq":"ia","lead":"OpenClaw"}, } agenda = {"ts":ts,"type":"archi-review","title":"Archi Review "+ts[:10], "score":archi_score,"total_recs":len(recs), "items":[],"decisions":[],"actions":[]} for r in recs: if not isinstance(r, dict): continue cat = r.get("category","INFRA") sev = r.get("severity","info") sq = SQUAD.get(cat, {"sq":"infra","lead":"CORTEX"}) agenda["items"].append({"severity":sev,"category":cat,"title":r.get("title",""), "squad":sq["sq"],"lead":sq["lead"],"status":"pending"}) dl = "24h" if sev=="critical" else ("7j" if sev=="warning" else "30j") dec = "FIX IMMEDIAT" if sev=="critical" else ("PLANIFIER" if sev=="warning" else "BACKLOG") agenda["decisions"].append({"item":r.get("title",""),"decision":dec, "assigned_to":sq["lead"],"deadline":dl}) if sev in ["critical","warning"]: agenda["actions"].append({"action":r.get("title",""),"agent":sq["lead"], "cmd":r.get("fix_cmd",""),"status":"pending"}) # Add platform health summary agenda["health"] = { "score": archi_score, "servers": len(data.get("servers",[])), "docker": len(data.get("docker",[])), "nginx_domains": len(data.get("nginx_domains",[])), "applications": len(data.get("applications",[])), "crons_total": data.get("crons",{}).get("s204_total",0), "status": "GREEN" if not any(r.get("severity")=="critical" for r in recs) else "RED" } json.dump(agenda, open("/var/www/html/api/meeting-archi-agenda.json","w"), indent=2, ensure_ascii=False) print("AGENDA: %d items, %d decisions, %d actions | Score %s | Status %s" % ( len(agenda["items"]),len(agenda["decisions"]),len(agenda["actions"]), archi_score, agenda["health"]["status"]))