mirror of
https://github.com/hansjone/oclaw.git
synced 2026-10-14 13:43:17 +08:00
Converge manager out of product roles and drop dead inherit prefs.
Specialists-only binding/prewarm/MCP allowlists fold legacy manager aliases into generalist; stop persisting confirm/plan prefs and strip inherit from prompt signatures. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
bc20b41ee2
commit
454c841af7
20 changed files with 131 additions and 290 deletions
|
|
@ -13,22 +13,8 @@ class _DummyStore:
|
|||
return str(self._settings.get(key, ""))
|
||||
|
||||
|
||||
def test_get_manager_prompt_prebuild_includes_structured_skills(monkeypatch) -> None:
|
||||
def test_get_manager_prompt_prebuild_is_legacy_stub(monkeypatch) -> None:
|
||||
monkeypatch.setattr(pp, "discover_specialist_ids", lambda: ("generalist", "ops", "memory", "image"))
|
||||
monkeypatch.setattr(
|
||||
pp,
|
||||
"list_experts",
|
||||
lambda: [
|
||||
{"id": "generalist", "files": {"ROLE_SYSTEM.md": "General specialist for broad tasks."}},
|
||||
{"id": "ops", "files": {"ROLE_SYSTEM.md": "Ops specialist for runtime and services."}},
|
||||
],
|
||||
)
|
||||
monkeypatch.setattr(pp, "expert_workspace_signature_token", lambda: ("sig",))
|
||||
|
||||
def _ctx(_role: str, template_vars: dict[str, Any] | None = None) -> str:
|
||||
return f"CTX\n{str((template_vars or {}).get('MANAGER_DYNAMIC_EXPERTS_HINT') or '')}"
|
||||
|
||||
monkeypatch.setattr(pp, "build_role_system_context", _ctx)
|
||||
|
||||
out = pp.get_manager_prompt_prebuild(
|
||||
store=_DummyStore(),
|
||||
|
|
@ -37,20 +23,11 @@ def test_get_manager_prompt_prebuild_includes_structured_skills(monkeypatch) ->
|
|||
memory_enabled=True,
|
||||
)
|
||||
assert "generalist" in str(out.get("allowed_fixed") or "")
|
||||
assert "- generalist:" in str(out.get("manager_context") or "")
|
||||
assert "General specialist for broad tasks." in str(out.get("manager_context") or "")
|
||||
assert "ops" in str(out.get("allowed_fixed") or "")
|
||||
assert str(out.get("manager_context") or "") == ""
|
||||
|
||||
|
||||
def test_warm_startup_prompt_prebuild_warms_all_roles(monkeypatch) -> None:
|
||||
monkeypatch.setattr(
|
||||
pp,
|
||||
"get_manager_prompt_prebuild",
|
||||
lambda **_k: {
|
||||
"manager_context": "manager_ctx",
|
||||
"allowed_fixed": ("generalist", "ops"),
|
||||
"allowed_fixed_quoted": '"generalist", "ops"',
|
||||
},
|
||||
)
|
||||
def test_warm_startup_prompt_prebuild_warms_specialists_only(monkeypatch) -> None:
|
||||
monkeypatch.setattr(pp, "discover_specialist_ids", lambda: ("generalist", "ops"))
|
||||
monkeypatch.setattr(pp, "build_role_system_context", lambda role, template_vars=None: f"{role}_ctx")
|
||||
|
||||
|
|
@ -71,20 +48,13 @@ def test_warm_startup_prompt_prebuild_warms_all_roles(monkeypatch) -> None:
|
|||
assert out["ok"] is True
|
||||
role_map = captured.get("role_base_systems") if isinstance(captured, dict) else {}
|
||||
assert isinstance(role_map, dict)
|
||||
assert "manager" in role_map
|
||||
assert "manager" not in role_map
|
||||
assert "generalist" in role_map
|
||||
assert "ops" in role_map
|
||||
|
||||
|
||||
def test_runtime_prewarm_prompts_snapshot_returns_roles(monkeypatch) -> None:
|
||||
monkeypatch.setattr(pp, "discover_specialist_ids", lambda: ("generalist", "ops"))
|
||||
monkeypatch.setattr(
|
||||
pp,
|
||||
"get_manager_prompt_prebuild",
|
||||
lambda **_k: {
|
||||
"manager_context": "manager_ctx",
|
||||
},
|
||||
)
|
||||
monkeypatch.setattr(pp, "build_role_system_context", lambda role, template_vars=None: f"{role}_ctx")
|
||||
monkeypatch.setattr(pp, "get_executor_prompt_static", lambda **kwargs: f"exec::{kwargs.get('skill_binding_role')}")
|
||||
monkeypatch.setattr(pp, "default_registry", lambda **kwargs: object())
|
||||
|
|
@ -92,54 +62,32 @@ def test_runtime_prewarm_prompts_snapshot_returns_roles(monkeypatch) -> None:
|
|||
out = pp.runtime_prewarm_prompts_snapshot(store=_DummyStore())
|
||||
assert out["ok"] is True
|
||||
prompts = out.get("prompts") or {}
|
||||
assert "manager" in prompts
|
||||
assert "manager" not in prompts
|
||||
assert "generalist" in prompts
|
||||
assert "ops" in prompts
|
||||
assert prompts["manager"].get("system_prompt") == "exec::manager"
|
||||
assert prompts["generalist"].get("system_prompt") == "exec::generalist"
|
||||
assert prompts["ops"].get("system_prompt") == "exec::ops"
|
||||
assert "manager_system_prompt" not in prompts["manager"]
|
||||
assert "executor_system_prompt" not in prompts["manager"]
|
||||
assert "manager_user_scaffold" not in prompts["manager"]
|
||||
|
||||
aliased = pp.runtime_prewarm_prompts_snapshot(store=_DummyStore(), role="manager")
|
||||
assert aliased["ok"] is True
|
||||
assert aliased.get("roles") == ["generalist"]
|
||||
assert "generalist" in (aliased.get("prompts") or {})
|
||||
|
||||
|
||||
def test_manager_prompt_prebuild_cache_invalidates_on_workspace_revision_change(monkeypatch) -> None:
|
||||
token = {"v": 1}
|
||||
calls = {"ctx": 0}
|
||||
|
||||
monkeypatch.setattr(pp, "discover_specialist_ids", lambda: ("generalist", "ops"))
|
||||
monkeypatch.setattr(
|
||||
pp,
|
||||
"list_experts",
|
||||
lambda: [{"id": "generalist", "files": {"ROLE_SYSTEM.md": "General specialist"}}],
|
||||
)
|
||||
monkeypatch.setattr(pp, "expert_workspace_signature_token", lambda: ("revision", token["v"]))
|
||||
|
||||
def _ctx(_role: str, template_vars: dict[str, Any] | None = None) -> str:
|
||||
calls["ctx"] += 1
|
||||
return f"CTX\n{str((template_vars or {}).get('MANAGER_DYNAMIC_EXPERTS_HINT') or '')}"
|
||||
|
||||
monkeypatch.setattr(pp, "build_role_system_context", _ctx)
|
||||
|
||||
_ = pp.get_manager_prompt_prebuild(
|
||||
def test_manager_prompt_prebuild_stub_is_stateless(monkeypatch) -> None:
|
||||
monkeypatch.setattr(pp, "discover_specialist_ids", lambda: ("generalist", "ops", "memory"))
|
||||
a = pp.get_manager_prompt_prebuild(
|
||||
store=_DummyStore(),
|
||||
registry=object(),
|
||||
base_url="",
|
||||
memory_enabled=True,
|
||||
)
|
||||
_ = pp.get_manager_prompt_prebuild(
|
||||
b = pp.get_manager_prompt_prebuild(
|
||||
store=_DummyStore(),
|
||||
registry=object(),
|
||||
base_url="",
|
||||
memory_enabled=True,
|
||||
memory_enabled=False,
|
||||
)
|
||||
assert calls["ctx"] == 1
|
||||
|
||||
token["v"] = 2
|
||||
_ = pp.get_manager_prompt_prebuild(
|
||||
store=_DummyStore(),
|
||||
registry=object(),
|
||||
base_url="",
|
||||
memory_enabled=True,
|
||||
)
|
||||
assert calls["ctx"] == 2
|
||||
assert a.get("manager_context") == ""
|
||||
assert "memory" not in (b.get("allowed_fixed") or ())
|
||||
assert "memory" in (a.get("allowed_fixed") or ())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue