Практычныя прытамулі: Развіцце на адказах тэстаў: падход інжынеріі прыродакоў да
Практычныя прыказкі: Развіцце на адмітарных крэтынгах: падход інжынеріі прымэтных програм да стварання кантрактаў, пераконтрацый і месца для дадзення коду для команд, якія выкарыстоўваюць гэты патэрн.
У гэтым карыце парадоксальная дорага ад сыр'ёчных матэрыялаў да рабочай системы для: Eval-Driven Development: A Software Engineering Approach to Production-Grade AI Agents. Акцэнт ставіцца на практычныя крокі, чыстае перакананне і код, які можна проста дадзіць у репазітарый без неабяснення меты. У стадзіі агульнага відгледу неабходна практычна апісацыя вхідных дадзеных, адпаведальнага за крок і крэатарыяў завершэння працы перш чым змяніць код. Аператары должны магчымае перадзеісцаваць крок з вядомага пункта контролю без неабяснення схованага стану. Запісваюцца часы выконання і косты токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне костаў запобегае неспадзяваным расчыткам, калі дорага пераходзіць з дэмаверсіі ў спяльныя среды.
Падсумак
Калі працюеце на стадыі падсумавлення, спачатку запішыце умовы контракту: неабяжлівыя даны, сигнал успеху і тое, што выходзіць пад частыя неудачы. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагаеце настройкі праза код прыемліка. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць аудыт без неабяжлівага чытання всей структуры. Ствараеце контрольныя пункты пасля дорогіх крокаў. Система вярнення праблемы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага вузла.
Введэнне
Калі працуеце над стадзіяй введэння, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўкі дапамагае заліцвачваць змяны ў кодзе пазнейша.
Процес выработкі: загальны прыем
Калі працуеце над этапам «The Production Pipeline», спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неудачы. Такі список пераканальвае ў тым, каб пазнейшыя змены коду былі чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну адпаведальнасць, а не на заплутаны процес. Зробіце пераканальванне пасля дорогіх крокаў. Програма не должна зноў ставіць плату за той самы вызов LLM, калі аператар праканае пазнейшы вузел.
1. Контракт: Ад’юнкцыя і версіяванне запрошэння
Калі працюеце над стадзіяй 1 «Раз’ядраўчы контракт», спачатку запісайце контракт: неабходныя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконтроўваець дапамагае залічыцца з пазнейшымі змянамі ў кодзе. Спрэцьвачайце гэтую стадзію як контракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце правіла пераканання успеху і не падтрымайце тыхі частковыя завершэння. Зберагаце ў кешы стабільныя інструкцыі системы і схемы інструментаў. Перадзесланне ідэнтычных прамаўляючых частак є распашчытным выклікам.
[
{
"agent_id": "financial_market_headlines",
"version": 1,
"agent_model": "openai:gpt-4",
"prompt": "What are today's major financial market headlines?",
"eval": {
"contains": ["market"],
"max_model_requests": 3,
"min_tool_calls": 1,
"max_tool_calls": 5,
"judge_rubric": "The answer should be a useful response to the user's financial markets question. It should summarize market-relevant information, avoid obviously unrelated content, avoid investment advice, and avoid claiming certainty beyond what the retrieved information supports."
}
}
]
2. Час выканання: двухэтапны механізм
Калі працуеце над стадзіяй «2. Час выканання», спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал працэздольга і тое, што выканаецца у разе частковага нявыполнення. Такі список дапамагае заліцвачыць змяны ў кодзе па правдзе. Запісвайце час выканання і кост токена або запыту празаўсёды разам з рэзультатамі функцыйнасці. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі працэ пераходзіць з дэмаверсіі ў спяльныя среды. Зробіце перапаконтаванне пасля дорогіх крокаў. Система вярнення працы не должна зноў нарахоўваць косты той самай вызову LLM, калі аператар праканае пазнейшы вузел.
3. Слой стварэння візуабельнасці: без слепых зон
Калі працуеце над 3-й стадзіяю «Слой абсарбейабельнасці», спачатку запісайце умовы працы: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контролю дапамагае заліцвачыць змяны ў кодзе пазнейша. Зберагайце настройкі за межамі коду прыемліка. Файлы сераўнавання, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Ставьце контрольныя пункты пасля дорогіх крокаў. Система вярнення роботы не должна занова ставіць плата за той самы вызыв LLM, калі аператар перапрыяўляе роботу да наступнага элемента.
4. Слой ацэнкі: CI/CD для AI
Калі працуеце над 4-м стадзіям «Шар адзынакоўкі», спачатку запісайце угоду: неабходныя даны, сігнал успеху і тое, што выходзіць пад частым неудачам. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Зробіце контрольную пазнаку пасля дорогіх крокаў. Програма не должна зноў выклікаць той самы календар аб’екта, калі аператар перапрыбуе пазнейшы вузел.
Адзынакоўкі: прымусовая дэтэрмінізацыя ў недэтэрміністычный системе
Калі працуеце над Evals Forcing Determinism на стэдзі, спачатку запісайце умовы: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чарткі спамагаюць залічваць пазнейшыя змены ў кодзе чыста. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, нявыпанне павінна вказваць на адну адпаведальнасць, а не на заплутаны ланцюг задач. Зробіце перапактаванне пасля дорогіх крокаў. Система вярнення не павінна зноў выраховваць кост той самай вызову LLM, калі аператар прабуюць зноў запрацаваць пазнейшы вузел. Калі працуеце над Evals Forcing Determinism на стэдзі, спачатку запісайце умовы: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чарткі спамагаюць залічваць пазнейшыя змены ў кодзе чыста. Запісвайце час выканання і кост токенав або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы заранее запобегаюць неспакойным рахункам, калі праця пераходзіць з дэмавайнага режыма ў спакульнаныя сераўы.
Слой 1: Тэсты з жывага з дэтэрміністычным падходам
Этап Slayer 1 з жывага з дэтэрміністычным падходам працюе найкраща, калі яго розглядаць як вимерную паверхню. Зберагачыце адна ідеальная версія даных, адзин случай неудачы і прыметкі па поверненню да попярэдньяго стану пры расшырэнні масштаба. Храніце настройкі пазырочна ад коду прыемліка. Файлы сераўіснага сераўісу, базы секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць адбавіць аудыт без неабходнасці чытання всей структуры. Храніце стан структуры у простам і типаваным формате. Вярнутыя блокі данных маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перерываў.
uv run python tests/unittest_eval_agent.py
evaluators=[
*[Contains(value, case_sensitive=False) for value in case.eval.contains],
MaxModelRequests(case.eval.max_model_requests),
MinToolCalls(case.eval.min_tool_calls),
MaxToolCalls(case.eval.max_tool_calls),
]
(financial-agent2) alex@pop-os:/ssd/ai_works/financial_agent2$ uv run python tests/unittest_eval_agent.py
Running each eval case 3 time(s)
Evaluating task ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Evaluation Summary: task
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Case ID ┃ Metrics ┃ Assertions ┃ Duration ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ financial_market_headlines_v1 [1/3] │ tool_calls: 1 │ ✔✔✔✔ │ 18.8s │
│ │ requests: 2 │ │ │
│ │ input_tokens: 1,325 │ │ │
│ │ output_tokens: 278 │ │ │
│ │ cost: 0.0564 │ │ │
├─────────────────────────────────────┼───────────────────────┼────────────┼──────────┤
│ financial_market_headlines_v1 [2/3] │ tool_calls: 1 │ ✔✔✔✔ │ 8.8s │
│ │ requests: 2 │ │ │
│ │ input_tokens: 1,195 │ │ │
│ │ output_tokens: 82 │ │ │
│ │ cost: 0.0408 │ │ │
├─────────────────────────────────────┼───────────────────────┼────────────┼──────────┤
│ financial_market_headlines_v1 [3/3] │ tool_calls: 1 │ ✔✔✔✔ │ 13.5s │
│ │ requests: 2 │ │ │
│ │ input_tokens: 1,292 │ │ │
│ │ output_tokens: 388 │ │ │
│ │ cost: 0.0620 │ │ │
├─────────────────────────────────────┼───────────────────────┼────────────┼──────────┤
│ Averages │ requests: 2.00 │ 100.0% ✔ │ 13.7s │
│ │ output_tokens: 249.3 │ │ │
│ │ tool_calls: 1.00 │ │ │
│ │ cost: 0.0531 │ │ │
│ │ input_tokens: 1,270.7 │ │ │
└─────────────────────────────────────┴───────────────────────┴────────────┴──────────┘
Слой 2: Дэтэрміністычныя тэсты на регрэсію на аднойчынных даных
Этап регрэсіі з детерміністычным падходам на 2-му слое працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Дакументавайце як успішны, так і варыянт вярнэння да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не етапамі далейшай наладкі. Храніце стан графа у простам і типаваным формате. Вкладаныя структуры маскуюць інфармацію пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.
uv run python tests/regression_eval_traces.py
Trace: ff5a53e3392dc26cd0a2890782be70ec
Eval case: financial_market_headlines v1
Status: PASS
Model requests: 2
Tool calls: 1
contains('market'): PASS
MaxModelRequests: PASS
MaxToolCalls: PASS
2-й слой: Недетерміністычныя тэсты — LLM як суддзя
Этап Layer 3 Non Deterministic працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад работы, адну справу з бягамі та прыметкі па поверненню да пачатковага стану пры розширэнні масштаба. Валіце малыя, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына бягу должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Задаце ліміты на колькасць токенав за раунд і за сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты запобегаюць таму, што дэманстрацыі ператвараюцца на неспакоўныя рахункі. Этап Layer 3 Non Deterministic працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад работы, адну справу з бягамі та прыметкі па поверненню да пачатковага стану пры розширэнні масштаба. Запісвайце часы выконання та косць токенав або запытак пад функцыйнальнымі рэзултатамі. Відразувая візуабельнасць косцаў запобегае неспакоўным рахункам, калі процес пераходзіць з дэманстрацыі ў спяльныя сераўеры.
[
{
"agent_id": "financial_market_headlines",
"version": 1,
"agent_model": "openai:gpt-4",
"prompt": "What are today's major financial market headlines?",
"eval": {
"contains": ["market"],
"max_model_requests": 3,
"min_tool_calls": 1,
"max_tool_calls": 5,
"judge_rubric": "The answer should be a useful response to the user's financial markets question. It should summarize market-relevant information, avoid obviously unrelated content, avoid investment advice, and avoid claiming certainty beyond what the retrieved information supports."
}
}
]
LLMJudge(
rubric=case.eval_case.eval.judge_rubric,
model=args.judge_model,
include_input=True,
score={"evaluation_name": "judge_score", "include_reason": True},
assertion={"evaluation_name": "judge_pass", "include_reason": True},
)
uv run python tests/regression_llm_judge_traces.py --sample-percent 50
Trace selection: fetched=1 sampled=1 judging=1 lookback_minutes=1440 sample_percent=50 max_traces=5
Trace case: trace_id=3891f0b8432c9bbcb00e5e8adce1600b agent_id=financial_market_headlines prompt_version=1 answer_chars=207
Judging 1 trace(s) with openai:gpt-5.4
Evaluating task ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Evaluation Summary: task
┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Case ID ┃ Inputs ┃ Outputs ┃ Scores ┃ Assertions ┃ Duration ┃
┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ financial_market_he… │ {'trace_id': │ Today's major │ judge_score: 0.000 │ judge_pass: ✗ │ 469µs │
│ │ '3891f0b8432c9bbcb00 │ financial market │ Reason: The │ Reason: The │ │
│ │ e5e8adce1600b', │ headlines can be │ response does not │ response does not │ │
│ │ 'agent_id': │ found on major │ summarize any actual │ summarize any │ │
│ │ 'financial_market_he │ business and finance │ market headlines or │ actual market │ │
│ │ adlines', │ news outlets │ provide │ headlines or │ │
│ │ 'prompt_version': 1, │ including CNBC, │ market-relevant │ provide │ │
│ │ 'agent_model': │ Yahoo Finance, │ information; it only │ market-relevant │ │
│ │ 'openai:gpt-4', │ Reuters, and │ redirects the user │ information; it │ │
│ │ 'judge_model': │ Bloomberg. For more │ to news websites. It │ only redirects the │ │
│ │ 'openai:gpt-5.4', │ specific stories, │ avoids investment │ user to news │ │
│ │ 'prompt': "What are │ please visit their │ advice, but it is │ websites. It avoids │ │
│ │ today's major │ websites. │ not a useful answer │ investment advice, │ │
│ │ financial market │ │ to the user's │ but it is not a │ │
│ │ headlines?"} │ │ question. │ useful answer to │ │
│ │ │ │ │ the user's │ │
│ │ │ │ │ question. │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
├──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┼─────────────────────┼──────────┤
│ Averages │ │ │ judge_score: 0.000 │ 0.0% ✔ │ 469µs │
└──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴─────────────────────┴──────────┘
uv run python tests/regression_llm_judge_traces.py --sample-percent 10 --lookback-minutes 30
Trace selection: fetched=1 sampled=1 judging=1 lookback_minutes=30 sample_percent=10 max_traces=5
Trace case: trace_id=38fa3a54134d8818c7d7a5afbf50967e agent_id=financial_market_headlines prompt_version=1 answer_chars=654
Judging 1 trace(s) with openai:gpt-5.4
Evaluating task ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Evaluation Summary: task
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Case ID ┃ Inputs ┃ Outputs ┃ Scores ┃ Assertions ┃ Duration ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ financial_market_… │ {'trace_id': │ Here are today's │ judge_score: 0.450 │ judge_pass: ✗ │ 441µs │
│ │ '38fa3a54134d8818c │ major financial │ Reason: The │ Reason: The │ │
│ │ 7d7a5afbf50967e', │ market headlines: │ response is │ response is │ │
│ │ 'agent_id': │ │ market-related and │ market-related │ │
│ │ 'financial_market_ │ 1. Wall Street's │ avoids investment │ and avoids │ │
│ │ headlines', │ riskiest trades │ advice, but it │ investment │ │
│ │ 'prompt_version': │ are suddenly back │ mostly lists │ advice, but it │ │
│ │ 1, 'agent_model': │ on top: Chart of │ article headlines │ mostly lists │ │
│ │ 'openai:gpt-4', │ the Day - Yahoo │ and links rather │ article headlines │ │
│ │ 'judge_model': │ Finance │ than providing a │ and links rather │ │
│ │ 'openai:gpt-5.4', │ [Link](https://fi │ useful summary of │ than providing a │ │
│ │ 'prompt': "What │ nance.yahoo.com/) │ the key financial │ useful summary of │ │
│ │ are today's major │ 2. S&P 500 │ market │ the key financial │ │
│ │ financial market │ notches │ developments. │ market │ │
│ │ headlines?"} │ record-high close │ │ developments. │ │
│ │ │ as rate-hike │ │ │ │
│ │ │ worries ease - │ │ │ │
│ │ │ Reuters │ │ │ │
│ │ │ [Link](https://ww │ │ │ │
│ │ │ w.reuters.com/mar │ │ │ │
│ │ │ kets/us/) │ │ │ │
│ │ │ 3. Treasury │ │ │ │
│ │ │ yields rise as │ │ │ │
│ │ │ U.S. threatens │ │ │ │
│ │ │ Iran with more │ │ │ │
│ │ │ economic │ │ │ │
│ │ │ sanctions - CNBC │ │ │ │
│ │ │ [Link](https://ww │ │ │ │
│ │ │ w.cnbc.com/) │ │ │ │
│ │ │ 4. Latest stock │ │ │ │
│ │ │ market, financial │ │ │ │
│ │ │ and business news │ │ │ │
│ │ │ - MarketWatch │ │ │ │
│ │ │ [Link](https://ww │ │ │ │
│ │ │ w.marketwatch.com │ │ │ │
│ │ │ /) │ │ │ │
│ │ │ 5. Latest finance │ │ │ │
│ │ │ and stock market │ │ │ │
│ │ │ news covering the │ │ │ │
│ │ │ Dow, S&P 500, │ │ │ │
│ │ │ banking, │ │ │ │
│ │ │ investing and │ │ │ │
│ │ │ regulation - WSJ │ │ │ │
│ │ │ [Link](https://ww │ │ │ │
│ │ │ w.wsj.com/finance │ │ │ │
│ │ │ ) │ │ │ │
├────────────────────┼────────────────────┼───────────────────┼────────────────────┼───────────────────┼──────────┤
│ Averages │ │ │ judge_score: 0.450 │ 0.0% ✔ │ 441µs │
└────────────────────┴────────────────────┴───────────────────┴────────────────────┴───────────────────┴──────────┘mar
{
"id": "financial_market_headlines",
"version": 2,
"agent": "websearch",
"prompt": "Use the web-search tool to find and verify today's major financial-market headlines. Report the 3 to 5 most consequential developments across equities, rates, currencies, commodities, or macroeconomic policy. For each item, state what happened, identify the affected market or region, explain briefly why it matters, and name the source with a link when available. Include the relevant date and units for numerical claims. Cross-check any surprising index level, percentage move, policy decision, or economic release against a second reliable source; if it cannot be verified, omit it or clearly label it as unconfirmed. State when the information was current, distinguish facts from developing reports or interpretation, and say when reliable current information is insufficient. Do not invent facts, present stale information as today's news, or give personalized investment advice.",
"contains": ["market"],
"max_model_requests": 4,
"min_tool_calls": 1,
"max_tool_calls": 7,
"judge_rubric": "The response should provide 3 to 5 current, consequential financial-market developments based on web research. Each item should identify what happened, the affected market or region, why it matters, and its source, preferably with a link. Numerical claims should include meaningful dates and units; surprising figures should be corroborated by a second reliable source or explicitly marked unconfirmed. The answer should state when the information was current, distinguish verified facts from developing reports or interpretation, and acknowledge insufficient evidence rather than inventing details. It must stay relevant, avoid stale news presented as current, avoid unsupported certainty, and avoid personalized investment advice. A polished but uncited answer containing an implausible or unverifiable market figure should fail."
},
Ператворэнне шаблона ў CI/CD
Для ператворэння шаблона ў стадію неабходна прадзефінаваць вхідныя даны, адпаведальную особу за кожны крок і критэрыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць пазнаходзяцца за межамі коду прыкладнення. Файлы сераўнавання сяродовішча, храненні секрэтных данных і флагі функций должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Прызначыце людскія апраўдкі для рэшэнняў, якія выкалічваюць грошы або зменяюць даны у працэсе. Підключэння на час компілявання не є гарантыяй полнай адпаведнасці бізнес-процэсаў.
Справы
У стадії «Апавяранні» неабходна ўзначэнне вхідных дадзеных, адпавядаючага за крок і крэтарыў завершэння працы перад змянай коду. Аператары должны магчымае перадзеісцаваць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія пераказы і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Чэк-ліст для эксплуатацыі
Стадія чэк-ліста для эксплуатацыі працюе наякша, калі яе спрыяваць як мерыемую плошчу. Збірайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярненне да пачатковага стану перад расшырэнням масштаба.
Спрыяйце гэтай стадіі як даговору межа вхідных дадзеных і перакананых выходных рэзультатаў. Называйце артыфакты, узначайце крэтары успеху і адмовляйцеся ад мовчанкавага частковага завершэння.
Зберагаюце стан графа у простам і типаваным формате. Вярнутыя структуры маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спаказваюць працэс пасля перарываў.
Оценяйце адпаведзі на адну спробу і траекторыі з калькама спроб окрема. Агрэгаванне балав чату маскуюць адказы на проблемы з цікламі аперацый.
Напісце кароткі посібнік: як зменяць кантрольныя клучы, як спрачыслаць чергу, як відклікнуць пярэдніе змены.
Документавайце як правільны, так і патэнцыйны ход роботы. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не дадатковым удосконаленнем.
Перш чым падняць стэк, заморозьце версіі, зафіксуйце ідеальны транскрыпт для критычнага ходу і паказвайце крокі відклікнення. У спадзяльных средах неабходны ліміты частоты запытоў, перакананні ў правах на выкарыстоўванне ресурсоў і чысткі власнік для змены секрэтных клучоў. Валіце простую надзейнасць працы над крэатывнымі, але разовымі дэманстрацыямі.
Запіскі для пакета 4a86f3fd2d9a: не класты ключі прадаўцоў у репазітарыю, задаць максымальны тэрмін дзейнасці токена на кожную сесію, а таксама зберагчы транскрыпціі празаўсюды з фікстурамі для ацэнкі, каб пазнейшыя замены моделей заставаліся порównанымі.