Investigar dominios desconocidos (repos, datasets, corpus) con mapeo barato, budget de exploracion acotado y re-plan disciplinado que solo dispara al invalidar una hipotesis.
Construir agentes que investigan dominios desconocidos (codebases, datasets, documentos) sin quemar el budget de contexto. Combina tres movimientos de ingenieria: mapeo barato de la superficie del problema, priorizacion explicita de donde invertir, y deep-dive selectivo solo en nodos prometedores. El re-plan no es reflejo de cada turno; dispara unicamente cuando una hipotesis queda invalidada por evidencia. Un budget duro (lecturas o tokens) es la cota de seguridad que garantiza terminacion aunque el dominio sea infinito. [DOC]
El artefacto construible es un loop con: (1) scratchpad persistido que separa plan, hypotheses y findings; (2) contador de budget que decrementa por cada lectura cara; (3) regla de re-plan tipada que solo corre ante hypothesis_invalidated. [INFERENCIA]
NO la uses cuando el dominio es pequeno y leerlo entero es mas barato que mapearlo (umbral practico: < ~15 archivos o cabe en una ventana de contexto); ni cuando la tarea es determinista y no requiere descubrimiento; ni cuando ya conoces el nodo objetivo y solo necesitas leerlo. [SUPUESTO]
| Campo | Obligatorio | Nota | |
|---|---|---|---|
| In | goal | si | Pregunta concreta a resolver, no "entender el repo". [DOC] |
| In | budget | si | Entero de lecturas caras o tokens. Sin esto → detener y pedir. [DOC] |
| In | surface_root | si | Raiz a mapear (path, glob o dataset). [CONFIG] |
| In | cheap_tools | default | Glob/Grep/Bash de listado. [CONFIG] |
| Out | findings[] | si | Cada uno con node + evidencia + tag de provenance. |
| Out | replans[] | si | Cada re-plan con la hipotesis invalidada que lo disparo. |
| Out | stop_reason | si | budget_exhausted o goal_resolved. |
| Out | deliverable | si | Sintetizado desde findings, nunca desde memoria difusa. |
Si falta goal o budget, emite {VACIO_CRITICO} y pide el dato; no auto-completes el budget. [DOC]
budget = N lecturas caras o tokens antes de empezar y persiste el contador en el scratchpad. Sin esto el loop no tiene condicion de paro. [DOC]Glob/Grep (no lecturas completas) para mapear la superficie: estructura, nombres, entrypoints. Cada item es candidato a deep-dive, no contenido leido. El mapeo NO decrementa budget. [INFERENCIA]Read decrementa el budget. Registra findings con referencia al nodo y un tag de provenance. [DOC]findings. Registra stop_reason. [DOC]Usa el compilador local cuando el loop deba quedar validado antes de entregarse o integrarse en otro agente. [DOC]
python3 scripts/compile-adaptive-investigation.py --input path/to/investigation.json --format markdown
python3 scripts/compile-adaptive-investigation.py --input path/to/investigation.json --format json --output investigation-report.jsonEl compilador carga: [CÓDIGO]
| Archivo | Proposito |
|---|---|
assets/investigation-schema.json | Campos requeridos: objetivo, budget, mapa, hipotesis, deep-dives, replans, stop condition, deliverable. |
assets/investigation-policy.json | Reglas de budget, tools baratas/caras, triggers de re-plan, motivos de paro, anti-patrones bloqueados. |
assets/report-template.md | Forma estable del reporte Markdown. |
Ejecuta bash scripts/check.sh despues de editar esta skill, sus assets o fixtures. El check valida casos positivos y rechaza investigaciones sin budget duro o con re-plan reflejo. [CÓDIGO]
# GOOD: cheap map -> ranked hypotheses -> selective deep-dive -> disciplined replan
def adaptive_investigate(goal, budget=8):
scratch = {"plan": [], "hypotheses": rank(initial_hypotheses(goal)), "findings": []}
surface = cheap_map() # glob/grep only, no full reads, no budget spent
while budget > 0 and not goal_resolved(scratch):
hyp = scratch["hypotheses"][0]
node = pick_node(surface, hyp)
evidence = deep_dive(node) # one expensive Read
budget -= 1
scratch["findings"].append({"node": node, "evidence": evidence})
if invalidates(evidence, hyp):
scratch["hypotheses"] = rank(reprioritize(scratch["hypotheses"], evidence))
# else: keep going, do NOT replan reflexively
persist(scratch)
return synthesize(scratch["findings"], stop_reason(budget, scratch))# ANTI: rigid upfront plan, read everything, reflexive replan every turn
def naive_investigate(goal):
plan = make_full_plan_upfront(goal) # rigid, no adaptation
data = read_all_files() # blows the context budget
for step in plan:
plan = make_full_plan_upfront(goal) # reflexive replan -> loop of doubt
act(step, data)
return summarize(data)goal dentro del budget, no auditar todo. [INFERENCIA]goal: "donde se valida auth en un monorepo de 4000 archivos", budget=8. [DOC]
Glob **/auth*, Grep -l "validateToken|requireAuth" → 11 nodos candidatos.middleware/auth.ts (entrypoint, alto valor) > H2 services/session/* > H3 tests.requireAuth, pero delega la validacion real → H1 parcialmente invalidada (no es donde se valida).lib/jwt/verify.ts; sube al top.lib/jwt/verify.ts (7→6): contiene la verificacion de firma y expiracion → goal_resolved.stop_reason=goal_resolved, deliverable cita los 2 nodos. Budget restante 6 (cobertura eficiente). [INFERENCIA]Toda investigacion debe satisfacer todas estas condiciones para considerarse completa: [DOC]
Glob/Grep), sin lecturas completas, y no consume budget.plan y findings se persisten en scratchpad tipado (no en prosa difusa).stop_reason registrada (budget agotado u objetivo resuelto).| Sintoma | Diagnostico | Accion |
|---|---|---|
| El loop no termina | Sin budget duro o sin decremento | Detener; instalar contador antes de seguir. [DOC] |
| Re-planificas cada turno | Re-plan reflejo, no tipado | Solo re-prioriza ante hypothesis_invalidated. [DOC] |
| Budget cae rapido sin senal | Deep-dives sin hipotesis que los justifique | Vuelve a rank; no leas "lo interesante". [INFERENCIA] |
| Mapeo consume budget | Estas leyendo archivos completos en el map | Usa Glob/Grep; el cuerpo se lee solo en deep-dive. [DOC] |
| Deliverable no rastreable | Sintetizaste desde memoria | Reconstruye desde findings con sus nodos. [INFERENCIA] |
| Dos hipotesis empatadas siempre | Ranking sin desempate | Prioriza la mas barata de invalidar (mas informacion/budget). [SUPUESTO] |
{VACIO_CRITICO}: detener y pedir, nunca auto-fijar. [DOC]surface_root; no empieces deep-dives a ciegas. [INFERENCIA]goal_unresolved honesto. [INFERENCIA]session-lifecycle-management para fork vs fresh. [SUPUESTO]katas-adaptive-investigation.provenance-engineering (trazar cada finding a su fuente), session-lifecycle-management (fork vs fresh cuando el mundo cambia). [DOC]JaviMontano/jm-adk-beta
fdad39c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.