Галоўная / Артыкулы / Практычныя прытамулкі: Тады які Agent SDK трэба стварыць?

Практычныя прытамулкі: Тады які Agent SDK трэба стварыць?

Практычныя прытамулкі: Тады які Agent SDK трэба стварыць? – контракты, перакантрольванні та месцы для вставкі коду для команд, якія викорыстоўваюць гэты патэрн.

7499 слоў

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

Што такое агент?

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

Агент-дакладчык етыкеткаў пра жывыліну

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

Забэрэжыце справядлівасьць паравання

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

Anthropic’s Claude Agent SDK

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

@tool(
    "check_sfa_additive",
    "Check whether a food additive is permitted by the Singapore Food Agency, "
    "using the full SFA permitted-additives list parsed from the official PDF. "
    "Accepts an E-number ('E211') OR a name ('Sodium Benzoate', 'Soy Lecithin'). "
    "If you pass a name and also know its E/INS number, set e_number_hint — an "
    "unrecognised name that the hint resolves is REMEMBERED for next time.",
    {"additive": str, "e_number_hint": str},
)
async def check_sfa_additive(args: dict) -> dict:
    raw = args["additive"].strip()
    hint = args.get("e_number_hint", "").strip()
    entry = _resolve_additive(raw)
    if not entry and hint:
        entry = _resolve_additive(hint)
        if entry:  # learn: this label name -> this number, persisted to disk
            num = entry["e_number"] or entry.get("ins") or ""
            _MEMORY["learned_aliases"][_norm(raw)] = re.sub(r"\(.*\)", "", num).lower()
            _save_memory(_MEMORY)
    return _ok(_format_entry(entry, raw))
server = create_sdk_mcp_server(
    name="sg-nutrition-tools",
    version="1.0.0",
    tools=[recall_product, check_sfa_additive, check_hcs, calculate_nutri_grade],
)

options = ClaudeAgentOptions(
    system_prompt=SYSTEM_PROMPT,
    mcp_servers={"sg": server},
    allowed_tools=[
        "mcp__sg__recall_product",
        "mcp__sg__check_sfa_additive",
        "mcp__sg__check_hcs",
        "mcp__sg__calculate_nutri_grade",
    ],
    model=CLAUDE_MODEL,
    permission_mode="bypassPermissions",
    max_turns=20,
    # Point the bundled CLI at the LiteLLM proxy's Anthropic endpoint.
    env={
        **os.environ,
        "ANTHROPIC_BASE_URL": BASE_URL,
        "ANTHROPIC_AUTH_TOKEN": API_KEY,
    },
)
async def message_stream():
    yield {
        "type": "user",
        "message": {"role": "user", "content": [
            {"type": "text", "text": "Investigate this nutrition label."},
            {"type": "image", "source": {"type": "base64", "media_type": mime, "data": b64}},
        ]},
    }

async with ClaudeSDKClient(options=options) as client:
    await client.query(message_stream())
    async for message in client.receive_response():
        ...  # stream ToolUseBlock / TextBlock as they arrive
sausheong claude-demo % uv run python main.py ../milo.jpeg

Investigating image: ../milo.jpeg
────────────────────────────────────────────────────────────
I'll start by reading the label carefully, then run all checks in parallel.

**Reading from the label:**
- **Product:** Nestlé MILO 3in1
- **Net weight:** 27g powder sachet (add hot water to prepare — this is a **powder, not a ready-to-drink beverage**)
- **Ingredients:** Sugar, PROTOMAL® Malt Extract (Contains Barley), Skimmed Milk (Cow's Milk), Cocoa, Palm Oil, Minerals (Dicalcium Phosphate, Disodium Phosphate, Ferric Pyrophosphate), Resistant Dextrin, Flavourings, Vitamins (C, B3, D, B6, B2, B12)
- **Identifiable additives:** Dicalcium Phosphate (E341), Disodium Phosphate (E339), Ferric Pyrophosphate; Flavourings (generic — cannot identify specific ones)

Kicking off recall + HCS check + all additive checks simultaneously:
  → tool: recall_product({'product_name': 'Nestlé MILO 3in1'})
  → tool: check_hcs({'product_name': 'MILO 3in1'})
  → tool: check_sfa_additive({'additive': 'Dicalcium Phosphate', 'e_number_hint': 'E341'})
  → tool: check_sfa_additive({'additive': 'Disodium Phosphate', 'e_number_hint': 'E339'})
  → tool: check_sfa_additive({'additive': 'Ferric Pyrophosphate', 'e_number_hint': 'E450'})
All checks returned. Note: this is a **powder**, not a ready-to-drink beverage, so Nutri-Grade (which requires per-100ml liquid values) does **not apply** — I will skip `calculate_nutri_grade`.

---

## Reasoning

**Step 1 — Product recall.** This product has been seen before. The prior verdict is consistent with what I read now — I'll treat this fresh investigation as the authoritative one and use the prior as a cross-check.

**Step 2 — Label reading.**
- MILO 3in1 is a **27g powder sachet** — you add hot water to make a drink. It is classified as a "Tonic Food Drink" on the label. Because it is sold as a dry powder (not a pre-packaged ready-to-drink liquid), Nutri-Grade per-100ml calculation does not apply.
- Nutritional values per serving (27g): Energy 110 kcal, Total Fat ~2.4g, Saturated Fat ~1.2g, Total Sugars ~13.8g (of which Added Sugars ~10g), Sodium ~38mg.
- **Sugar is the #1 ingredient** — it appears first in the ingredient list, before the malt extract.

**Step 3 — Additives.**
- **Dicalcium Phosphate (E341):** SFA-permitted ✅ — used as a mineral/calcium source.
- **Disodium Phosphate (E339):** SFA-permitted ✅ — used as an acidity regulator/mineral.
- **Ferric Pyrophosphate:** SFA-permitted ✅ — used as an iron supplement/mineral source.
- **Resistant Dextrin:** A dietary fibre ingredient (prebiotic fibre), not a regulated additive — no E number, no SFA check needed.
- **Flavourings:** Generic label — cannot identify specific flavouring compounds; SFA check not possible.
- **Vitamins (C, B3, D, B6, B2, B12):** Added as nutritional fortification, not food additives in the regulatory sense. Riboflavin (B2) carries E101 when used as a colourant, but here it's explicitly declared as a vitamin supplement — standard and expected.

**Step 4 — Healthier Choice Symbol.** HCS certified ✅ (MILO 3in1 Activ-Go appears multiple times in the HPB dataset — `check_hcs`).

**Step 5 — Sugar content reality check.** Each 27g sachet contains ~13.8g total sugars (~10g added sugars). That's more than **half the sachet's weight is sugar**, and exceeds the WHO daily added-sugar guideline of 25g in less than one cup. This is label-read, not a tool finding.

---

## Verdict

### 🟢 GREEN — No Concern
- **All three declared additives are SFA-permitted** (Dicalcium Phosphate E341, Disodium Phosphate E339, Ferric Pyrophosphate) — `check_sfa_additive` ×3.
- **Carries the Healthier Choice Symbol** — HPB has certified MILO 3in1 Activ-Go — `check_hcs`.
- **Vitamins and minerals fortified** — B2, B3, B6, B12, C, D, plus calcium and iron — label.
- **Contains barley malt extract** — a whole-grain source of energy — label.
- **Resistant Dextrin** (prebiotic dietary fibre) is a functional ingredient, not a concern — label.

### 🟡 AMBER — Worth Knowing
- **Palm Oil present** — a saturated fat source. Saturated fat is 1.2g per sachet (~4.4g per 100g of powder). Not alarming at one serving, but worth knowing if you have multiple cups a day — label.
- **"Flavourings" are not specified** — cannot determine whether natural or artificial. No SFA check was possible — label.
- **Nutri-Grade does not apply here** — this is sold as a powder. If you reconstitute it and compare the drink to ready-to-drink alternatives, it would likely land in Grade C or D territory based on sugar content, but no regulatory grade is required on the packet.

### 🔴 RED — Genuinely Concerning
- **Sugar is the #1 ingredient** — it appears first in the list, meaning it is the dominant ingredient by weight. Each sachet delivers **~13.8g total sugars / ~10g added sugars** — label. That's 40% of the WHO's recommended 25g/day added-sugar limit in a single cup. If you're drinking 2–3 sachets a day (as Nestlé's own label suggests for daily energy), you are consuming **20–30g of added sugar from MILO alone**, likely exceeding the daily limit.
- **Marketing framing vs. nutritional reality:** The packet prominently says "Nourishing Energy" and shows vitamins, but the sugar load is the dominant nutritional feature. The fortification (vitamins, minerals) does not offset this — label.

**Bottom line for a Singapore shopper:** MILO 3in1 is safe from an additives and regulatory standpoint — everything checks out with SFA and HPB. But it is a **sugar-heavy product** dressed up in health language. Treat it as an occasional treat rather than a daily nutritious breakfast drink, especially for children.

OpenAI Agents SDK

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

@function_tool
async def check_sfa_additive(additive: str, e_number_hint: str = "") -> str:
    """Check whether a food additive is permitted by the Singapore Food Agency.

    Looks the additive up in the full SFA permitted-additives list (parsed from
    the official SFA PDF). Accepts either an E-number or a plain-English name as
    printed on a Singapore label.

    Args:
        additive: An E-number ('E211', 'e211', 'en:e211') OR an additive name
            ('Sodium Benzoate', 'Soy Lecithin', 'MSG').
        e_number_hint: Optional. If you pass a name and also know its E/INS
            number, supply it here. If the name isn't recognised but the number
            is, the mapping is REMEMBERED so the name resolves directly next time.    """
    ...
class NutritionVerdict(BaseModel):
    reasoning: str          # declared first: the model works out loud before committing
    product_name: str
    summary: str
    green: list[Finding]
    amber: list[Finding]
    red: list[Finding]
    recommendation: str
client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY)
model = OpenAIChatCompletionsModel(model=OPENAI_MODEL, openai_client=client)
agent = Agent(name="SG Nutrition Investigator", model=model,
              instructions=INSTRUCTIONS, output_type=NutritionVerdict,
              tools=[recall_product, check_sfa_additive, check_hcs, calculate_nutri_grade])

user_input = [{"role": "user", "content": [
    {"type": "input_text", "text": "Investigate this nutrition label."},
    {"type": "input_image", "image_url": _data_url(image_path)},  # base64 data URL
]}]
result = await Runner.run(agent, input=user_input)
verdict: NutritionVerdict = result.final_output
sausheong openai-demo % uv run python main.py ../milo.jpeg

Investigating image: ../milo.jpeg
────────────────────────────────────────────────────────────
Product: Nestlé MILO 3 in 1 Activ-Go

Reasoning: I read the sachet as **Nestlé MILO 3 in 1 Activ-Go**. The front says “goodness of malt, milk & cocoa” and the back says “MILO Ionic Food Drink,” so this is a **powdered drink mix**, not a ready-to-drink beverage. Because it is not sold as a beverage with per-100ml nutrition for the prepared drink as consumed, I did **not** calculate Nutri-Grade; that tool is only for beverages.

I first checked whether this product had been investigated before. A prior record existed, and it broadly matched what I can read here: a sweetened powdered malt-cocoa-milk drink sachet with permitted phosphate additives, relatively high in sugar for a single sachet, and not found in the HCS database. I used that only as background and then re-read this label fresh.

From the nutrition panel, I can read:
- Serving size: **1 sachet (27g)**
- Servings per package: **1**
- Per 100g / per serving shown side by side
- **Total sugars: 50.1g per 100g; 13.8g per serving**
- **Saturated fat: 0.5g per 100g; 1.2g per serving**
This is a powder, so the relevant direct reading is per 100g, not per 100ml.

I can read the ingredient list as:
**Sugar, Protomalt™ Malt Extract (contains barley), skimmed milk/cow’s milk, cocoa, palm oil, minerals (dicalcium phosphate, disodium phosphate), fibre (pyrophosphate), resistant dextrin, flavourings, vitamins (C, B3, D, B6, B2, B12).**

For additives, I checked each identifiable additive individually where possible:
- **Dicalcium phosphate**: checked and found **permitted by SFA**. That lands in GREEN.
- **Disodium phosphate**: checked and found **permitted by SFA**. That also lands in GREEN.
- The label also contains the broader terms **“phosphates”** and **“pyrophosphate”/“fibre (pyrophosphate)”** in wording around ingredients, but the image does not clearly identify a specific additive code for the pyrophosphate entry, and the generic umbrella term “phosphates” is not reliable enough on its own. I therefore do not treat the generic term as confirmed permitted just from the broad word alone. I only rely on the specifically named phosphates I could check.
- **Flavourings** is too generic to identify a specific additive, so I could not check it individually.
- The vitamins and minerals are nutrients rather than red-flag food additives in the SFA additive sense.

I also checked for the **Healthier Choice Symbol** using the product name. It was **not found** in the HCS database.

Main nutritional takeaways from the label:
- Sugar is the **first ingredient**, which usually means it is the largest ingredient by weight.
- The product contains **50.1g sugar per 100g** powder, and **13.8g sugar per 27g sachet**. That is quite a lot for one small sachet drink.
- Saturated fat is **1.2g per sachet**, which is not extreme, but the bigger concern here is sugar.

So the overall picture is: the identifiable phosphate additives appear permitted, but nutritionally this is still a **sweetened convenience drink mix** rather than a lower-sugar everyday option.

Summary: This is a powdered MILO drink sachet, not a ready-to-drink beverage. The clearly identifiable phosphate additives on the label are permitted by SFA, but sugar is the first ingredient and the product contains 50.1g sugar per 100g, or 13.8g per 27g sachet. It was not found in the Healthier Choice Symbol database.

🟢 Dicalcium phosphate is permitted by SFA.  [check_sfa_additive]
🟢 Disodium phosphate is permitted by SFA.  [check_sfa_additive]
🟢 This is a powdered drink mix rather than a ready-to-drink beverage, so Nutri-Grade was not applicable here.  [label]
🟡 Generic terms such as “flavourings” and the unclear “fibre (pyrophosphate)” wording are not specific enough to confirm exact additive identities from the image alone.  [label]
🟡 The product was not found in the Healthier Choice Symbol database.  [check_hcs]
🟡 Saturated fat is 1.2g per 27g sachet (0.5g per 100g listed on the label panel image).  [label]
🔴 Sugar is the first ingredient on the label.  [label]
🔴 Total sugars are 50.1g per 100g and 13.8g per 27g sachet, which is high for a small single-serve drink mix.  [label]

Recommendation: Fine as an occasional sachet drink if convenience matters, but not the best everyday choice if you are trying to reduce sugar. If you drink MILO often, consider using plain MILO powder with your own milk and less sugar, or choose a lower-sugar version.

Кіт для разработкі агентаў Google (ADK)

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

async def check_sfa_additive(additive: str, e_number_hint: str = "") -> dict:
    """Check whether a food additive is permitted under Singapore Food Agency rules.

    Looks the additive up in the full SFA permitted-additives list (parsed from
    the official SFA PDF). Accepts either an E-number or a plain-English name as
    printed on a Singapore label.

    Args:
        additive: An E-number ('E211', 'e211', 'en:e211') OR an additive name
            ('Sodium Benzoate', 'Soy Lecithin', 'MSG').
        e_number_hint: Optional E/INS number for when you pass a name. If the
            name isn't recognised but the number is, the mapping is REMEMBERED
            so the name resolves directly next time.

    Returns:
        dict with the input, resolved e_number/name, permitted status, schedule
        and any consumer note. found=False if it is not in the SFA list.
    """
    ...
adk-demo/
  sg_nutrition_investigator/
    __init__.py      # from . import agent
    agent.py         # tools + root_agent
  main.py            # standalone Runner + InMemorySessionService
root_agent = LlmAgent(
    name="sg_nutrition_investigator",
    model=LiteLlm(model="openai/" + GEMINI_MODEL, api_base=BASE_URL, api_key=API_KEY),
    instruction=INSTRUCTION,
    tools=[FunctionTool(recall_product), FunctionTool(check_sfa_additive),
           FunctionTool(check_hcs), FunctionTool(calculate_nutri_grade)],
)
# image input — the cleanest of the three:
message = types.Content(role="user", parts=[
    types.Part(text="Investigate this nutrition label."),
    types.Part.from_bytes(data=Path(image_path).read_bytes(), mime_type=mime),
])
sausheong adk-demo % uv run python main.py ../milo.jpeg

Investigating image: ../milo.jpeg
────────────────────────────────────────────────────────────
  → tool: recall_product({'product_name': 'Nestle MILO 3 in 1'})
  → tool: check_sfa_additive({'e_number_hint': 'E341', 'additive': 'Dicalcium Phosphate'})
  → tool: check_sfa_additive({'additive': 'Disodium Phosphate', 'e_number_hint': 'E339'})
  → tool: check_sfa_additive({'additive': 'Ferric Pyrophosphate'})
  → tool: check_hcs({'product_name': 'Nestle MILO 3 in 1'})
  → tool: calculate_nutri_grade({'saturated_fat_per_100ml': 0.5, 'sugar_per_100ml': 6.1})
## Reasoning

We investigated the label of **Nestle MILO 3 in 1 (with Activ-Go)**. Here is our step-by-step analysis:

1. **Product Categorisation & Reconstitution**:
   * This is a dry beverage powder sold in single-serving 27g sachets.
   * The nutritional information panel provides two columns: "Per Serving 27g" (the dry sachet) and "Per 100ml*" (as reconstituted by adding 200ml of hot water).
   * For the **Singapore Nutri-Grade** system, the grading is calculated based on the beverage *as reconstituted* according to the directions.

2. **Sugar & Saturated Fat Analysis (Per 100ml prepared)**:
   * **Total Sugars**: **6.1g per 100ml** (of which 4.8g is Added Sugar).
   * **Saturated Fat**: **0.5g per 100ml**.
   * Feeding these values into the Nutri-Grade calculator yields **Nutri-Grade C** (due to the sugar content being > 5g/100ml). Grade C beverages are classified as "less healthy" and must display the Nutri-Grade label at retail.

3. **Ingredients & Additives Analysis**:
   * **Sugar is the #1 Ingredient**: Refined sugar is listed first on the ingredients list, meaning it is the largest ingredient by weight in this packet—even ahead of malt extract and milk powder.
   * **Additives**:
     * **Dicalcium Phosphate** (E341(ii)) and **Disodium Phosphate** (E339(ii)) are SFA-approved food additives used as stabilizers and emulsifiers.
     * **Ferric Pyrophosphate** is an SFA-approved mineral nutrient used to fortify the drink with Iron.
   * **Healthier Choice Symbol (HCS)**: The packet displays the red HCS logo. This is because it is formulated to be "25% lower in sugar" *compared to regular malted beverages*. However, in absolute terms, it still carries enough sugar to land in Nutri-Grade C.

---

## Verdict

### 🟢 Green Findings
* **Fortified with Vitamins & Minerals** `[label]`: Contains B-vitamins (B2, B3, B6, B12), Vitamin C, Vitamin D, Calcium, and Iron (via *Ferric Pyrophosphate* `[check_sfa_additive]`).
* **Contains Soluble Fibre** `[label]`: Features *Resistant Dextrin*, a prebiotic soluble dietary fibre (1.1g per serving) that supports gut health.
* **SFA-Approved Additives** `[check_sfa_additive]`: Phosphates used for stabilizing and emulsifying (*Dicalcium Phosphate* and *Disodium Phosphate*) are fully permitted.
* **Healthier Choice Certified** `[check_hcs]`: Carries Singapore's HCS logo for having at least 25% less sugar than standard malted chocolate drinks.

### 🟡 Amber Findings
* **Nutri-Grade C** `[calculate_nutri_grade]`: When prepared as instructed, it gets a **Grade C** because of its **6.1g of sugar per 100ml**. Grade C drinks are in the "less healthy" bracket.
* **Contains Palm Oil** `[label]`: Palm oil is added to give a rich mouthfeel, contributing **1.2g of saturated fat per serving** (0.5g/100ml).

### 🔴 Red Findings
* **Sugar is the Main Ingredient** `[label]`: Sugar is listed as the very first ingredient on the label, which means there is more plain sugar by weight than malt extract (*PROTOMALT*) or milk powder.
* **High Sugar Load per Cup** `[label]`: A single small 27g sachet contains **13.8g of total sugar** (equivalent to about **3 teaspoons of sugar**), of which **10.8g** (approx. 2.5 teaspoons) is added refined sugar. Drinking multiple cups a day can quickly max out your recommended daily limit for added sugars.

Выкананне самаста

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

cd openai-demo        # or claude-demo, or adk-demo
uv run python main.py ../milo.jpeg
uv run python main.py ../hl.jpeg

Адходжанне за межы адночасовага выканання

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

Што дае кожны SDK і чаго не дае

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

Нехай.

Што не хапіцца ў SDK?

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

То які SDK трэба вжыць?

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

Заключэнне

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

Чэрніц кантролю эксплуатацыі

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Стадзіяй 33 з адаптавання системы будзе працаваць краща, якшо ёй стварыце меркаваную базу. Запісайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваце сферу дзейнасці.

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

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

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

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