Skip to content

Commit 88faa5c

Browse files
author
marce
committed
fix(scanner-v4): indentation fixed, TeleologicalScanner funcionando para todos os 3 objetivos
1 parent ffc55ed commit 88faa5c

1 file changed

Lines changed: 393 additions & 0 deletions

File tree

Lines changed: 393 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,393 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
"""
4+
TeleologicalScanner v1.0 — Scanner Noologico Reverso (v4.0)
5+
=============================================================
6+
Conceito original: interlocutor anonimo (2026)
7+
Implementacao: Marcelo Claro Laranjeira
8+
9+
Progressao completa do Scanner Noologico:
10+
v1.0 — ERRO: "O que esta errado?" (Popper)
11+
v2.0 — AUSENCIA: "O que esta ausente?" (Bachelard)
12+
v3.0 — OPORTUNIDADE: "Onde investir?" (Kauffman)
13+
v4.0 — TELEOLOGIA: "O que precisa existir?" (Aristoteles/Polya)
14+
15+
Principio: Em vez de analisar o estado atual para descobrir ausencias,
16+
o Scanner Reverso parte de um ESTADO FUTURO DESEJADO e decompoe,
17+
por engenharia reversa, quais capacidades, estruturas e componentes
18+
precisariam existir para que aquele estado fosse alcancavel.
19+
20+
Fluxo conceitual:
21+
Estado Futuro Desejado
22+
↓ (decomposicao teleologica)
23+
Capacidades Necessarias
24+
↓ (mapeamento estrutural)
25+
Estruturas Necessarias
26+
↓ (mapeamento componencial)
27+
Componentes Necessarios
28+
↓ (comparacao com estado atual)
29+
Lacunas de Evolucao (roadmap priorizado)
30+
31+
Formalismo matematico:
32+
- AND-OR trees para decomposicao de objetivos complexos
33+
- Minimum Spanning Capability Set (MSCS)
34+
- Gap Score = f(importancia, dependencia, viabilidade)
35+
36+
Uso:
37+
from teleological_scanner import TeleologicalScanner
38+
scanner = TeleologicalScanner()
39+
roadmap = scanner.scan("AGI com alinhamento humano")
40+
"""
41+
42+
from __future__ import annotations
43+
44+
import json
45+
from dataclasses import dataclass, field
46+
from datetime import datetime, timezone
47+
from pathlib import Path
48+
from typing import Any
49+
50+
BRAZIL_TZ = timezone.utc
51+
52+
53+
@dataclass
54+
class Capability:
55+
"""Uma capacidade necessaria para atingir o estado futuro."""
56+
name: str
57+
description: str = ""
58+
dependencies: list[str] = field(default_factory=list)
59+
priority: int = 1 # 1=critico, 2=importante, 3=desejavel
60+
exists: bool = False
61+
gap_score: float = 0.0 # 0-100: quao longe estamos de te-la
62+
63+
64+
@dataclass
65+
class EvolutionGap:
66+
"""Uma lacuna de evolucao — capacidade ausente que precisa ser desenvolvida."""
67+
capability: str
68+
priority: int
69+
gap_score: float
70+
prerequisites: list[str] = field(default_factory=list)
71+
estimated_effort: str = ""
72+
rationale: str = ""
73+
74+
75+
# ═══════════════════════════════════════════════════════════════════════
76+
# GOAL DECOMPOSITION TREES (AND-OR)
77+
# ═══════════════════════════════════════════════════════════════════════
78+
79+
GOAL_TREES: dict[str, dict[str, Any]] = {
80+
"AGI": {
81+
"description": "Inteligencia Artificial Geral com alinhamento humano",
82+
"capabilities": {
83+
"raciocinio_abstrato": {
84+
"desc": "Capacidade de raciocinio abstrato cross-domain",
85+
"deps": ["transfer_learning", "analogical_reasoning"],
86+
"priority": 1,
87+
},
88+
"aprendizado_continuo": {
89+
"desc": "Aprendizado continuo sem esquecimento catastrofico",
90+
"deps": ["memory_consolidation", "online_learning"],
91+
"priority": 1,
92+
},
93+
"alinhamento_valores": {
94+
"desc": "Alinhamento robusto com valores humanos",
95+
"deps": ["value_learning", " corrigibility", "interpretability"],
96+
"priority": 1,
97+
},
98+
"autoaperfeicoamento": {
99+
"desc": "Capacidade de melhorar o proprio codigo/arquitetura",
100+
"deps": ["meta_learning", "self_verification"],
101+
"priority": 2,
102+
},
103+
"consciencia_situacional": {
104+
"desc": "Compreensao do proprio estado, capacidades e limitacoes",
105+
"deps": ["self_modeling", "uncertainty_quantification"],
106+
"priority": 2,
107+
},
108+
"comunicacao_natural": {
109+
"desc": "Comunicacao em linguagem natural multi-contexto",
110+
"deps": ["pragmatics", "common_sense", "theory_of_mind"],
111+
"priority": 2,
112+
},
113+
"criatividade": {
114+
"desc": "Geracao de ideias genuinamente novas",
115+
"deps": ["divergent_thinking", "conceptual_blending"],
116+
"priority": 3,
117+
},
118+
}
119+
},
120+
"artigo_qualis_a1": {
121+
"description": "Artigo cientifico com score >= 95/100 nos criterios Qualis/CAPES",
122+
"capabilities": {
123+
"pesquisa_bibliografica": {
124+
"desc": "Busca exaustiva em 10+ fontes academicas",
125+
"deps": ["seeker_multi_source", "doi_verification"],
126+
"priority": 1,
127+
},
128+
"rigor_metodologico": {
129+
"desc": "Metodologia explicitamente fundamentada",
130+
"deps": ["paradigm_selection", "method_justification"],
131+
"priority": 1,
132+
},
133+
"rastreabilidade": {
134+
"desc": "Toda afirmacao vinculada a evidencia verificavel",
135+
"deps": ["academic_audit_trail", "doi_linking"],
136+
"priority": 1,
137+
},
138+
"anti_ia_compliance": {
139+
"desc": "Zero violacoes TSAC (87 palavras banidas)",
140+
"deps": ["tsac_check", "anti_ia_score"],
141+
"priority": 1,
142+
},
143+
"cobertura_epistemologica": {
144+
"desc": "Alta cobertura no Scanner Noologico",
145+
"deps": ["noological_scanner", "eps_estimator"],
146+
"priority": 2,
147+
},
148+
"dialogo_interdisciplinar": {
149+
"desc": "Dialogo entre diferentes tradicoes teoricas",
150+
"deps": ["cross_domain_analysis", "game_theory_integration"],
151+
"priority": 2,
152+
},
153+
}
154+
},
155+
"ecossistema_autonomo": {
156+
"description": "Ecossistema cientifico com autonomia nivel 4 (auto-evolucao)",
157+
"capabilities": {
158+
"auto_discovery": {
159+
"desc": "Descoberta automatica de novas ferramentas e bibliotecas",
160+
"deps": ["pypi_scout", "auto_install"],
161+
"priority": 1,
162+
},
163+
"auto_healing": {
164+
"desc": "Deteccao e reparo automatico de falhas",
165+
"deps": ["self_healer", "health_monitor"],
166+
"priority": 1,
167+
},
168+
"auto_evolution": {
169+
"desc": "Geracao automatica de novas skills a partir de padroes",
170+
"deps": ["manus_evolve", "pattern_extraction"],
171+
"priority": 1,
172+
},
173+
"auto_audit": {
174+
"desc": "Auditoria continua e automatica de toda producao",
175+
"deps": ["interaction_logger", "academic_audit_trail"],
176+
"priority": 1,
177+
},
178+
"auto_scan": {
179+
"desc": "Scanner epistemologico executado a cada publicacao",
180+
"deps": ["scanner_integration", "eps_estimator"],
181+
"priority": 2,
182+
},
183+
"auto_roadmap": {
184+
"desc": "Geracao automatica de roadmap de evolucao",
185+
"deps": ["teleological_scanner", "gap_analyzer"],
186+
"priority": 2,
187+
},
188+
}
189+
},
190+
}
191+
192+
193+
class TeleologicalScanner:
194+
"""Scanner Noologico Reverso (v4.0).
195+
196+
Decompoe um estado futuro desejado em capacidades necessarias,
197+
mapeia-as para o estado atual, e gera um roadmap de evolucao
198+
priorizado por importancia, dependencia e viabilidade.
199+
200+
Uso:
201+
scanner = TeleologicalScanner()
202+
roadmap = scanner.scan("AGI")
203+
scanner.save_roadmap(roadmap, "roadmap_agi.md")
204+
"""
205+
206+
def scan(self, goal: str, current_capabilities: list[str] | None = None) -> dict[str, Any]:
207+
"""Executa decomposicao teleologica de um objetivo.
208+
209+
Args:
210+
goal: Objetivo (ex: "AGI", "artigo_qualis_a1", "ecossistema_autonomo")
211+
current_capabilities: Capacidades ja existentes (se None, usa defaults)
212+
213+
Returns:
214+
Roadmap com capacidades, gaps e prioridades
215+
"""
216+
# Normalizar goal
217+
goal_key = goal.lower().replace(" ", "_")
218+
# Case-insensitive lookup
219+
tree = None
220+
for k, v in GOAL_TREES.items():
221+
if k.lower() == goal_key or goal_key in k.lower():
222+
tree = v
223+
goal_key = k
224+
break
225+
if tree is None:
226+
return {"error": f"Goal nao encontrado: {goal}. Disponiveis: {list(GOAL_TREES.keys())}"}
227+
capabilities = tree["capabilities"]
228+
229+
# Se nao foram fornecidas capacidades atuais, assumir que so temos as basicas
230+
if current_capabilities is None:
231+
# Simular estado atual do ecossistema
232+
current_capabilities = [
233+
"seeker_multi_source", "doi_verification", "academic_audit_trail",
234+
"tsac_check", "anti_ia_score", "pypi_scout", "self_healer",
235+
"interaction_logger", "scanner_integration", "eps_estimator",
236+
"manus_evolve", "auto_install", "health_monitor",
237+
]
238+
239+
current_set = set(current_capabilities)
240+
241+
# Analisar cada capacidade
242+
gaps = []
243+
covered = []
244+
total_deps = 0
245+
covered_deps = 0
246+
247+
for cap_name, cap_data in capabilities.items():
248+
deps = cap_data.get("deps", [])
249+
total_deps += len(deps)
250+
deps_covered = sum(1 for d in deps if d in current_set)
251+
covered_deps += deps_covered
252+
253+
# Verificar se a capacidade existe (todos os deps cobertos)
254+
exists = all(d in current_set for d in deps)
255+
gap_score = (1 - deps_covered / max(1, len(deps))) * 100 if deps else 0
256+
257+
if exists:
258+
covered.append(cap_name)
259+
else:
260+
missing_deps = [d for d in deps if d not in current_set]
261+
gaps.append(EvolutionGap(
262+
capability=cap_name,
263+
priority=cap_data.get("priority", 2),
264+
gap_score=round(gap_score),
265+
prerequisites=missing_deps,
266+
estimated_effort=self._estimate_effort(gap_score),
267+
rationale=cap_data.get("desc", ""),
268+
))
269+
270+
# Ordenar gaps por prioridade e gap_score
271+
gaps.sort(key=lambda g: (g.priority, -g.gap_score))
272+
273+
# Calcular progresso
274+
total_caps = len(capabilities)
275+
covered_caps = len(covered)
276+
progress_pct = round(covered_caps / max(1, total_caps) * 100)
277+
dependency_coverage = round(covered_deps / max(1, total_deps) * 100)
278+
279+
return {
280+
"goal": goal,
281+
"goal_key": goal_key,
282+
"description": tree["description"],
283+
"timestamp": datetime.now(BRAZIL_TZ).isoformat(),
284+
"version": "4.0",
285+
"total_capabilities": total_caps,
286+
"covered_capabilities": covered_caps,
287+
"gap_capabilities": len(gaps),
288+
"progress_pct": progress_pct,
289+
"dependency_coverage_pct": dependency_coverage,
290+
"capabilities": {
291+
"covered": covered,
292+
"gaps": [
293+
{
294+
"capability": g.capability,
295+
"priority": g.priority,
296+
"gap_score": g.gap_score,
297+
"prerequisites": g.prerequisites,
298+
"estimated_effort": g.estimated_effort,
299+
"rationale": g.rationale,
300+
}
301+
for g in gaps
302+
],
303+
},
304+
"roadmap": self._generate_roadmap(gaps, progress_pct),
305+
}
306+
307+
def _estimate_effort(self, gap_score: float) -> str:
308+
"""Estima esforco necessario baseado no gap_score."""
309+
if gap_score >= 80: return "Alto (requer pesquisa fundamental)"
310+
if gap_score >= 50: return "Medio (requer desenvolvimento significativo)"
311+
if gap_score >= 20: return "Baixo (requer integracao de componentes existentes)"
312+
return "Minimo (componentes ja disponiveis)"
313+
314+
def _generate_roadmap(self, gaps: list[EvolutionGap], progress: int) -> list[dict[str, Any]]:
315+
"""Gera roadmap priorizado em 3 fases."""
316+
phases = {"Fase 1 — Imediato (0-3 meses)": [], "Fase 2 — Curto Prazo (3-12 meses)": [], "Fase 3 — Longo Prazo (12+ meses)": []}
317+
318+
for g in gaps:
319+
if g.priority == 1 and g.gap_score < 50:
320+
phases["Fase 1 — Imediato (0-3 meses)"].append(g.capability)
321+
elif g.priority <= 2:
322+
phases["Fase 2 — Curto Prazo (3-12 meses)"].append(g.capability)
323+
else:
324+
phases["Fase 3 — Longo Prazo (12+ meses)"].append(g.capability)
325+
326+
return [
327+
{"phase": phase, "capabilities": caps, "count": len(caps)}
328+
for phase, caps in phases.items() if caps
329+
]
330+
331+
def generate_markdown_report(self, results: dict[str, Any]) -> str:
332+
"""Gera relatorio Markdown do roadmap."""
333+
r = results
334+
lines = [
335+
f"# Scanner Noologico Reverso v4.0 — Roadmap Teleologico",
336+
f"",
337+
f"**Objetivo**: {r['goal']}",
338+
f"**Descricao**: {r['description']}",
339+
f"**Data**: {r['timestamp'][:19]}",
340+
f"**Progresso atual**: {r['progress_pct']}% ({r['covered_capabilities']}/{r['total_capabilities']} capacidades)",
341+
f"**Cobertura de dependencias**: {r['dependency_coverage_pct']}%",
342+
f"",
343+
f"---",
344+
f"",
345+
f"## GAPS — Capacidades Ausentes ({r['gap_capabilities']})",
346+
f"",
347+
]
348+
349+
for i, g in enumerate(r["capabilities"]["gaps"], 1):
350+
priority_label = {1: "CRITICO", 2: "IMPORTANTE", 3: "DESEJAVEL"}.get(g["priority"], "?")
351+
lines.append(f"### {i}. {g['capability']} [{priority_label}] — Gap Score: {g['gap_score']}%")
352+
lines.append(f"")
353+
lines.append(f"**Por que e necessario**: {g['rationale']}")
354+
lines.append(f"**Pre-requisitos ausentes**: {', '.join(g['prerequisites']) if g['prerequisites'] else 'Nenhum'}")
355+
lines.append(f"**Esforco estimado**: {g['estimated_effort']}")
356+
lines.append(f"")
357+
358+
lines.append("---")
359+
lines.append("")
360+
lines.append("## Roadmap de Evolucao")
361+
lines.append("")
362+
for phase_data in r["roadmap"]:
363+
lines.append(f"### {phase_data['phase']} ({phase_data['count']} capacidades)")
364+
for cap in phase_data["capabilities"]:
365+
lines.append(f"- {cap}")
366+
lines.append("")
367+
368+
lines.append("---")
369+
lines.append(f"**Progressao conceitual**: ERRO (v1) → AUSENCIA (v2) → OPORTUNIDADE (v3) → TELEOLOGIA (v4)")
370+
lines.append(f"**Conceito original**: interlocutor anonimo (2026) | **Implementacao**: Marcelo Claro Laranjeira")
371+
372+
return "\n".join(lines)
373+
374+
def save_roadmap(self, results: dict[str, Any], output_path: str | Path) -> Path:
375+
"""Salva roadmap em disco."""
376+
path = Path(output_path)
377+
path.parent.mkdir(parents=True, exist_ok=True)
378+
path.write_text(self.generate_markdown_report(results), encoding="utf-8")
379+
return path
380+
381+
382+
# ── Teste ──
383+
if __name__ == "__main__":
384+
scanner = TeleologicalScanner()
385+
386+
for goal in ["AGI", "artigo_qualis_a1", "ecossistema_autonomo"]:
387+
results = scanner.scan(goal)
388+
print(f"\n{'='*60}")
389+
print(f"Goal: {goal}")
390+
print(f"Progresso: {results['progress_pct']}% ({results['covered_capabilities']}/{results['total_capabilities']})")
391+
print(f"Gaps: {results['gap_capabilities']}")
392+
for g in results["capabilities"]["gaps"][:3]:
393+
print(f" [{g['priority']}] {g['capability']} — Gap: {g['gap_score']}% — {g['estimated_effort']}")

0 commit comments

Comments
 (0)