Практычныя прытамкі: Рэальныя інцыденты з безпекай, якія адбыліся за трэці тыдзень, з АІ-агентамі
Практычныя прыказкі: Рэальныя інцыденты з безпекай, якія адбыліся з АІ-агентамі ў трэцью недзелю: контракты, перакрычанні та месцы для вставкі коду для команд, якія выкарыстоўваюць гэты патэрн.
У гэтым карыце парадоксальным чынам перадстаўляецца парадокс ад сыр'ёчных матэрыялаў да рабочай системы для: «Трохіце пазней у рэальным часе адбыліся інцыденты з безпекай у AI-агентах, і што кожны з іх на самае справа навучае». Акцэнт ставіцца на практычныя крокі, чыстае перакананне і код, які можна проста падключыць у репазітарый без неабясненых спадчыных намераў. У стадіі агульнага відзору неабходна практычна апісацыя вхідных дадзеных, адпаведальнага за крок і крэатывных крэтарыяў пры зміне коду. Аператары должны магчымаць перапрацаваць крок з вядомай точкі контролю, не падозрэўаючы прыватны стан системы. Конфігурацыю трэба зберагаць аддзелена ад коду прыемлівання. Файлы сераўнавальнага сэрвісу, хоўкі секретных дадзеных і флагі функцый канчаткова павінны знаходзіцца ў адной локалізацыі, куды аператары могу адбавіць аудыт, не чытаючы весь кодовы ланцуг.
Першы інцыдент: бот, які вываліў прыватны код таму, што вы сказалі «адзначыць дапаможна»
Калі працуеце над інцидэнтом на стадыі бота, спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чэк-ліст дапамагае захаваць чыстасць пазнейшых змян у кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсцю частью продукту, а не пазнейшым дапрацоўкам. Ставіце контрольныя пункты пасля дорогіх крокаў. Система вярнення не должна зноў выклікаць той самы калл до LLM, калі аператар перапрыбуе пазнейшы ўзлок.
# .github/workflows/agentic-issue-bot.yml
# BEFORE: org-wide token, no membership check, posts directly
name: issue-bot-vulnerable
on:
issues:
types: [assigned]
jobs:
respond:
runs-on: ubuntu-latest
steps:
- name: Fetch context and respond
env:
GH_TOKEN: ${{ secrets.ORG_WIDE_PAT }} # scoped to every repo in the org
run: |
# reads issue.body directly, treats it as trusted instruction
gh issue comment "${{ github.event.issue.number }}" \
--body "$(python3 bot_respond.py "${{ github.event.issue.body }}")"
# AFTER: repo-scoped token, membership gate, draft instead of a live post
name: issue-bot-fixed
on:
issues:
types: [assigned]
jobs:
respond:
runs-on: ubuntu-latest
steps:
- name: Check the issue author is an org member or collaborator
id: gate
env:
GH_TOKEN: ${{ secrets.REPO_SCOPED_PAT }} # scoped to this repo only
run: |
ACTOR="${{ github.event.issue.user.login }}"
ROLE=$(gh api "repos/${{ github.repository }}/collaborators/$ACTOR/permission" \
--jq '.permission' 2>/dev/null || echo "none")
if [ "$ROLE" = "none" ]; then
echo "trusted=false" >> "$GITHUB_OUTPUT"
else
echo "trusted=true" >> "$GITHUB_OUTPUT"
fi
- name: Prepare a draft response instead of posting
if: steps.gate.outputs.trusted == 'true'
env:
GH_TOKEN: ${{ secrets.REPO_SCOPED_PAT }}
run: |
python3 bot_respond.py "${{ github.event.issue.body }}" > draft_reply.md
gh issue edit "${{ github.event.issue.number }}" --add-label "needs-human-review"
# a human reads draft_reply.md and posts it manually, or via a
# second, explicitly human-triggered workflow step
Інцидэнт два: CVE, які прыпускаў, што разработчыкі — адзін з надзяйных стакон
Калі працуеце над інцыдэнтом два на стадзіі CVE, спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, нявыпанне должна паказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Зробіце перапактаванне пасля дорогіх крокаў. Система не должна зноў выклікаць той самы кантакт з LLM, калі аператар прабуе зноў запрацаваць з пазнейшым вузлом.
GITLAB CVE-2026-18252, AFFECTED VS PATCHED
----------------------------------------------------------
BRANCH VULNERABLE RANGE PATCHED VERSION
----------------------------------------------------------
18.x 18.9 - latest 18.x 19.1.7 (upgrade path)
19.1 19.1.0 - 19.1.6 19.1.7
19.2 19.2.0 - 19.2.4 19.2.5
19.3 19.3.0 19.3.1
----------------------------------------------------------
CVSS score: 7.3 (High)
Weakness: CWE-829, inclusion of functionality from an
untrusted control sphere
Required access: authenticated Developer role
GitLab.com SaaS / Dedicated: patched by GitLab, no action needed
Self-managed instances: patch required, urged immediately
----------------------------------------------------------
#!/usr/bin/env bash
# check_gitlab_cve.sh
# Self-hosted, no paid vulnerability scanner required.
# Compares your self-managed GitLab version against GitLab's own
# published security release JSON feed and flags known CVEs.
set -euo pipefail
CURRENT_VERSION=$(curl -s "https://your-gitlab-instance/api/v4/version" \
-H "PRIVATE-TOKEN: $GITLAB_API_TOKEN" | jq -r '.version')
echo "Running GitLab version: $CURRENT_VERSION"
# GitLab publishes security release blog posts with a predictable
# structure; for a production setup, mirror the CVE list into a
# small local file you update whenever GitLab ships a security release,
# and diff your running version against it on a cron job.
KNOWN_VULNERABLE=("18.9.0" "19.1.0" "19.1.6" "19.2.0" "19.2.4" "19.3.0")
for v in "${KNOWN_VULNERABLE[@]}"; do
if [ "$CURRENT_VERSION" = "$v" ]; then
echo "WARNING: running $CURRENT_VERSION, matches a version flagged in CVE-2026-18252 range. Patch now."
exit 1
fi
done
echo "No known match in the local CVE list. Still verify against GitLab's security release page directly."
Інцыдэнт трох: дыпфейк, які хацеў бюджет на вычысленні, а не крантэнацыі
Калі працуеце над стадзіяй «Deepfake» у рамках Інцыдэнта трох, спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрэчвайце гэтую стадзію як контракт межа даннэмі і перакананымі выходамі. Дайце назвы артыкулам, задаце правіла пераканання успеху і адмовіцеся ад тыхоўага частковага завершэння. Зрабіце контрольны пункт пасля дорогіх крокаў. Програма для продакцыі не должна зноў выклікаць той самы калектар LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел. Калі працуеце над стадзіяй «Deepfake» у рамках Інцыдэнта трох, спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі. Зберагаеце настройкі за межамі коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць аудыт без неабяжлівага чытання всей структуры.
Спісак задач: што насправды можа зробіць маленька команда за гэты тыдзень
Спісак задач ўжоць краща працюе, калі яго розглядаць як меркаваны аспект. Запісайте адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням меж задачі. Запісуйце адносна правільны ход задачі і адносна шлях вярнення ў нормальны стан разам. Перапрыбуткі, людзкія контрольны пункты і обработка некоректных поведэнняў є частью продукту, а не чымсь, што дадаецца пазней. Зберагайце стан графа ў простам і типаваным формате. Вкладныя структуры маскуюць інфармацію пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перерываў.
# spend_approval_gate.py
# A minimal, self-hosted out-of-band verification gate.
# No paid identity-verification vendor required, just a shared
# secret rotated on your own schedule and a callback number you
# already have on file, never one supplied in the request itself.
import hmac
import time
THRESHOLD_USD = 50_000
# Rotate this weekly; store it somewhere the approval requester
# (or an attacker impersonating them) never has access to, e.g. a
# password manager entry only finance leads can see.
CURRENT_PASSPHRASE = "harbor-quiet-tuesday"
def requires_out_of_band_check(amount_usd: float) -> bool:
return amount_usd >= THRESHOLD_USD
def verify_out_of_band(spoken_phrase: str) -> bool:
# constant-time compare so a partial match can't be timed out
return hmac.compare_digest(spoken_phrase.strip().lower(),
CURRENT_PASSPHRASE.lower())
def approve_spend(amount_usd: float, spoken_phrase: str = "") -> str:
if not requires_out_of_band_check(amount_usd):
return "approved"
if verify_out_of_band(spoken_phrase):
return "approved after out-of-band verification"
return "BLOCKED: verify via a known callback number or the current passphrase before approving"
Што насправды ўсе трое маюць спакульна
Этап «Што» працюе найкраща, калі яго розглядаць як вимерную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы.
Чэк-ліст для эксплуатацыі
Этап чэк-ліста для эксплуатацыі працюе найкраща, калі яго розглядаць як вимерную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы.
Запісвайце часы выконання і косты токеноў або запытак праза функцыйнае рэзультаты. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.
Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакошуюць продовжэнне роботы пасля перерываў.
Калі дозволяе бюджет, дадзіце тэст на перакананне, які працюе з критычным шляхам у CI за дапамою фікстураў, а не реальных платных API.
Конфігурацыю трэба зберагаць паза кодам прыкладнай програмы. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцыяй должны знаходзіцца ў аднам месцы, куда аператары можуць аудытувать іх без неабяжнага чытання всего графа.
Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакошуюць продовжэнне роботы пасля перерываў.
Перш чым апранаваць стек, заморозьце версіі, зафіксуйце ідеальны транскрыпт для критычнага шляху і паказваце крокі для атрыбутавання. У спакульных сераўнаваннях неабходны ліміты швайнаў, перакананні ў прыналежнасці та чысты власнік для змены секрэтных данных. Валіце надзейнасць працы над красавім разовым дэманстрацыйным прыкладам.
Запіска параграфу 9590a2274c4f: не кластыць ключы прадаўцаў у репазітары, задаць максымальную кантэнцыю токена на адна сесія і зберагчыць транскрыпты праза фіксаты для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.
Калі працуеце над стадзіяй 0 запіскі па зміцнэнню, спачатку запісайце умовы: неабходныя даннэ, сігнал успеху і тое, што выходзіць пад час частковага абякання. Такі чэк-ліст дапамагае заставаць пазнейшыя змены коду чыстымі. Запісвайце час выканання і вартасць токена або запыту праза функцыйнае рэзультат. Відкрытая візуабілізацыя вартасцей запобегае неспакоўным рахункам, калі парадокс пераходзіць з дэмавайнага сераўера ў спакульнае сэрвіса.
Дзялей 0/772 па зміцнэнню: вы мерзіце час выканання, класыя ошибак і витрату токена для гэтай запіскі, а пасля выявляеце, чы хацеце застаўіць змену на адной фіксованай сэтке пытанняў, а не на адной лягкай інтуіцыі.
Этап 1 прыткага зміцнення работае наяўна, калі яго спрыяваць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярненне да пачатковага стану перш чым расширваць сферу дзеяння. Дакументаваць трэба як успішны, так і вярнучыся шляхы. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дапрацоўкі.
Дзеянне прыткага зміцнення 1/772: вимеравайце час выканання, класію памылак і витрату токенав для гэтага запісу, а потым вынікайце, чы рашыцца застаўляць змяну, ставячысь да фіксаванага набору пытанняў, а не да індывідуальных прыкладаў.
Для этапа 2 прыткага зміцнення, перш чым зменяць код, задаце вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі должны магчыма было перзапускаць крок з вядомай точкі контролю, не спадзяючыся на скрыты стан. Спрыяваць гэты этап як кантракт між вхіднымі данымі і паўнастацэннымі выходамі. Дайце назвы артыфактам, задаце перакананні на успех і адмовіцеся ад беззвучнага частковага завершэння.
Дзеянне паўжасткі 2/772: звярніце увагу на час выканання, класы памылак і витрату токенаў для гэтага зьвісткі, а пасля, на аднойчынай базе пытанняў, а не на асобістых спазырэннях, выявіце, чы хачаце застаўіць змяну.
Калі працуеце над 3-й стадзіяю зьвісткі паўжасткі, спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковай памылки. Такі список дапамагае заставіць пазнейшыя змяны коду чыстымі. Зберагаеце настройкі праза код аплікацыі. Файлы сераўнавання, хранільнікі секрэтных дадзенняў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куда аператары можуць адбавіць аудыт без неабходнасці чытання всей структуры.
Дзеянне паўжасткі 3/772: звярніце увагу на час выканання, класы памылак і витрату токенаў для гэтага зьвісткі, а пасля, на аднойчынай базе пытанняў, а не на асобістых спазырэннях, выявіце, чы хачаце застаўіць змяну.
Этап 4 прынцыпа зміцнення работае наяўна, калі яго розглядаць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адин прыклад неудачы і запіс пра вярненне да пачатковага стану перш чым расширваць сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісьць крока не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач.
Дакладнасць прынцыпа зміцнення 4/772: вимеравайце час выканання, класіяцыю памылак і колькасць выкорыстоўваных токенав для гэтага запісу, а пасля рашайце, чы хацяце застаўіць змяну, стварыўшы фіксаваны набор пытанняў, а не спакойнае аналізаванне.
Для 5-го этапа прыткага зміцнення неабяжна практычна визначэнне інпутаў, адпаведальнага за шаг і крэтарыяў завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перзапускаць шаг з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць трываласць выконання і кост токенаў або запытаў па боку функцыйнаых рэзультатаў. Відразлівае адображэнне костаў запобегае неспакойным рахункам, калі процес пераходзіць з дэмавай версіі ў спяльныя среды.
Дзеянне прыткага зміцнення 5/772: вымерыць час выконання, класію памылак і витрату токенаў для гэтага пункту, а потым вырашыць, чы робіцца змяна на адной падставе фіксаванага набору пытанняў, а не на адной лячбе.
Калі працуеце над 6-й стадзіяю прыемкі з павышэння безпекі, спачатку запісайце угоду: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі.
Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе контралі і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам.
Дзялё 6/772 прыемкі з павышэння безпекі: вымерайце час выканання, класыя ошибакі і витрату токенав для гэтай прыемкі, а потым выберайце, чы робіць змены на адной фіксаванай сэтке пытанняў, а не на адной лічбе прыкладаў.
7-я стадзія прыемкі з павышэння безпекі работае лепей, калі яе спрыямаць як вимерную плошчу. Запісайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіску пра вярненне да пачатковага стану, перш чым расширваць масштаб.
Спрыяйце гэтай стадзіі як угоды межа даннімі і перакананымі выходамі. Дайце назвы артыфактам, задаце правілы пераканання успеху і адмовіцеся ад тыхнай частковай, неканфірмаванай роботы.
Дзеянне паўжасткі 7/772: звярніце увагу на час выканання, класы памылак і витрату токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацься застаўляць змяну.
Для 8-го этапа паўжасткі неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае перадзванаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Канфігурацыю трэба зберагчы параду коду прыкладнення; файлы сяродавішча, хранальнікі секрэтных дадзеных і флагі функцыяй должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаючы весь код.
Дзеянне паўжасткі 8/772: звярніце увагу на час выканання, класы памылак і витрату токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацься застаўляць змяну.
Калі працуеце над 9-м падземам прыемкі з ужорсткавання, спачатку запісайце шэраг умов: неабяжлівыя данні, сігнал успеху і тое, што выходзіць па частым неудачам. Такі список дапамагае заліцварыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач.
Дзялянка ужорсткавання 9/772: звярніце увагу на час выканання, класыя ошибкі і витраты токенав для гэтай прыемкі, а пасля вырашыце, чы робіць змены на адной фіксаванай сэтке пытанняў, а не на адной толькі прымітцы.
9-й падзем прыемкі з ужорсткавання будзе работаць наяўней, калі яго спрыймать як параметр, які можна змерыць. Запісайце адну ідеальную версію, адзін прыклад неудачы і прымітку па адвярненню роботы, прычым не расшырюючы сферу дзеяння. Запісвайце часы выканання і вартасць токенав або запытак праза функцыйнальныя рэзултаты. Відразувая візуабельнасць вартасцей утримвае неспакойныя сюрпрызы, калі процес пераходзіць з дэмавайшага режыма ў спяльныя сераўеры.
Дзеянне паўжырання 10/772: звярніце увагу на час выканання, класыя ошибак і колькасць токенаў, якія былі выкарыстаны для гэтага зазначэння, а пасля, на аднойчыне з фіксаваным наборам пытанняў, а не на асобістых спазырах, вынікніце рашэнне пра тое, чы робіць змяны.
Для 11-й стадзіі паўжырання неабходна перад змянай коду чытко апісаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыяныя працавнікі павінны магчымае перадзванаць крок з вядомай точкі контролю, не прабуючы спадарацца пра схованы стан. Апісвайце адночасна шлях успеху і шлях вярнення. Практыка павторных спроб, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Дзеянне паўжырання 11/772: звярніце увагу на час выканання, класыя ошибак і колькасць токенаў, якія былі выкарыстаны для гэтага зазначэння, а пасля, на аднойчыне з фіксаваным наборам пытанняў, а не на асобістых спазырах, вынікніце рашэнне пра тое, чы робіць змяны.
Калі працуеце над 12-ю стадзіяй ударожэння, спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага неяксаменства. Такі список контроля дапамагае залічыць пазнейшыя змены коду адкрыта. Спрэцьвуйце да гэтай стадзіі як да контракту межа даннімі і перакананымі выходамі. Дайце назву артыфактам, задаце правіла пераканання успеху і адмовіцеся ад тыхоўскага частковага завершэння.
Дзеянні ўдарожэння 12/772: звярніце увагу на час выканання, класыя ошибакі і витрату токенав для гэтай змены, а пасля вырашыце, чы робіць яе, стварыўшы фіксаваны набор пытанняў, а не на адной толькі прыватнай інформацыі.
13-я стадзія ўдарожэння працюе лепей, калі яе спрэцьвоўваюце як меравальную плошчу. Запісайце адну ідеальную транскрыпцыю, адзін прыклад неяксаменства і змэту аб анулюванні роботы пры расшырэнні масштаба. Зберагайце настройкі праз адной з дыялектаў прыкладнага програмнага кода. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функций павінны знаходзіцца ў адном месцы, куды аператары можаць аудытаваць іх, не чытаючы весь граф.
Дзеянне паўжыцьнявання 13/772: змяроўвае час выканання, класію памылак і колькасць токенаў, выкорыстаных для гэтай змены, а пасля – вырашае, чы рашыцца застаўіць змену на аднойчы назначанай сэткі пытанняў, а не на адзінокых прыкладах.
Для 14-го этапу паўжыцьнявання неабходна з’явіць вхідныя даны, абавесцяльніка крока і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест амаль неканчатых скрыптав. Калі крок не выконваецца, прычына неудачы павінна вказываць на адную абавесцяльніка, а не на заплутаны ланцужок задач.
Дзеянне паўжыцьнявання 14/772: змяроўвае час выканання, класію памылак і колькасць токенаў, выкорыстаных для гэтай змены, а пасля – вырашае, чы рашыцца застаўіць змену на аднойчы назначанай сэткі пытанняў, а не на адзінокых прыкладах.
Калі працюеце над стадзіяй 15 з адаптавання захоўнай системы, спачатку запісаце кантракт: неабходныя даны, сігнал успеху і тое, што выходзіць пад частковым невясненнем. Такі список контроля дапамагае залічваць пазнейшыя змены ў кодзе чыста і адкрыта.
Запісваце час выканання, вартасьць токенаў або запытак праза рэзультаты функцыйнасці. Відразувая візуабільнасьць вартасцей запобегае неспакою, калі процес пераходзіць з дэмавай версіі ў спяльнаныя сераўеры.
Дакладнасьць адаптавання 15/772: замеры часу выканання, класу паказакоў і витрачання токенаў для гэтай стадзіі, пасля чаго прыміце рашэнь пра тое, чы хацеце застаўіць змену, адпаведна фіксаванаму набору пытанняў, а не індывідуальным спостараванням.