Skill Composition and Reuse¶
Miért kell composition?¶
Ha minden skill egy fókuszált capability, akkor egy valódi user goal gyakran több skill együttműködését igényli.
Például:
"Nézd meg ezt a hibás PR-t, javítsd a tesztet és frissítsd a dokumentációt."
Ez több külön responsibility:
PR Review Skill
Test Failure Analysis Skill
Implementation Skill
Documentation Update Skill
A kérdés:
Hogyan kombináljuk ezeket úgy, hogy ne egy új mega-skill legyen belőlük?
Ez a skill composition problémája.
Atomic vs composite capability¶
Egy atomic skill egy jól körülhatárolt task-level responsibility.
Például:
Analyze Test Failure
Egy composite capability több ilyen skill eredményét használhatja:
Resolve Failing Pull Request
├── review_pull_request
├── analyze_test_failure
├── propose_code_change
└── verify_tests
A composite capability nem feltétlenül maga is „skill”. Lehet:
- workflow,
- orchestrator service,
- agentic loop,
- planner/executor rendszer.
Ez fontos határ.
Mikor hívjon egy skill másik skillt?¶
Közvetlen skill-to-skill dependency lehet valid, ha a dependency:
- stabil,
- egyirányú,
- szűk contracttal rendelkezik,
- a parent capability természetes része.
Például:
Release Notes Skill
↓
Change Summary Skill
Ha a release notes skill mindig egy strukturált change summaryból dolgozik, ez logikus dependency lehet.
Viszont ha a hívási lánc dinamikus:
Skill A may call B or C
B may call D
D may call A
akkor már inkább runtime orchestration problémáról beszélünk.
Prefer orchestration over hidden nesting¶
Gyenge:
User
↓
Skill A
↓ hidden call
Skill B
↓ hidden call
Skill C
A caller nem látja:
- mi futott le,
- hol hibázott,
- mennyi token/tool cost volt,
- milyen permission kellett,
- hogyan lehet retry-zni.
Jobb:
Orchestrator
├── Skill A
├── Skill B
└── Skill C
ahol az execution path explicit.
A composition legyen megfigyelhető és kontrollálható, ne rejtett prompt-internal mechanizmus.
Sequential composition¶
A legegyszerűbb pattern:
Skill A output
↓
validation / mapping
↓
Skill B input
↓
Skill B output
Példa:
PR Review Skill
↓
structured findings
↓
Fix Planning Skill
A typed contract itt különösen fontos.
Gyenge lánc:
A: "There may be something wrong around retries..."
↓
B re-interprets free text
Jobb:
{
"finding_type": "NON_IDEMPOTENT_RETRY",
"severity": "HIGH",
"location": "RetryService.java:87",
"evidence": "charge() is retried without an idempotency key"
}
Parallel composition / fan-out¶
Egy task több független nézőpontból elemezhető:
PR diff
├── Security Review Skill
├── Architecture Review Skill
└── Test Coverage Review Skill
↓
Aggregator
Ez akkor jó, ha a részfeladatok valóban függetlenek.
Előnye:
- párhuzamosítható,
- külön evaluálható,
- specializált skill-eket kapunk.
Hátránya:
- költség nő,
- conflict reconciliation kellhet,
- duplicate findingokat össze kell vonni.
Aggregator pattern¶
Az aggregator feladata:
multiple structured results
↓
merge / deduplicate / prioritize
↓
final result
Nem feltétlenül kell LLM-nek lennie.
Például severity alapján determinisztikusan rendezhetünk és azonos location+rule alapján deduplikálhatunk.
A semantic konfliktusokat viszont model vagy human review oldhatja fel.
Shared primitive vs shared skill¶
Nem minden újrahasznosítható elem skill.
Például:
read_repository_file
egy tool/capability primitive.
summarize_code_change
lehet skill.
normalize_severity_enum
valószínűleg deterministic helper function.
Hasznos kérdés:
Kell ehhez semantic reasoning, vagy egyszerű software primitive?
Ne csináljunk agent skillt minden reusable functionből.
Dependency inversion skill compositionnél¶
Egy skill ne feltétlen konkrét másik skill nevéhez kötődjön.
Gyenge:
ReleaseNotesSkill requires ChangeSummarySkillV3
Jobb:
ReleaseNotesSkill requires capability:
change_summary_provider
A runtime mapelheti:
change_summary_provider
↓
ChangeSummarySkill v3
vagy tesztben:
change_summary_provider
↓
Fixture implementation
Ez ugyanaz a dependency inversion, mint klasszikus architektúrában.
State ownership compositionnél¶
Több skill esetén felmerül:
Ki birtokolja a közös state-et?
Általában jobb:
Orchestrator / Runtime owns workflow state
Skill receives explicit input
Skill returns explicit output
mint:
Skill A silently writes shared memory
Skill B silently reads it
Az explicit state flow könnyebben debugolható.
WorkflowState
↓ ↑
Skill A result A
↓
WorkflowState updated
↓
Skill B
Error propagation¶
Ha Skill A hibázik, Skill B ne feltétlenül induljon el.
Például:
Fetch Current Deployment Skill
↓ TOOL_UNAVAILABLE
Risk Analysis Skill
A risk analysis current deployment adat nélkül lehet invalid.
A workflow policy dönthet:
TOOL_UNAVAILABLE → stop
PARTIAL_RESULT → continue with warning
INSUFFICIENT_CONTEXT → request more input
Ezt ne a nested skill lánc implicit módon döntse el.
Failure isolation¶
Párhuzamos compositionnél:
Security Review → SUCCESS
Architecture Review → SUCCESS
Test Review → TOOL_TIMEOUT
Lehetséges outcome:
PARTIAL_RESULT
és a final report jelezze:
Test coverage could not be evaluated because CI data was unavailable.
Ez jobb, mint mindent eldobni, ha egy opcionális branch hibázik.
Workflow vs Agent Loop¶
Ha a sorrend előre ismert:
A → B → C → D
akkor workflow a természetesebb.
Ha a következő capability az előző observation alapján dől el:
observe
↓
decide next skill
↓
execute
↓
observe
akkor agentic loop felé megyünk.
Példa workflow:
extract invoice data
→ validate
→ store
Példa agentic:
investigate production incident
→ choose which signal to query next based on observations
Ne használjunk agent loopot ott, ahol egy egyszerű workflow elég.
Example: PR resolution pipeline¶
Pull Request
↓
PR Review Skill
↓
findings[]
↓
Fix Planning Skill
↓
change_plan[]
↓
Implementation Skill
↓
patch
↓
Test Runner tool
↓
Test Failure Analysis Skill if needed
↓
Verification
Itt több külön boundary van:
- review semantic task,
- fix planning semantic task,
- implementation semantic task,
- test running deterministic/tool task,
- failure analysis semantic task.
Nem érdemes mindezt egy:
CodingSkill.doEverything()
capabilitybe összenyomni.
Composition depth¶
Túl mély nesting problémás:
A → B → C → D → E → F
mert nő:
- latency,
- cost,
- failure probability,
- observability igény,
- context drift.
Érdemes explicit execution budgetet használni és rendszeresen felülvizsgálni, hogy a chain tényleg szükséges-e.
Circular dependencies¶
Kerülendő:
Architecture Review Skill
↓
Refactoring Skill
↓
Architecture Review Skill
ha nincs explicit loop controller.
A circular capability graph könnyen végtelen executionhöz vezet.
Ha ismétlés szükséges, az legyen agentic loop vagy workflow retry policy, explicit stop conditionnel.
Skill library modularity¶
Egy jó skill library hasonlít egy jó modular codebase-re:
clear responsibilities
explicit interfaces
small dependency graph
few shared primitives
no hidden globals
A cél nem a maximális skill-szám.
A cél a hasznos modularitás.
Anti-pattern: mega-skill¶
SoftwareEngineeringSkill
├── requirements
├── architecture
├── implementation
├── review
├── test
├── deploy
└── incident response
Ez:
- nehéz route-olni,
- túl sok toolt kér,
- nehezen evaluálható,
- security permissionje túl széles,
- promptja gyorsan gigantikus lesz.
Anti-pattern: skill-as-function-call fetish¶
Nem kell minden 20 soros deterministic helperből skill.
Ha a feladat:
calculate retry delay
és a formula ismert, írjunk kódot.
Anti-pattern: hidden shared memory¶
Skill A writes "current_plan" to memory
Skill B assumes it exists
Ez temporal coupling.
Jobb explicit input/output contract.
Anti-pattern: workflow logika skill promptban¶
Gyenge:
"First call skill A, then B, unless C, then retry D..."
egy óriási system promptban.
A deterministic control flow legyen orchestration code-ban, ahol lehet.
Takeaways¶
- A skill composition célja a fókuszált capabilityk újrahasznosítása, nem új mega-skillek gyártása.
- Sequential és parallel composition is hasznos pattern.
- Az execution orchestration legyen explicit és megfigyelhető.
- Typed contractok csökkentik a skill-to-skill semantic driftet.
- Shared primitive nem feltétlen skill; használjunk normál kódot és toolokat is.
- Preferáljuk a capability dependencyt konkrét implementation dependency helyett.
- A közös state-et tipikusan runtime/workflow birtokolja, nem rejtett skill memory.
- Failure policy az orchestrator felelőssége legyen, ne implicit nesting.
- Előre ismert lépésekhez workflow; dinamikus next-action döntéshez agentic loop.
- Circular dependency helyett explicit loop + stop condition.