scripts/butler-dev-delegate-experience-probe.sh
Rama main · réplica de lectura del repositorio original.
#!/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