Галоўная / Артыкулы / Практычныя прытамулкі: Стварэнне кваліфікацыйных агентаў

Практычныя прытамулкі: Стварэнне кваліфікацыйных агентаў

Практычныя прыказкі: стварэнне кваліфікованых агентаў – контракты, перакрыцчы і слоты для коду для команд, якія выкарыстоўваюць гэты патэрн.

2943 слоў

Існавайце гэта як перапрацоўаны варыянт ідэй з кнігі «Створэнне кваліфікаваных агентаў» для працовнікаў: чыстыя этапы, арганізаваныя блакіткі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы. Этап Апглэву лепш працюе, калі яго спрыяваць як мерыемую плошчу. Запісайце адна ідеальная транскрыпцыю, адзін прыклад неудачы і прыметку з вярнення да пачатковага стану прычым расшырэнню масштаба. Запісвайце часы выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакою, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

Што такое навык, на самай працоўні?

Для стадіі «Што такое навык» неабяжна прадзефініраваць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба залічыць праз вантаж коду прыкладнення. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь ланцуг задач. Прызначыць людскія апраўленні для рэлей, якія витрачаюць грошы або зменяюць даны у працоўнай сіткі. Падключэння ў час компіляцыі не адпавядае пачатковай цэлесообразнасі бізнес-процэсаў.

Аналагія

У стадії аналагіі неабяцкова паказаць вхідныя даны, адміністратара крока і крэтыяры завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяцкова задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкія пераказы і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Неабяцкова застаўляць людзкую затверджэнняе для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны праўай працы. Працэс складання коду не є адпаведнікам пачынковай готовасці продукту.

У коде

У стадії «У код» неабяжна праграмаванне задаць вхідныя даны, адміністратара крока і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына неудачы должна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцюг задач. Заставіць людзей апраўдваць тыя крокі, якія ведуць да витрачання грошаў або зміны дадзэнняў у працоўным сераверы. Компіляцыйныя налашчэння не є гарантыяй полнай адпаведнасці працоўнага процесу. У стадії «У код» неабяжна праграмаванне задаць вхідныя даны, адміністратара крока і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і кост токенаў або запытаў разам з функцыйнымі рэзультатамі. Відразувыя даны пра косты запобегаюць неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спяльныя сераверы.

skills/
└── weather-skill/
    ├── SKILL.md          # frontmatter + instructions
---
name: weather-skill
description: Get current weather for a location. Use when the user
  asks about weather, temperature, or conditions anywhere.
---

# Get weather skill

.... {other instructions here}

Давайце створым лёгкі прыстрой для крэплення

Калі працуеце над проектам «Давайце створым сцэну», спачатку запісайце угоду: неабяжлівыя даны, сигнал успеху і тое, што выканаецца у разы ўзельнага неяўнасці. Такі чарт дапамагае залічваць пазнейшыя змены ў кодзе. Зберагаюце настройкі праза код прыемліка. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць адбавіць аудыт без неабяжлівага чытання всей структуры. Запісуйце назву інструмента, хэш аргументаў, час адклікання і рэзультат кожнага вызову. Без такога следу дэбагаванне агента займае гадзіны.

from dotenv import find_dotenv, load_dotenv

from langchain.agents import create_agent
from langchain.tools import tool
from langchain_openai import ChatOpenAI

_ = load_dotenv(find_dotenv())

llm = ChatOpenAI(
    model="gpt-5.6-luna",
    use_responses_api=True,
    reasoning={"effort": "low"},  #The reasoning is medium by default so set this to l
)

@tool
def get_weather(location: str) -> str:
    """
    Get the weather for a given location
    """
    return f"The weather in {location} is sunny"

@tool
def get_exchange_rate(currency_from: str, currency_to: str) -> str:
    """
    Get the exchange rate between two currencies
    """
    return f"The exchange rate for {currency_from} to {currency_to} is 1.00"

Іспытанне навыкаў для керавання іспытам інструментаў

Калі працюеце над раздзелам «Іспытанне навыкаў для керавання», спачатку запішыце контракт: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список перакладоў заходзіць пазнейшыя змены коду ў правільным напрамку. Запісуйце адночасна шлях успеху і шлях вярнення. Перапрыбуткі, людзкіе контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

skills/
└── weather-skill/
    ├── SKILL.md
└── forex-skill/
    ├── SKILL.md
---
name: forex-skill
description: Get live exchange rates between two currencies. Use this whenever the user asks about currency conversion, exchange rates, how much something costs in another currency, or comparisons like "is the dollar strong right now" — even if they don't use the words "forex" or "exchange rate" explicitly (e.g. "how much is 500 SGD in yen", "should I exchange money now or wait"). Always use this instead of guessing from memory, since exchange rates move constantly and Claude's training data has no visibility into current rates.
---

# Forex Skill

Fetches the live exchange rate between two currencies and reports it back in a clear, practical format.

## Instructions

1. **Identify both currencies.** Convert casual references to standard 3-letter ISO codes before calling the tool (e.g. "dollars" → ask which dollar: USD, SGD, AUD, etc.; "yen" → JPY; "pounds" → GBP).
2. **Handle ambiguous currency names.** If the user says something like "dollars" or "pounds" without specifying which country, ask them to clarify before calling the tool — don't assume USD/GBP by default.
3. **Call the `get_exchange_rate` tool**, passing both currency codes:

   ```python
   get_exchange_rate(currency_from="<code>", currency_to="<code>")
   ```

4. **If the tool call fails or returns an error**, tell the user plainly that the rate lookup failed — don't fall back to guessing a rate from memory.
5. **Call once per currency pair.** For multi-currency questions (e.g. "compare SGD to USD, EUR, and JPY"), call the tool separately for each pair.
6. **Do the math for the user.** If they gave an amount ("convert 500 SGD to JPY"), multiply it out yourself using the returned rate — don't just hand back the raw rate and leave them to calculate it.

## Output format

...

## Examples

...

Эксперымент 1: Навыкі ў файлах

Калі вы працуеце над Эксперыментам 1 Skills у певным этапе, спачатку запісайце умовы виконання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцвачыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, прычына невыпання павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Зробіце перапактаванне пасля дорогіх крокаў. Система не павинна знову стягваць плата за той самы вызов LLM, калі аператар праказвае пазнейшы вузел. Калі вы працуеце над Эксперыментам 1 Skills у певным этапе, спачатку запісайце умовы виконання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцвачыць пазнейшыя змены ў кодзе. Запісвайце час виконання і кост токеноў або запытаў разам з функцыйнальнымі рэзултатамі. Відразувая візуабільнасць костаў запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя сераўы.

from deepagents.backends import FilesystemBackend
from deepagents.middleware import FilesystemMiddleware, SkillsMiddleware

backend = FilesystemBackend(root_dir="../", virtual_mode=True)

agent = create_agent(
    model=llm,
    tools=[get_weather, get_exchange_rate],
    middleware=[
        SkillsMiddleware(backend=backend, sources=["./skills/"]),
        FilesystemMiddleware(
            backend=backend,
            tools=["read_file"],   # read_file and nothing else
            system_prompt=None,
        ),
    ],
)

Спробуйце самі

Этап «Практыкуйце» работае наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна «золатая» транскрыпцыю, адин прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Хавайце конфігурацыю паза кодам прыемленае. Файлы сераўіснага сэрвісу, хранілішчы секретных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Хавайце стан графа простым і з адзінаковым типам дадзеных. Вярсткаваныя блокі дадзеных маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перерываў.

>>> agent.invoke({"messages": [HumanMessage("What is the weather in Singapore?")]})

Singapore is currently **sunny**. It's a good time for outdoor plans.

Эксперымент 2: Аддаленныя навыкі

Этап Remote skills у Эксперыменту 2 работае наяўней, калі яго спрыяваць як мерыемую структуру. Зафіксавайце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце адночасна і шлях успеху, і шлях вярнэння. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў ёсць частью продукту, а не пасляднім дапрацоўкам. Храніце стан графа ў простым і типаванам формате. Вкладныя структуры маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакшуюць продовжэнне роботы пасля перерываў.

from urllib.request import urlopen
from deepagents.backends import StateBackend
from deepagents.backends.utils import create_file_data

backend = StateBackend()

skill_url = "https://raw.githubusercontent.com/.../langgraph-docs/SKILL.md"
with urlopen(skill_url) as response:
    skill_content = response.read().decode('utf-8')

skills_files = {
    "/skills/langgraph-docs/SKILL.md": create_file_data(skill_content),
}

agent = create_agent(
    model= llm
    middleware=[
       SkillsMiddleware(
          backend=backend,
          sources=["./skills/"]
       ),
       FilesystemMiddleware(backend=backend)
    ]
)

result = agent.invoke(
    {
        "messages": [{"role": "user", "content": "What is langgraph?"}],

        # seeded into the in-state filesystem. needed for the first run
        "files": skills_files,
    },
)

Эксперымент 3: Без інструментаў

Этап адынства зьмеяў Экспэрыменту 3 працуюць наякша, калі іх спрыяваць як мерымая паверхню. Зберагачыце адны ідеальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэньем масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцуг задач. Адкрывайце зьмеяў з вузкімі схемамі і чысткімі пазначэньмі парадуктавых эфектаў. Хостам неабходна знать, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць ўпрацоўкі. Этап адынства зьмеяў Экспэрыменту 3 працуюць наякша, калі іх спрыяваць як мерымая паверхню. Зберагачыце адны ідеальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэньем масштаба. Запісвайце часы выканання і косты токенаў або запытак праза функцыйнае рэзультат. Відкрытыя даныя пра косты зьмагаюцца з неспакойнымі рахункамі, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўры.

---
name: weather-skill
description: Get current weather for a location. Use when the user asks
  about weather, temperature, or conditions anywhere.
---

# Get weather skill

To get the weather of a location, run:

```bash
python skills/weather-skill/scripts/get_weather.py "<location>"
```

Returns JSON with weather condition. Parse and present naturally.

Run this script on each location the user asked for, one at a time.
#skills/weather-skill/get_weather.py
def main():
    location = sys.argv[1] if len(sys.argv) > 1 else None
    if not location:
        print(json.dumps({"error": "location argument required"}))
        sys.exit(1)
    print(json.dumps({"location": location, "weather": "sunny"}))

if __name__ == “__main__”:
    main()
from deepagents.backend import LocalShellBackend

backend = LocalShellBackend(
    root_dir=str(Path.cwd()),
    virtual_mode=False,
    inherit_env=True,
)

middleware = [
    FilesystemMiddleware(
        backend=backend,
        tools=["read_file", "ls", "glob", "execute"],
        system_prompt=None,
    ),
    SkillsMiddleware(backend=backend, sources=["./skills/"]),
]

agent = create_agent(model=llm, middleware=middleware)   # no tools=

Чакайце. Чы гэта справды запрацавало?

Для етапа «Чакайце, чы запрацавало?» неабяжна прадзеўліваць данныя вхіду, выконавца крока і критэрыя завершэння пры змены коду. Аператары должны магчымае перзапускіць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба залічыць праза код аплікацыі. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядзець, не чытаючы весь граф. Для рэшэнняе, якія выконваюць выдаткі або зменяюць данныя у працоўным режыме, неабяжна налагчыць людзкую апраўду. Падключэння ў час компілявання не абавязкова значыць повнайшую падтрымку бізнес-процэсаў.

Today's weather:
**Sydney:** Sunny
- **Melbourne:** Sunny

Рашэнне — логаванне, але не у stdout.

Для выправлення проблемы на стадії логавання неабяцкова ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння перш чым зменіць код. Аператары должны магчымае запускіць крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Неабяцкова задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Неабяцкова застосавіць людзкую затверджэнняе для тых крокоў, якія витрачаюць грошы або зменяюць даны ў працэсе виробніцтва. Працэс складання коду не є гарантіяй полнайасобнасці продукту.

from pathlib import Path
import logging

LOG = Path(__file__).resolve().parent.parent / "skill.log"
logging.basicConfig(
    filename=LOG, level=logging.INFO,
    format="%(asctime)s [pid=%(process)d] %(message)s",
)
logging.info("invoked argv=%r cwd=%s", sys.argv, os.getcwd())
22:29:55,316 [pid=45724] invoked argv=[...get_weather.py, 'Sydney']    cwd=.../notebooks
22:29:55,316 [pid=45724] resolved location=Sydney
22:29:56,795 [pid=45725] invoked argv=[...get_weather.py, 'Melbourne'] cwd=.../notebooks
22:29:56,795 [pid=45725] resolved location=Melbourne

Баг, які поясніў весь дизайн

Для этапа, дзе выявляюцца багі, неабходна прадзефініцыя вхідных дадзеных, адміністратара крока і крэтэрыяў завершэння пры змены коду. Аперацыйныя працавнікі должны магчымае перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест аб’емных скрыптаў. Калі крок не выйшоў, прычына неудачы павінна вказываць на адной-едзінай адпавядальнасці, а не на заплутаны процес. Заставляйце людзей апраўдваць рашэнняя ў тых випадках, калі грошы выдаваюцца або зменяюцься даныя для працы. Компіляцыйные налашчэння не ўзроўнаўцяюцься з пачатковай цэласнасцю бізнес-процэсаў. Для этапа, дзе выявляюцца багі, неабходна прадзефініцыя вхідных дадзеных, адміністратара крока і крэтэрыяў завершэння пры змены коду. Аперацыйныя працавнікі должны магчымае перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і вартасць токенаў аб запытоў разам з функцыйнальнымі рэзультатамі. Відразлівасць вартасцей з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спяльнаныя сераўеры.

.

Што такое virtual_mode?

Калі працуеце над этапам «Што такое virtualmode», спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць пад частыя неудачы. Такі список дапамагае заліцваліваць будучыя змены ў кодзе. Храніце настройкі парадульна ад коду прыемліка. Файлы сераўнавання, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць пераглядаць іх без неабяжлівага чытання всей структуры. Стварайце контрольныя пункты пасля дорогіх крокаў. Функцыя вярнення до роботы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага элемента.

Актычны аргумент для всіяго дизайна

Калі працуеце над «The accidental argument for stage», спачатку запісайте умовы працы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцварыць пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Стварайце контрольныя пункты пасля дорогіх крокаў. Програма не должна занова ставіць плату за той самы вызыв LLM, калі аператар перапрыбуе пазнейшы вузел.

То кальвен жа вам трэба стварыць?

Калі працуеце над тым, калькі элемента трэба выконваць першым, спачатку запісайте «контракт»: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад частковым нявыпаннем. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Валічыце маленькія, тэставаныя елементы працы над велікімі скрыптамі. Калі якісь крок не выйшоў, прычына нявыпанню должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Зробіце перапактаванне пасля дорогіх крокаў. Система не должна зноў вырачываць кост той самай вызову LLM, калі аператар праканае выконанне наступнага элемента. Калі працуеце над тым, калькі элемента трэба выконваць першым, спачатку запісайте «контракт»: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад частковым нявыпаннем. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Запісвайце час выконання і кост токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразувая візуабілізацыя костоў запобегае неспакойным рачынкам, калі процес пераходзіць з дэмовай среды ў спакульнаныя сераўы.

Але чы рэальна трэба якіясь навыки?

Але чы роботы працуюць найкраща, калі іх спрыяваць як мерыемую паверхню. Запісаце адна «золатая» версія, адзін прыклад неудачы і запіс пра вярненне да поперадньяго стану перш чым расширваце масштаб. Зберагаюце настройкі пазыроўна ад коду прыемліка. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Зберагаюце стан графа ў простам і типаваным формате. Вярнутыя блокі дадзеных маскуюць інфармацыю пра тое, калькі вузел запісаў калькі поле, і спакоююць продаж чыненняў пасля перарываў.

Заключныя думкі

Этап «Заключныя меркіі» працюе найэфектывней, калі яго спрыяваць як меравальную плошчу. Запісайце адны ідеальны прыклад роботы, адну справу з бягам і прыметку па вярнэнню да пачатковага стану, прычым расшырюючы сферу дзеяння. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дорабатка. Рэзультаты графаў трэба зберагаць у простым і типаваным формате. Вярнутыя структуры дакументаў маскуюць інфармацыю пра тое, канференцыйны вузел запісаў канкрэтны поле, і спакшваюць продовжэнне выканання пасля перарываў.

Чэк-ліст для эксплуатацыі

Калі працуеце над чэк-лістам для эксплуатацыі, спачатку запісайце умовы кантракту: неабходныя данні, сігнал успеху і тое, што выканаецца у разе частковага бягу. Такі чэк-ліст дапамагае заставіць пасляўсіяныя змены коду быць чыстымі і прозрачнымі.

Спрыявайце этапу як кантракту межаў уваходных дадзеных і перакананых выходных рэзультатаў. Дайце назвы дакументам, задаць критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння задачы.

Пауза пасля дорогіх крокаў. Функцыя адновлення не должна занова нарахоўваць плата за той самы вызыв LLM, калі аператар праказвае спробу на пазнейшым вузле.

Забезпечыце фіксацію версій залежнасцяў і запісаце хеш-значэнне зображэння, якое викорыстоўвалася для дэманстраціі. Возможнасць перадарабаткі прынесе больш пользы, чым традыцыйныя методы.

Запісвайце час виконання аперацый, а таксу на токены чы запиты разам з функцыйнальнымі рэзультатамі. Відразувыя данні пра вартасць запобегаюць неспакоўным нарахоўкам, калі процес пераходзіць з дэманстрацыі ў спадзеленыя сераўеры.

Пауза пасля дорогіх крокаў. Функцыя адновлення не должна занова нарахоўваць плата за той самы вызыв LLM, калі аператар праказвае спробу на пазнейшым вузле.

Перад пераходам да наступнага етапу заблокіруйце версіі, зафіксуйце критычны варіант транскрыпціі для ключовага шляху і паказваце крокі для вярнення да пачатковага стану. У спадзеленых сераўерах неабходны ліміты на колькасць запытоў, пераказкі прав на выкарыстоўвання ресурсаў і чысткі распадзел канфідэнцыйных данных. Валіце надзейнасць, чым крэатывныя, але разовыя дэманстраціі.

Запіска параграфу 835597b38be4: не трэба кантрацеўваць ключы прадастоўніка ў репазітарыі, задаць максімальную кантэйнернасць токена на адну сесію, а таксама зберагчы транскрыпціі праза фіксатуры адлічэння, каб пазнейшыя замены моделей заставаліся пораўнанневымі.

Калі працуеце над 0-й стадзіяю запіскі пра зміцнэнне, спачатку запісайце контракт: неабходныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі чэк-ліст дапамагае заставаць пазнейшыя змены коду чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, прычына невыпання павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцюг задач.

Дзеянне пра зміцнэнне 0/781: вымерыце час выканання, класію памылак і витрату токенаў для гэтай запіскі, а пасля вырашыце, чы робіць змену на адной фіксованай сэтке пытанняў, а не на адной лячбе.

Этап 1 прыцеленняя ў зміцнэнне работае наўперады, калі яго спрыявае можна вымерыць паверхня. Запісаўце адна «золатая» транскрыпцыя, адин прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Запісвайце часы выканання і кост токенаў або запытаў праза функцыйнае рэзультат. Відразлівае паказанне костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўы.

Дзеянне прыцеленняя ў зміцнэнне 1/781: вымерыце час выканання, класію памылак і кост токенаў для гэтага запісу, а потым вырашыце, чы хацяце застаўіць змяну, спыраючыся на фіксаваны набор пытанняў, а не на індывідуальныя спостарожэння.