Ctrl K
ComunidadGuías…

scripts/butler-dev-delegate-experience-probe.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env bash
# Read-only: dev delegate sim vs coding experience extraction gates (L3/L4).
#
# Sim content/review delegates do NOT write coding_experiences — extraction runs only
# on dev_engine success path (_try_extract_experience in delegate_phases).
#
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
export PYTHONPATH="$ROOT"

if [[ -f "$ROOT/.env" ]]; then
  # shellcheck source=scripts/lib/butler-source-env.sh
  source "$ROOT/scripts/lib/butler-source-env.sh"
  butler_source_env "$ROOT/.env" 2>/dev/null || true
fi

python3 - <<'PY'
import json
import os
from pathlib import Path

from butler.config import get_butler_home
from butler.dev_engine.dev_tools import dev_engine_enabled
from butler.memory.memory_scope import (
    project_coding_experiences_path,
    tenant_coding_experiences_path,
)
from butler.project.manager import get_project_manager

print("=== Dev delegate sim · experience extraction probe ===")
print()

de = dev_engine_enabled()
term = os.getenv("BUTLER_ENABLE_TERMINAL", "").strip() in ("1", "true", "yes", "on")
print(f"1. BUTLER_DEV_ENGINE={'on' if de else 'off'}  BUTLER_ENABLE_TERMINAL={'on' if term else 'off'}")
print("   Gates: dev role + DevPhase.DONE + verify_result.passed + edit snippets>20 + activated theorems")
print("   Sim content/review: no dev_engine path → no L3 auto-extract (expected)")
print("   Sim dev py_compile: may extract only if dev_engine on AND verify passes on code edits")
print()

home = Path(get_butler_home())
l4 = tenant_coding_experiences_path(home)
l4_n = 0
if l4.is_file():
    try:
        l4_n = len(json.loads(l4.read_text(encoding="utf-8")))
    except json.JSONDecodeError:
        l4_n = -1
print(f"2. L4 tenant: {l4} entries={l4_n}")

pm = get_project_manager()
for name in ("灵文1号", "普通试点项目"):
    proj = pm.get_project(name)
    ws = getattr(proj, "workspace", None) if proj else None
    if not ws:
        print(f"3. {name}: workspace missing")
        continue
    l3 = project_coding_experiences_path(Path(ws))
    n = 0
    if l3.is_file():
        try:
            rows = json.loads(l3.read_text(encoding="utf-8"))
            n = len(rows) if isinstance(rows, list) else len(rows.get("experiences", []))
        except json.JSONDecodeError:
            n = -1
    print(f"3. L3 {name}: {l3} entries={n}")

print()
print("OK: probe complete (informational; sim success does not require L3 growth)")
PY