"""Bounded fan-out with explicit aggregation. Author: Sandeep Belgavi.""" from concurrent.futures import ThreadPoolExecutor, as_completed def collect(workers, limit=2): if type(limit) is not int or not 1 <= limit <= 8: raise ValueError("limit must be 1..8") if not isinstance(workers, dict) or not 1 <= len(workers) <= 8: raise ValueError("one to eight named workers required") if any(not isinstance(k, str) or not k or not callable(v) for k, v in workers.items()): raise ValueError("invalid worker") results, failures = {}, [] with ThreadPoolExecutor(max_workers=limit) as pool: pending = {pool.submit(fn): name for name, fn in workers.items()} for future in as_completed(pending): name = pending[future] try: value = future.result() if value not in {"normal", "degraded"}: raise ValueError("invalid result") results[name] = value except Exception: failures.append(name) status = "incomplete" if failures else ("conflict" if len(set(results.values())) > 1 else "consistent") return {"status": status, "results": dict(sorted(results.items())), "failures": sorted(failures)} if __name__ == "__main__": report = collect({"metrics": lambda: "degraded", "logs": lambda: "normal"}) print(f"status={report['status']} completed={len(report['results'])} failures={len(report['failures'])}")