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

Практычныя прытамулкі: Проектуванне цыклаў з агентамі

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

2945 слоў

Існавайце гэта як перапрацоўаны варыянт ідэй з кнігі “Loop Engineering with Agents” для аператараў: чыстыя этапы, арганізаваныя блакі коду і прыметкі па вяснаванню, якія застаюцца пасля перадачы задання. Этап “Апглэйв” найкраща працюе, калі яго розглядаць як мерыемую плошчу. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па адвярнуццю роботы пры расшырэнні масштаба. Дакументавайце як успешны, так і няуспешны шляхы роботы. Перапрыбуткі, людзкія контрольны пункты і обработка некоректных паведамленняў є частью продукту, а не чымсь, што дадаецца пазней.

Змест

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

1. Структура агентнага цыклу

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

2. Калі вжываць інжынерыю циклаў

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

3. Звычныя типы ціклаў

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

   +-----------+      +-----------+
-->| Generate  |----->|  Verify   |----- pass -----> [ done ]
   +-----------+      +-----+-----+
        ^                   |
        +------- fail ------+
   +-----------+      +-----------+
-->| Generate  |----->|  Score    |--- good enough --> [ done ]
   +-----------+      +-----+-----+
        ^                   |
        +-- improve --------+
            (use the score)
   +-----------+      +-----------+
-->|   Plan    |----->|  Execute  |-- all steps done --> [ done ]
   +-----------+      +-----+-----+
        ^                   |
        +-- replan ---------+
            (hit a surprise)
   +-----------+     +-----------+     +-----------+
-->|   Wait    |---->|   Check   |---->|    Act    |---+
   | (timer /  |     +-----------+     +-----------+   |
   |  trigger) |                                       |
   +-----------+ <-------------------------------------+
        (no fixed end — keeps watching over time)

4. Як стварыць цікл

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

                    +------------------+
  START ----------> |     Research     | <-------------+
                    | (draft / revise) |               |
                    +--------+---------+               |
                             |                         |
                             v                         | needs work
                    +------------------+               | (+ feedback)
                    |      Verify      |               |
                    |  (check claims)  |               |
                    +--------+---------+               |
                             |                         |
                             v                         |
                       +-----------+   needs work      |
                       |  Decide   |-------------------+
                       | (router)  |
                       +-----+-----+
                             | verified / out of tries
                             v
                          [ END ]
pip install langgraph==1.2.6 langchain-openai==1.3.3 pydantic==2.13.4
export OPENAI_API_KEY="your-key-here"
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field

# A model client on OpenAI's Responses API, with the built-in web-search tool
# bound on — so the model can search the web itself, no extra package needed.
# "gpt-5" is a reasoning model; swap it for any current model you have access to.
llm = ChatOpenAI(model="gpt-5", use_responses_api=True)
searcher = llm.bind_tools([{"type": "web_search"}])

MAX_ITERATIONS = 3         # a stop rule, decided up front

# STATE — the shared memory passed between every node
class ResearchState(TypedDict):
    question: str          # what we're answering
    draft: str             # the current best answer
    verdict: str           # "verified" or "needs_work"
    feedback: str          # what the verifier said to fix
    iterations: int        # how many times we've looped

# The verifier returns a typed result, so the router gets a clean
# "verified" / "needs_work" to branch on instead of parsing prose.
class Verdict(BaseModel):
    status: str = Field(description='"verified" or "needs_work"')
    feedback: str = Field(description="claims lacking support, if any")

# NODE 1 — the maker: search the web, then draft (or revise) the answer.
def research(state: ResearchState) -> dict:
    prompt = "Search the web, then answer the question. Back every claim with a source.\n"
    if state.get("feedback"):
        prompt += f"A reviewer flagged these gaps — fix them:\n{state['feedback']}\n"
    prompt += f"\nQuestion: {state['question']}"
    draft = searcher.invoke(prompt).text
    return {"draft": draft, "iterations": state["iterations"] + 1}

# NODE 2 — the checker: search for evidence, then critique the draft.
def verify(state: ResearchState) -> dict:
    evidence = searcher.invoke(
        f"Search the web for evidence to fact-check claims about: {state['question']}"
    ).text
    checker = llm.with_structured_output(Verdict)
    result = checker.invoke(
        "You are a fact-checker. Using the evidence below, reply 'verified' "
        "only if every claim in the answer is supported; otherwise 'needs_work' "
        "and list the unsupported claims as feedback.\n\n"
        f"Evidence:\n{evidence}\n\nAnswer:\n{state['draft']}"
    )
    return {"verdict": result.status, "feedback": result.feedback}

# ROUTER — the heart of the loop. Reads the verdict, picks the next step.
def decide(state: ResearchState) -> Literal["research", "__end__"]:
    if state["verdict"] == "verified":
        return "__end__"                      # success: goal met
    if state["iterations"] >= MAX_ITERATIONS:
        return "__end__"                      # surrender: out of tries
    return "research"                         # loop back and fix the gaps

# WIRE IT UP
graph = StateGraph(ResearchState)
graph.add_node("research", research)
graph.add_node("verify", verify)

graph.add_edge(START, "research")            # trigger
graph.add_edge("research", "verify")         # always verify a fresh draft
graph.add_conditional_edges("verify", decide, {
    "research": "research",                   # the backward arrow = the loop
    "__end__": END,
})

agent = graph.compile()

result = agent.invoke({
    "question": "What were the main causes of the 2008 financial crisis?",
    "draft": "", "verdict": "", "feedback": "", "iterations": 0,
})
print(result["draft"])

5. Формы нявыпання і захоўнікі

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

6. Калі НЕ трэба вяршыць Loop Engineering

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

Вывод

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

Справы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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