Spaces:
Sleeping
ACE SkillManager Rewrite β Plan v3
Semi-temporary planning doc. Delete once PR 3 lands and is merged.
PR 1 β Substrate
ace/core/context.py:95 β add field to ACEStepContext:
injected_skill_ids: tuple[str, ...] = ()
ace/core/skillbook.py:226 β add counters to Skill:
used_count: int = 0helpful_count: int = 0harmful_count: int = 0neutral_count: int = 0
ace/core/skillbook.py β add Skillbook.tag_skill(skill_id, delta: Literal[+1, -1, 0]) method. Keep the TAG branch in _apply_operation as its implementation so serialized UpdateOperation(TAG) still works.
ace/core/skillbook.py:535 β as_prompt() stays unchanged (no counter rendering).
Agent step (ace/implementations/agent.py:96) β after rendering the skillbook into the prompt, write injected_skill_ids onto the context and bump used_count on each. This is the only upstream counter touched.
Remove citation plumbing:
ace/core/outputs.py:52β deleteSkillTag.ace/core/outputs.py:79β deleteReflectorOutput.skill_tags.ace/implementations/skill_manager.py:109-112β remove theskill_tagsconsumer block.
Docs:
docs/design/ACE_ARCHITECTURE.mdβ update Skill section (counters, injection-based attribution).docs/design/ACE_DECISIONS.mdβ add "Injection is ground truth; citation dropped."
PR 2 β Reflector & RR prompts
ReflectorOutput stays pure analysis β reasoning, error_identification, root_cause_analysis, correct_approach, key_insight. No tagging fields, no harmful_ids/helpful_ids.
Reflector prompt (ace/implementations/prompts.py:419-432) β delete REFLECTOR_SKILL_EVAL_SECTION entirely.
RR prompt (ace/implementations/rr/prompts.py:115-136) β delete the re.findall citation recipe. No replacement. RR may still be told "inspect the skillbook (covered / contradicted / gap) and narrate what you find" as analysis guidance β never as a decision.
Two read-only RR tools (so RR can enrich its narrative without citations):
search_skillbook(query, top_k)β wrapsretrieve_top_k.read_skill(id)βSkillbook.get_skill. Return value includes counters.
ace/steps/rr_step.py:
_build_traces_dict(line 267) β dropskill_ids; addinjected_skill_idsfrom context.- Line 399 β remove the
skill_tags=[]remnant in the timeout fallback.
RR batch input preserved at the caller level β contract unchanged.
PR 3 β Rewrite SkillManager (same class)
Rewrite SkillManager on top of RecursiveAgent. Same class name, same SkillManagerLike protocol, same UpdateStep wrapper β nothing upstream changes.
Mutation tools (operate on the real Skillbook, no staging):
add_skill(section, content, justification, evidence)βSkillbook.add_skill.update_skill(skill_id, content?, justification?, evidence?)βSkillbook.update_skill.remove_skill(skill_id, reason)βSkillbook.remove_skill.tag_skill(skill_id, delta: +1 | -1 | 0)βSkillbook.tag_skill.
Read-only tools:
search_skills(query, top_k)β returns skills with counters.read_skill(id)β returns skill with counters.
Sandbox:
sandbox_eval(code)β reuseregister_execute_code; opt-in per runner.
Termination:
finalize(reasoning)β terminates the loop; returnsSkillManagerOutputas an audit log of what was done, not a plan to be applied.
Delete ApplyStep (ace/steps/apply.py:10) and remove it from the ACE pipeline composition. UpdateStep is the sole SM invocation and the skillbook is already mutated when it returns. UpdateStep.max_workers=1 stays.
SkillManagerOutput shape β reasoning: str + operations: list[UpdateOperation]. Operations become a post-hoc audit trail. Same dataclass, same serialization; semantic shift only.
UpdateBatch / apply_update / _apply_operation remain for offline reconstruction and tests, but the online path no longer flows through them.
SM prompt (ace/implementations/prompts.py:439+):
- Drop
<skill_effectiveness>section (lines 505-513). - Instruct the SM that it decides helpful/harmful/neutral from
injected_skill_ids+ outcome + reflection. - Instruct the SM to REMOVE skills whose
harmful_count β₯ Nwhen it encounters them during investigation. Counters are surfaced viaread_skill/search_skills, not the rendered skillbook.
AgenticConfig(max_requests=β¦) β max_requests=1 degrades to a single-tool-call pass.
Docs:
docs/design/ACE_ARCHITECTURE.mdβ SM section (tools, direct mutation, no ApplyStep).docs/design/ACE_REFERENCE.mdβ tool surface.docs/design/ACE_DECISIONS.mdβ "SM mutates directly; Reflector is analysis-only."
Out of scope
RetrieveStep/ production top-k injection.- Sandbox-gated commit gating (Voyager-style verify-before-ADD).
- Counter decay / windowing.
- Global "sweep all skills with harmful_count β₯ N" tool.
Ship order
PR 1 β PR 2 β PR 3.