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]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.