Галоўная / Артыкулы

Ад інжынерыі цыклаў да інжынерыі графаў: надзейныя агенты

Ад інжынерыі цыклаў да інжынерыі графаў: цыкл агента як інжынерная адзінка, дзе адзін цыкл ламаецца ад заблытанага стану і як граф гэта выпраўляе.

Выдавец: REACTAPP.TOP22 хв чытання4967 слоў

Крыніцы: From Loop Engineering to Graph Engineering: Building Reliable Agentic Systems in Tech Startups

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

while not finished:
    context = build_context(state)
    action = model.decide(context)
    observation = tools.execute(action)
    state = update(state, action, observation)

1. Агентны цыкл як інжынерны об'ект

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

action = model(current_state)
observation = execute(action)
next_state = transition(current_state, action, observation)

continue_execution =
    task_is_not_complete
    and execution_budget_is_available
MAX_ITERATIONS = 12
MAX_TOOL_CALLS = 30
MAX_RUNTIME_SECONDS = 600
MAX_TOKEN_COST = 250_000

while budgets_available(state):
    action = agent.next_action(state)

    if not policy.allows(action):
        return TerminalFailure("policy_violation")

    result = execute_idempotently(action)
    state = persist_transition(state, action, result)

    verification = verifier.evaluate(state)

    if verification.passed:
        return VerifiedSuccess(
            state=state,
            evidence=verification.evidence
        )

return TerminalFailure("budget_exhausted")

2. Дзе пачынаеся нарушэння адной цыклі

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

Зв’язанасць стаў

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

Неодназначнае завершэнне

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

Глобальныя пракаты

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

Слабая ізоляцыя нештатных сітуацый

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

Аграгаванне прывілеяў

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

Абмежаная канкурантнасць

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

Недастатковая можлівасць павторнага адыграння

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

3. Калібранне змены ў графах

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

Graph:
    nodes
    edges
    shared state
    terminal states
interface Node<Input, Output> {
  id: string;

  inputSchema: Schema<Input>;
  outputSchema: Schema<Output>;

  timeoutMs: number;
  retryPolicy: RetryPolicy;
  requiredCapabilities: Capability[];

  execute(
    input: Input,
    context: RunContext
  ): Promise<Output>;

  verify(
    output: Output,
    context: RunContext
  ): Promise<Evidence>;
}
interface Edge {
  from: NodeId;
  to: NodeId;
  condition: (
    state: WorkflowState
  ) => boolean;
}
const edges = [
  edge(
    "build",
    "tests",
    state => state.build.exitCode === 0
  ),

  edge(
    "build",
    "repair",
    state =>
      state.build.exitCode !== 0 &&
      state.repairAttempts < 3
  ),

  edge(
    "build",
    "failed",
    state =>
      state.build.exitCode !== 0 &&
      state.repairAttempts >= 3
  )
];

4. Граф для практыкі доставкі з адказам АІ

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

                         +----------------+
                         | Threat Model   |
                         +--------+-------+
                                  |
Intake -> Normalize -> Plan ------+-----> Implementation
                     |            |              |
                     |    +-------v--------+     |
                     +--->| Test Planning  |-----+
                          +----------------+     |
                                                 v
                                               Build
                                                 |
                          +----------------------+------------------+
                          | pass                                    | fail
                          v                                         v
                  Integration Tests                         Diagnose -> Repair
                          |                                         |
                     +----+----+                                    +-> Build
                     |         |
                   pass       fail
                     |         |
                     v         +-> Diagnose
                Security Check
                     |
                +----+----+
                |         |
              pass     high risk
                |         |
                v         v
            PR Creation  Human Approval
                |         |
                +----+----+
                     |
                     v
                Canary Deploy
                     |
                Runtime Verify
                  |       |
                pass     fail
                  |       |
                  v       v
                Done   Rollback -> Failed

5. Стан павінен быць тыпавым, стойкім і партыцыйнарым

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

{
  "runId": "run_93af",
  "goal": {
    "ticketId": "ENG-482",
    "repository": "payments-api",
    "baseRevision": "5df87a1"
  },
  "plan": {
    "artifactId": "sha256:71d...",
    "version": 2
  },
  "implementation": {
    "commit": "81f3ce2",
    "changedFiles": [
      "src/refunds/service.ts",
      "tests/refunds/service.test.ts"
    ]
  },
  "build": {
    "exitCode": 0,
    "artifactId": "sha256:932..."
  },
  "verification": {
    "unitTests": "passed",
    "integrationTests": "passed",
    "security": "pending"
  },
  "budgets": {
    "repairAttempts": 1,
    "toolCalls": 18,
    "tokens": 84320
  }
}
{
  "eventId": "evt_1092",
  "runId": "run_93af",
  "nodeId": "integration-tests",
  "attempt": 2,
  "inputHash": "sha256:8a2...",
  "outputHash": "sha256:19c...",
  "status": "succeeded",
  "startedAt": "2026-09-14T08:41:02Z",
  "completedAt": "2026-09-14T08:43:18Z"
}

6. Пераходы, каналізаваныя доказамі

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

type TestEvidence = {
  command: string;
  revision: string;
  exitCode: number;
  totalTests: number;
  failedTests: number;
  reportArtifact: ArtifactRef;
};
function testsPassed(
  evidence: TestEvidence,
  workflow: WorkflowState
): boolean {
  return (
    evidence.exitCode === 0 &&
    evidence.totalTests > 0 &&
    evidence.failedTests === 0 &&
    evidence.revision === workflow.currentRevision
  );
}
repository_valid
and build_passed
and tests_passed
and security_accepted
and deployment_verified

7. Шлейф артыфактов і выбраная пераглядка

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

{
  "artifactId": "sha256:f39...",
  "type": "test_report",
  "producedBy": "integration-tests",
  "graphVersion": "delivery-v4",
  "inputs": [
    "sha256:source-revision-81f3ce2",
    "sha256:test-config-a17"
  ]
}
Source code changed:
    invalidate build artifact
    invalidate unit-test report
    invalidate integration-test report
    invalidate deployment artifact

Threat model unchanged:
    preserve existing threat-model artifact

Requirements unchanged:
    preserve normalized requirements
    preserve approved implementation plan

8. Ідэмпатэнтнасць і кантроль пабочных эфектаў

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

const idempotencyKey = [
  runId,
  nodeId,
  inputArtifactHash
].join(":");

await deploymentApi.deploy({
  idempotencyKey,
  revision,
  environment
});
deploy_canary -> verify_runtime
                       |
                       +-> failure -> rollback_canary

9. Дэтэрміністычны і мадэльнае маршрутызаванне

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

if (testReport.failedTests > 0) {
  return "repair";
}

if (securityReport.criticalFindings > 0) {
  return "human-review";
}

return "deploy";
const decision = await riskClassifier.run({
  changeSummary,
  affectedServices,
  dataClassification,
  migrationPlan
});
type RiskDecision = {
  level: "low" | "medium" | "high";
  reasons: string[];
  requiredChecks: CheckId[];
};

10. Расклад, паралелізм і з’ўязкі

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

all required predecessor nodes are complete
and the incoming transition conditions are satisfied
                 +-> Generate Tests --+
Plan Complete ---+-> Threat Model ----+-> Join -> Implementation Review
                 +-> API Analysis ----+

Усе

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

Будзь-кой

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

Кворум

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

Максімальныя зусілля

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

Нявыполнення якомога быстрэй

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

11. Семантыка падэжу

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

type FailureClass =
  | "transient_dependency"
  | "invalid_input"
  | "verification_failed"
  | "policy_denied"
  | "budget_exhausted"
  | "human_rejected"
  | "unknown";
transient_dependency -> retry with backoff

invalid_input -> return to the upstream producer

verification_failed -> diagnose and repair

policy_denied -> terminal failure

budget_exhausted -> human escalation

human_rejected -> terminal cancellation

unknown -> quarantine and inspect
repair_attempts_remaining
and runtime_budget_available
and token_budget_available
and permitted_blast_radius_not_exceeded

12. Межы безпекі належаць вузлам

Этап «12 Security Boundaries Belong» працюе найкрашча, калі яго розглядаць як вімерную паверхню. Зафіксавце адны «золаты» транскрыпт, адны прыклад неудачы і прыметку па вярнэнні да пачатковага стану пры расшырэнні масштаба. Валіце вароць малыя, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты працы графа павінны быць простымі і з адначытаемымі дадзеннямі. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў. Этап «12 Security Boundaries Belong» працюе найкрашча, калі яго розглядаць як вімерную паверхню. Зафіксавце адны «золаты» транскрыпт, адны прыклад неудачы і прыметку па вярнэнні да пачатковага стану пры расшырэнні масштаба. Запісвайце часы выканання і косты токеноў або запытак праза функцыйнае рэзультаты. Відкрытасць костаў з самага пачатку запобегае неспакойным рашчыткам, калі працэс пераходзіць з дэмаверсіі ў спяльныя асяроддзя.

nodes:
  repository_analysis:
    capabilities:
      - repository:read

  implementation:
    capabilities:
      - repository:read
      - workspace:write

  create_pull_request:
    capabilities:
      - repository:pull_request:create

  deploy_canary:
    capabilities:
      - deployment:preview:create

  production_release:
    capabilities:
      - deployment:production:create
    approval:
      required: true

13. Версіяванне і воспроізведамасць

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

{
  "runId": "run_93af",
  "graph": {
    "name": "software-delivery",
    "version": "4.2.1"
  },
  "nodes": {
    "planner": "planner@2.3.0",
    "implementation": "coding-agent@5.1.2",
    "security-review": "security-review@1.8.0"
  },
  "models": {
    "planner": "model-a-2026-08",
    "implementation": "model-b-2026-09"
  },
  "policyVersion": "delivery-policy@3.4.0",
  "baseRevision": "5df87a1"
}

14. Спостэрагальнасць на роўні графа

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

workflow_run_id
graph_version
node_id
node_attempt
parent_node_id
artifact_ids
model_version
prompt_version

15. Мінімальная рэалізацыя стартапу

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

>
workflow_definitions
workflow_versions
workflow_runs
node_definitions
node_attempts
transition_events
artifacts
approvals
capability_grants
def schedule(run):
    state = load_state(run.id)
    candidates = find_pending_nodes(run.graph_version)

    for node in candidates:
        if dependencies_satisfied(node, state):
            if incoming_guards_allow(node, state):
                enqueue(
                    run_id=run.id,
                    node_id=node.id,
                    graph_version=run.graph_version
                )
def execute_node(job):
    attempt = create_attempt(job)

    try:
        inputs = resolve_inputs(job)
        validate(inputs, job.node.input_schema)

        capabilities = issue_capabilities(job.node)
        output = job.node.execute(inputs, capabilities)

        validate(output, job.node.output_schema)
        evidence = job.node.verify(output)

        persist_success(attempt, output, evidence)
        evaluate_outgoing_edges(job.run_id, job.node.id)

    except Exception as error:
        failure = classify_failure(error)
        persist_failure(attempt, failure)
        apply_failure_transition(job, failure)

    finally:
        revoke_capabilities(job.node)

16. Перакантрольваць з ціклу на граф

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

Крок 1: Дадаць інструменты да існуючага ціклу

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

Крок 2: Адначыя этапы

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

Крок 3: Адзначэнне тыпаваных артыфактов

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

Этап 4: Экстэрналізацыя пераходаў

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

Этап 5: Дадзіце незалежную пераканальванне

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

Этап 6: Адналажванне пунктаў контролю

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

Этап 7: Ізаліяцыя можлівасцей

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

Шаг 8: Дадаць абмежаныя сценарыі відновлення

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

Шаг 9: Паралелізацыя незалежных адзінакоў

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

Шаг 10: Версіяванне структуры

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

17. Частыя анты-шаблоны інжынерыі графаў

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

Адны агент на вузел

Дэтэрміністычныя рашэнні, кантролюваныя мадэллю

Аднародны зменны стан

Безмежныя цыклі

Перакананне, адмовленая агентам

Глобальныя кранты

Відсутнія шляхі компенсацыі

Графы без лініяй спадчыны

Прэматурная дынамічная маршрутазацыя

18. Калі граф не патрэбны

Вывык

Implicit control flow
becomes
explicit workflow topology

Conversation state
becomes
typed durable state

Agent-declared success
becomes
evidence-gated completion

Global retries
become
bounded local recovery

Shared privileges
become
node-scoped capabilities

Complete reruns
become
dependency-aware replay

Sequential execution
becomes
controlled concurrency

Opaque behavior
becomes
graph-level observability

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