Kihagyás

Skill Anatomy and Contracts

Miért kell contract egy skill köré?

Egy skill akkor lesz jól újrahasznosítható, ha nem csak azt tudjuk róla, hogy „van egy jó promptja”, hanem azt is, hogy:

  • mire való,
  • milyen inputot vár,
  • milyen outputot ad,
  • milyen toolokra vagy adatokra támaszkodik,
  • milyen korlátai vannak,
  • mi számít sikernek vagy hibának.

Ez nagyon hasonló ahhoz, ahogy egy normális software componentet vagy API-t tervezünk.

caller
  ↓
Skill Contract
  ↓
implementation
  ↓
model / tools / retrieval / code

A caller lehet agent, workflow vagy közvetlen application service.

Egy skill fő részei

Hasznos mental model:

Skill
├── identity / metadata
├── purpose / responsibility
├── input contract
├── instructions
├── knowledge / context policy
├── tool dependencies
├── output contract
├── constraints / permissions
├── success / failure semantics
└── evaluation criteria

Nem minden platform fogja ezt pontosan ilyen struktúrában reprezentálni, de tervezéskor érdemes ezeket külön kérdésként kezelni.

1. Identity és metadata

Minimum legyen világos:

name
version
description

Például:

name: review_pull_request
version: 1.2
description: Identify material correctness, architecture and regression risks in a pull request.

A description nem csak dokumentáció lehet. Később skill discovery/routing során a runtime akár ebből is döntheti el, melyik skill releváns.

Ezért rossz description:

Helps with GitHub things.

Jobb:

Reviews a pull request for correctness, architecture risks, regressions and missing tests. Read-only.

2. Purpose és responsibility

A skillnek legyen egy világos feladata.

Például:

Given a pull request and repository context, identify material risks and return structured review findings.

Ez meghatározza a boundaryt.

A skill nem:

  • merge-eli a PR-t,
  • nem javítja automatikusan a kódot,
  • nem deployol,
  • nem ír release note-ot.

Ezek lehetnek más skill-ek vagy workflow-lépések.

A responsibility leírása azért fontos, mert az LLM természetes hajlama lehet „segítőkészen” továbbmenni a feladatnál.

3. Input contract

A callernek tudnia kell, milyen adatot kell átadni.

Például logikai schema:

{
  "repository": "org/payment-service",
  "pull_request_number": 184,
  "review_focus": ["correctness", "architecture", "tests"]
}

Az input contract megmondhatja:

  • required mezők,
  • optional mezők,
  • típusok,
  • enumok,
  • limitációk,
  • defaultok.

Például:

pull_request_number: positive integer
review_focus: subset of allowed review dimensions
repository: validated repository identifier

Az input contract nem csak az LLM miatt hasznos. A runtime már modellhívás előtt kiszűrhet hibás kéréseket.

invalid input
    ↓
application validation
    ↓
reject

nem pedig:

invalid input
    ↓
LLM tries to guess what user meant

4. Instructions

Az instructions definiálja a skill semantic behaviorét.

Például:

Review only material issues.
Prioritize correctness over style.
For every finding, cite concrete evidence from the diff or retrieved file.
Do not invent repository state that was not supplied or retrieved.

Ez különbözik az inputtól.

instructions = hogyan dolgozz
input        = min dolgozz

A stabil instructions verziózott skill-rész lehet.

A task-specific kérés viszont runtime input:

Focus especially on backwards compatibility in the REST API.

5. Knowledge és context policy

A skill contract nem feltétlenül magát a teljes tudást tartalmazza. Inkább megmondhatja, milyen tudás kell és honnan jöhet.

Például:

Static knowledge:
- internal review principles
- severity definitions

Runtime context:
- current PR diff
- relevant source files
- tests
- repository-specific AGENTS.md

Ez fontos különbség:

A skill contract mondhatja meg, milyen contextre van szükség; a runtime felelőssége lehet annak beszerzése.

Például:

Skill requires: current PR diff
        ↓
Runtime resolves dependency
        ↓
GitHub connector / API

6. Tool dependencies

A skillnek jeleznie kellhet, milyen capabilitykre támaszkodik.

Például:

required capabilities:
- read_pull_request_diff
- read_repository_file

optional capabilities:
- read_test_results

Érdemes task-level dependencyban gondolkodni, nem feltétlen konkrét providerben.

Gyengébb coupling:

requires GitHubToolV3.fetch_file()

Jobb absztrakció:

requires repository_file_reader

A runtime dönti el, hogy ezt GitHub connector, local checkout vagy más backend valósítja meg.

Ez software architecture szempontból lényegében port/adaptor gondolkodás.

7. Output contract

Ha a skill eredményét alkalmazás fogyasztja, ne csak szabad szövegre támaszkodjunk.

Például:

{
  "findings": [
    {
      "severity": "HIGH",
      "location": "src/payment/RetryService.java:87",
      "summary": "Retry can duplicate a non-idempotent payment request",
      "evidence": "The retry path calls charge() without an idempotency key."
    }
  ],
  "overall_risk": "HIGH",
  "summary": "The PR introduces a duplicate-payment risk."
}

Ezután az app tud:

result.findings
result.overall_risk

alapon dolgozni.

Ahogy a Foundationsnél:

A schema a struktúrát tudja garantálni, nem a semantic truthot.

Az output attól még lehet rossz következtetés, hogy valid JSON.

8. Constraints és permissions

A skill contract mondja meg a megengedett viselkedést.

Példa:

mode: read-only
allowed repositories: current repository only
allowed tools:
  - diff reader
  - file reader
forbidden actions:
  - modify code
  - merge PR
  - post comment

Viszont a fontos architekturális szabály:

A permissiont ne csak prompt/instruction enforce-olja.

A runtime ténylegesen csak az engedélyezett toolokat adja át, vagy tool execution előtt authorizationt végez.

Skill contract says read-only
          +
Runtime exposes only read tools

A kettő együtt erősebb, mint pusztán:

"Please do not modify anything."

9. Success és failure semantics

Egy reusable capabilitynél definiálni kell, milyen outcome-ok léteznek.

Nem csak:

success / exception

hanem például:

SUCCESS
INSUFFICIENT_CONTEXT
TOOL_UNAVAILABLE
NOT_AUTHORIZED
INVALID_INPUT
PARTIAL_RESULT

Például egy deployment health skillnél:

{
  "status": "INSUFFICIENT_CONTEXT",
  "missing": ["production deployment state"]
}

jobb, mint amikor a modell megpróbálja kitölteni a hiányzó adatot találgatással.

A failure semantics tudatosítása közvetlenül csökkentheti a hallucination pressure-t.

10. Evaluation criteria

Ha a skill külön artifact, külön is kell tudnunk értékelni.

Például PR review skill:

- megtalálja-e a valódi critical bugokat?
- mennyi false positive-ot ad?
- evidence-grounded-e minden finding?
- helyesen használja-e a toolokat?
- tartja-e a read-only boundaryt?
- mennyi a latency és cost?

Ez később külön fejezet lesz, de már a contract tervezésekor érdemes tudni, mi számít jónak.

Contract vs implementation

Ez az egyik legfontosabb különválasztás.

Skill Contract
├── purpose
├── inputs
├── outputs
├── constraints
└── required capabilities

Implementation A
├── model X
├── prompt v4
└── GitHub tools

Implementation B
├── model Y
├── prompt v9
└── local repository tools

A caller szempontjából mindkettő ugyanazt a capabilityt valósíthatja meg.

Ez loose couplinget ad.

Skill contract vs application configuration

Nem mindent kell a skillbe tenni.

Tipikusan skill contract

  • capability neve és célja,
  • semantic instructions,
  • required input,
  • output schema,
  • required tool capability,
  • permission expectation,
  • success/failure semantics.

Tipikusan runtime/application configuration

  • konkrét model provider,
  • API endpoint,
  • secret,
  • production timeout,
  • tenant-specific authorization,
  • konkrét GitHub token,
  • rate limit,
  • feature flag,
  • deployment environment.

Például ne legyen a skillben:

GitHub token = ghp_...

vagy:

Production DB hostname = ...

A skill leírhatja:

requires repository_read capability

A runtime injektálja a valódi credentialt és adaptort.

Példa: Incident Triage Skill

Egy konceptuális contract:

name: incident_triage
version: 2
purpose: Classify an incident and identify the most relevant next diagnostic action.

input:
  incident_text: string
  service: string
  environment: enum[dev, staging, production]

required_capabilities:
  - observability_query

output:
  severity: enum[SEV1, SEV2, SEV3, SEV4]
  suspected_area: string
  evidence: list[string]
  next_action: string
  confidence: number

constraints:
  read_only: true
  do_not_restart_services: true

A runtime adhat neki:

Datadog adapter

majd később:

Grafana adapter

anélkül, hogy a triage capability jelentése megváltozna.

Contract evolution

Ha egy output contractot megváltoztatunk:

v1:
severity
summary

v2:
severity
summary
evidence[]
recommended_action

az caller oldalon breaking change is lehet.

Ezért a skill contractokat érdemes ugyanúgy kezelni, mint más API contractokat:

  • verziózás,
  • compatibility,
  • migration,
  • regression testing.

Anti-pattern: promptból implicit contract

Gyenge:

"Review this and tell me if anything looks bad."

A caller nem tudja:

  • milyen szempontok szerint review-zik,
  • milyen inputot igényel,
  • milyen outputot kap,
  • milyen toolokat használhat,
  • mit jelent, ha nincs elég adat.

Ez POC-nál lehet elég. Reusable system capabilitynél nem.

Anti-pattern: domain model közvetlenül az LLM interface-e

Nem biztos, hogy jó ötlet az alkalmazás belső, komplex domain objectjét közvetlenül modell-outputként használni.

Például:

LLM JSON
  ↓
SkillResult DTO
  ↓
validation / mapping
  ↓
Domain object

általában tisztább, mint:

LLM
 ↓
directly constructs Payment domain aggregate

Az LLM-facing contract lehet egyszerűbb és provider-independent, az application mapping pedig determinisztikus.

Takeaways

  • Egy reusable skillnek érdemes explicit contracttal rendelkeznie.
  • A contract fő részei: purpose, input, instructions, context policy, tools, output, constraints, failure semantics és evaluation.
  • Skill interface ≠ skill implementation.
  • A concrete model, credential, provider és runtime timeout általában application configuration, nem skill knowledge.
  • Tool dependencyt érdemes capabilityként megfogalmazni, nem túl korán konkrét providerhez kötni.
  • A structured output formális contractot ad, de semantic correctnesset továbbra is evaluálni kell.
  • A failure outcome legyen explicit; a „nincs elég adat” legitim eredmény.
  • A skill contract ugyanúgy verziózandó és karbantartandó lehet, mint egy API contract.