AWS Builder 工作坊

使用 Kiro 建置:他加祿語 卡片的文法與發音補強管線工作坊

工作坊系列

對象: 正在建置內容補強管線與教育工具的專業開發者
時間: 2 小時
主要 AWS AI 服務: Kiro
專案輸出: 一個由 Kiro 引導的 deterministic 補強管線,為 他加祿語 卡片加入文法拆解與發音指引。

工作坊摘要

他加祿語 Kiro 工作坊

本工作坊帶領開發者為 他加祿語 卡片補強文法筆記與發音支援。參與者使用 Kiro 定義 deterministic 邊界、建立詞彙表、產生輔助文字、修補結構化內容或 HTML,並驗證覆蓋率。練習強調可審查的語言輔助:自動化可以準備說明,但面向學習者的文法、發音指引與例句仍需人工把關,才能清楚、準確、一致且實用。

工作坊目標

開發者會建置一條管線,用來擷取 他加祿語 句子、加入文法說明、產生發音指引、修補 HTML 或結構化卡片資料,並驗證覆蓋率。

2 小時議程

時間 模組 開發者成果
0–10 分鐘 Kiro 設定 已建立 steering 與 spec
10–25 分鐘 補強合約 定義 helper 輸出格式
25–45 分鐘 詞彙表 建立本機詞彙定義
45–65 分鐘 發音 加入 curated map 與 fallback
65–90 分鐘 HTML 修補 補強額外例句區塊
90–110 分鐘 驗證 檢查缺少的 span 與 section
110–120 分鐘 Hook 與審查 自動化檢查並建立交接

步驟 1 — 建立補強邊界的 Kiro steering

開發者操作

  1. 在 Kiro 中產生 steering 文件。
  2. 加入補強流程專用規則。
  3. 請 Kiro 判斷哪些部分應該 deterministic,哪些部分需要人工審查。
  4. 在撰寫 script 前先提交 steering。

Kiro 提示範例

為 他加祿語 文法與發音補強管線建立 steering 文件。請使用 deterministic Python helper、主題詞彙表、發音對照表、fallback 規則、BeautifulSoup 修補、驗證檢查,以及母語人士審查提醒。

系統設計決策

  1. 在寫程式前明確定義步驟 1 — 建立補強邊界的 Kiro steering: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
  2. 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
  3. 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。

程式碼範例 — .kiro/steering/enrichment.md

# 補強 Steering

- 文法與發音補強必須保持 deterministic。
- 已知字詞使用詞彙表 dictionaries。
- 常見字詞使用發音 maps。
- 未知字詞使用透明的 fallback 規則。
- 補強期間不得重寫 他加祿語 句子。
- Helper 輸出在母語人士審查前標記為 draft。
- 每次批次處理後列印驗證計數。

程式碼說明

  • 商業邏輯: Steering 檔案定義補強範圍與品質期待。
  • 程式碼邏輯: Kiro 產生 script、測試、hook 與文件時,會把此檔案當作持續存在的脈絡。
  • 預期結果: Kiro 產生的補強程式碼應保留 他加祿語 句子,並加入可審查的輔助區塊。

步驟 2 — 建立本機文法詞彙表

開發者操作

  1. 建立 glossary.py
  2. 加入常見字詞與活動常用外來詞。
  3. 加入透明的 fallback 行為。
  4. 請 Kiro 產生詞彙表測試。

Kiro 提示範例

建立一個適合初學者的 他加祿語 詞彙表模組。包含 po、opo、saan、ang、paki、puwede、salamat、tubig、bayad、workshop、badge、registration、volunteer。回傳簡短說明,並為未知字詞提供 fallback 文字。

系統設計決策

  1. 在寫程式前明確定義步驟 2 — 建立本機文法詞彙表: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
  2. 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
  3. 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。

程式碼範例 — glossary.py

import re

DEFINITIONS = {
    "po": "politeness marker used to show respect",
    "opo": "polite form of yes",
    "saan": "where; asks for a place or direction",
    "ang": "focus marker before the main noun or idea",
    "paki": "please; softens a request",
    "puwede": "may or can",
    "salamat": "thank you",
    "tubig": "water",
    "bayad": "payment",
    "workshop": "English loanword used locally for a workshop session",
    "registration": "English loanword used for event check-in"
}

def token_key(word):
    return re.sub(r"[^a-zA-ZñÑáéíóúÁÉÍÓÚ]", "", word).lower()

def explain_word(word):
    key = token_key(word)
    return DEFINITIONS.get(key, f"needs review; useful local word: {word}")

def grammar_breakdown(sentence):
    seen = set()
    output = []
    for word in sentence.split():
        key = token_key(word)
        if key and key not in seen:
            seen.add(key)
            output.append((word.strip(".,?!"), explain_word(word)))
    return output[:6]

程式碼說明

  • 商業邏輯: 詞彙表會為已知字詞產生一致的初學者文法筆記,並為未知字詞產生透明的 fallback 筆記。
  • 程式碼邏輯: 它會正規化 token、查詢字典、避免重複,並最多回傳六個字詞說明。
  • 預期結果: 呼叫 grammar_breakdown('Saan po ang registration?') 會回傳 Saan、po、ang 與 registration 的說明。

步驟 3 — 使用 curated 與 fallback 規則產生發音

開發者操作

  1. 建立 pronunciation.py
  2. 為高頻字詞加入 curated 發音。
  3. 為未知字詞加入母音 fallback。
  4. 請 Kiro 測試已知與未知 token。

Kiro 提示範例

為 他加祿語 卡片建立發音 helper。常見字詞使用 curated 發音,未知字詞使用透明的 fallback 規則。請回傳完整發音指引與字詞層級 chunks。

系統設計決策

  1. 在寫程式前明確定義步驟 3 — 使用 curated 與 fallback 規則產生發音: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
  2. 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
  3. 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。

程式碼範例 — pronunciation.py

import re

PRON = {"salamat": "sah-lah-maht", "po": "poh", "saan": "sah-ahn", "kayo": "kah-yoh", "tubig": "too-beeg", "bayad": "bah-yahd", "pumasok": "poo-mah-sohk"}
VOWELS = {"a": "ah", "e": "eh", "i": "ee", "o": "oh", "u": "oo"}

def clean(word):
    return re.sub(r"[^a-zA-ZñÑ]", "", word).lower()

def fallback(word):
    return "".join(VOWELS.get(ch, ch) for ch in clean(word)) or word

def pronounce_word(word):
    return PRON.get(clean(word), fallback(word))

def pronunciation_guide(sentence):
    chunks = [(w.strip(".,?!"), pronounce_word(w)) for w in sentence.split() if clean(w)]
    return {"full": " ".join(sound for _, sound in chunks), "chunks": chunks}

程式碼說明

  • 商業邏輯: Helper 會替每一句 他加祿語 句子提供可練習的發音指引。
  • 程式碼邏輯: 已知字詞使用 curated 值;未知字詞使用母音 fallback;輸出同時包含完整形式與 chunk 形式。
  • 預期結果: 呼叫 pronunciation_guide('Paki-check po kung pumasok ang bayad.') 會回傳可讀的發音指引與字詞 chunks。

步驟 4 — 加入詞彙表覆蓋率報告

開發者操作

  1. 掃描所有 他加祿語 句子。
  2. 統計已知與未知 token。
  3. 匯出高頻未知字詞。
  4. 請 Kiro 建議詞彙表新增項目,並交由審查者核准。

Kiro 提示範例

建立詞彙表覆蓋率報告。掃描 他加祿語 句子、統計詞彙表中找不到的字詞、依頻率排序未知 token,並匯出 JSON 報告供審查者核准。未經審查前,不要自動新增定義。

系統設計決策

  1. 在寫程式前明確定義步驟 4 — 加入詞彙表覆蓋率報告: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
  2. 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
  3. 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。

程式碼範例 — glossary_coverage.py

import json
from collections import Counter
from glossary import DEFINITIONS, token_key

def coverage_report(sentences, output="glossary-coverage.json"):
    unknown = Counter()
    total = 0
    for sentence in sentences:
        for word in sentence.split():
            key = token_key(word)
            if not key:
                continue
            total += 1
            if key not in DEFINITIONS:
                unknown[key] += 1
    payload = {"totalTokens": total, "knownDefinitionCount": len(DEFINITIONS), "unknownTokenCount": sum(unknown.values()), "topUnknown": unknown.most_common(30)}
    with open(output, "w", encoding="utf-8") as file:
        json.dump(payload, file, indent=2, ensure_ascii=False)
    return payload

程式碼說明

  • 商業邏輯: 報告會告訴開發者與審查者哪些詞彙缺口最重要。
  • 程式碼邏輯: 它會將句子 token 化、把正規化 token 與詞彙表 key 比對、統計未知字詞,並寫出 JSON 輸出。
  • 預期結果: 執行報告後會產生一份已排序的未知 token 清單,審查者可核准後續定義。

額外動手開發實驗

這些實驗是 工作坊 5 — 文法與發音補強管線 的專屬內容。它們會用詞彙表治理、發音信心度、修補來源追蹤、審查者匯出與回歸檢查,延伸 deterministic 補強流程。重點是補強品質,而不是一般 workspace 設定。

動手實驗 A — 為審查治理加入詞彙表決策狀態

開發者操作

  • 請 Kiro 將詞彙表從簡單的定義 map 擴充成可審查記錄。
  • 加入 approvedneeds-reviewblocked 決策狀態。
  • 更新 explain_word,讓 blocked 字詞不會產生面向學習者的說明。
  • 為已核准、未知與封鎖的詞彙表項目產生測試。

Kiro 提示範例

將詞彙表重構為可審查的 glossary records。
每筆記錄應包含 definition、partOfSpeech、decisionState、reviewerNote 與 lastReviewedAt。
Approved 項目可以出現在學習者輸出中。
Needs-review 項目應標記為 draft。
Blocked 項目應排除在面向學習者的文法筆記之外。
請為所有 decision state 建立測試。

系統設計決策

  • 詞彙表治理能保護學習者輸出: 文法說明是教學內容,所以字詞定義不只需要文字,也需要審查狀態。
  • Blocked 項目必須 fail closed: 如果審查者封鎖某個說明,補強管線應略過它或安全標示,而不是直接發布。
  • 結構化記錄支援未來審查工具: 固定記錄格式可匯出為 CSV、交由母語人士審查,再匯入管線。

程式碼範例 — glossary_records.py

from dataclasses import dataclass, asdict
from typing import Literal

DecisionState = Literal["approved", "needs-review", "blocked"]

@dataclass(frozen=True)
class GlossaryRecord:
    term: str
    definition: str
    partOfSpeech: str
    decisionState: DecisionState = "needs-review"
    reviewerNote: str = "Needs native-speaker review."
    lastReviewedAt: str | None = None

GLOSSARY: dict[str, GlossaryRecord] = {
    "po": GlossaryRecord(
        term="po",
        definition="politeness marker used to show respect",
        partOfSpeech="particle",
        decisionState="approved",
        reviewerNote="Common beginner-safe explanation.",
        lastReviewedAt="2026-06-01"
    ),
    "bayad": GlossaryRecord(
        term="bayad",
        definition="payment",
        partOfSpeech="noun",
        decisionState="needs-review"
    )
}

def learner_definition(term: str) -> dict:
    record = GLOSSARY.get(term.lower())
    if record is None:
        return {"term": term, "definition": "needs review", "decisionState": "needs-review"}
    if record.decisionState == "blocked":
        return {"term": record.term, "definition": "blocked from learner output", "decisionState": "blocked"}
    return asdict(record)

程式碼說明

  • 商業邏輯: 記錄模型會區分已核准的學習內容、草稿說明與 blocked 說明。
  • 程式碼邏輯: GlossaryRecord 儲存審查 metadata,learner_definition 則依決策狀態回傳安全輸出。
  • 預期結果: 補強流程可以持續進行,同時清楚標記哪些詞彙筆記已核准、仍是草稿或已被封鎖。

動手實驗 B — 加入發音信心度與審查者旗標

開發者操作

  • 請 Kiro 將信心度 metadata 加入發音輸出。
  • 將 curated 發音標記為 high 信心度,將 fallback 發音標記為 low 信心度。
  • 匯出低信心度 token 供審查。
  • 加入驗證門檻,限制可接受的低信心度 token 比例上限。

Kiro 提示範例

為發音 helper 加入發音信心度。
Curated map 項目應回傳 confidence high。
Fallback 項目應回傳 confidence low,且 reviewRequired 為 true。
請依頻率建立低信心度 token 報告。
如果超過 25% 的 token 發音為 low confidence,驗證應失敗。

系統設計決策

  • Fallback 輸出應保持透明: Fallback 發音有助於覆蓋率,但不應看起來和 curated 指引一樣可信。
  • 信心度支援優先排序: 審查者可以先處理高頻且低信心度的 token。
  • 門檻讓品質可衡量: 當太多輸出依賴 fallback 規則時,管線可以讓驗證失敗。

程式碼範例 — pronunciation_confidence.py

import re
from collections import Counter

PRON = {"salamat": "sah-lah-maht", "po": "poh", "saan": "sah-ahn"}
VOWELS = {"a": "ah", "e": "eh", "i": "ee", "o": "oh", "u": "oo"}


def clean(word: str) -> str:
    return re.sub(r"[^a-zA-ZñÑ]", "", word).lower()


def fallback(word: str) -> str:
    return "".join(VOWELS.get(ch, ch) for ch in clean(word)) or word


def pronounce_token(word: str) -> dict:
    key = clean(word)
    if key in PRON:
        return {"word": word, "sound": PRON[key], "confidence": "high", "reviewRequired": False}
    return {"word": word, "sound": fallback(word), "confidence": "low", "reviewRequired": True}


def low_confidence_report(sentences: list[str]) -> dict:
    low = Counter()
    total = 0
    for sentence in sentences:
        for word in sentence.split():
            result = pronounce_token(word)
            if clean(word):
                total += 1
            if result["confidence"] == "low":
                low[clean(word)] += 1
    return {"totalTokens": total, "lowConfidenceTokens": sum(low.values()), "topLowConfidence": low.most_common(20)}

程式碼說明

  • 商業邏輯: 發音輸出現在會告訴審查者哪些指引是 curated,哪些需要審查。
  • 程式碼邏輯: Helper 會回傳結構化 token metadata,以及低信心度字詞的排序報告。
  • 預期結果: 補強管線可以產生完整發音覆蓋,同時優先安排人工審查。

動手實驗 C — 為每張已修補卡片加入補強來源追蹤

開發者操作

  • 請 Kiro 為每張已補強卡片標記 pipeline version、source file、card ID 與補強時間戳記。
  • 將 provenance 呈現為隱藏註解或結構化 JSON sidecar。
  • 加入驗證,確認每張已補強卡片都有 provenance。
  • 產生 diff 報告,列出新補強的卡片。

Kiro 提示範例

為 HTML 修補加入補強 provenance。
每張被文法或發音修補的卡片,都要記錄 cardId、sourceFile、enrichmentVersion、enrichedAt、grammarTermCount 與 pronunciationTokenCount。
請將 provenance 寫入 enrichment-provenance.json,並驗證每張已修補卡片都出現在其中。

系統設計決策

  • 修補需要可追蹤性: 當 HTML 在產生後被修改,開發者需要知道哪個 script 改了哪張卡片。
  • Sidecar 檔案避免 UI 雜訊: 審查者與開發者可以檢查 provenance,而不會干擾面向學習者的頁面。
  • 版本化支援回歸審查: 當 enrichment version 改變時,可以觸發受影響卡片的精準審查。

程式碼範例 — enrichment_provenance.py

from datetime import datetime, timezone
import json
from pathlib import Path

ENRICHMENT_VERSION = "grammar-pron-v1"


def provenance_record(card_id: str, source_file: str, grammar_terms: int, pronunciation_tokens: int) -> dict:
    return {
        "cardId": card_id,
        "sourceFile": source_file,
        "enrichmentVersion": ENRICHMENT_VERSION,
        "enrichedAt": datetime.now(timezone.utc).isoformat(),
        "grammarTermCount": grammar_terms,
        "pronunciationTokenCount": pronunciation_tokens
    }


def write_provenance(records: list[dict], path: str = "enrichment-provenance.json") -> None:
    ordered = sorted(records, key=lambda item: (item["sourceFile"], item["cardId"]))
    Path(path).write_text(json.dumps(ordered, indent=2, ensure_ascii=False), encoding="utf-8")

程式碼說明

  • 商業邏輯: Provenance 讓工作坊後的補強修補仍可稽核。
  • 程式碼邏輯: 記錄會排序以產生穩定 diff,並以 UTF-8 JSON 寫出。
  • 預期結果: 審查者可以把每個文法或發音區塊追溯回來源檔案與管線版本。

動手實驗 D — 建立文法筆記長度與可讀性驗證器

開發者操作

  • 請 Kiro 為初學者文法筆記建立可讀性規則。
  • 將每個定義限制為短片語或短句。
  • 除非已核准,否則標記包含進階術語的筆記。
  • 匯出失敗項目,包含 card ID、term 與 reason。

Kiro 提示範例

建立一個適合初學者文法筆記的驗證器。
每個 definition 最多 18 個英文單字。
除非 allowAdvanced 為 true,否則標記 enclitic、absolutive、ergative、morphosyntax、aspect 等進階術語。
請回傳 JSON failures,欄位包含 cardId、term、definition 與 reason。

系統設計決策

  • 初學者可讀性可以測試: 文法筆記可以用機械方式檢查長度與進階術語。
  • 驗證器能補足人工審查: Script 會在審查者花時間處理細節前,先抓出明顯過於複雜的內容。
  • Allowlist 保留彈性: 當進階筆記被明確核准時,仍可以存在。

程式碼範例 — validate_grammar_notes.py

ADVANCED_TERMS = {"enclitic", "absolutive", "ergative", "morphosyntax", "aspect"}


def word_count(text: str) -> int:
    return len([part for part in text.split() if part.strip()])


def validate_note(card_id: str, term: str, definition: str, allow_advanced: bool = False) -> list[dict]:
    failures = []
    if word_count(definition) > 18:
        failures.append({"cardId": card_id, "term": term, "reason": "definition too long"})
    lowered = definition.lower()
    if not allow_advanced:
        blocked = sorted(word for word in ADVANCED_TERMS if word in lowered)
        if blocked:
            failures.append({"cardId": card_id, "term": term, "reason": f"advanced terminology: {', '.join(blocked)}"})
    return failures

程式碼說明

  • 商業邏輯: 驗證器會讓 helper 文字維持適合初學者。
  • 程式碼邏輯: 它會檢查字數與被封鎖的進階術語,並回傳結構化失敗項目。
  • 預期結果: 過長或過度技術性的文法筆記會在發布前被標記。

動手實驗 E — 為 HTML 修補建立補強 snapshot 測試

開發者操作

  • 請 Kiro 建立一個只含一張卡片的小型 fixture HTML 檔案。
  • 針對 fixture 執行 patcher。
  • Assert 文法、發音、審查筆記與 provenance 標記都存在。
  • 除非 patcher 本來就對版面敏感,否則避免做整頁 snapshot。

Kiro 提示範例

為 HTML enrichment patcher 建立回歸測試。
使用一個只含一張卡片與一個 Natural 他加祿語 span 的小型 fixture。
修補後,請 assert 文法拆解、發音指引、草稿審查筆記與卡片 provenance marker 都存在。
不要比對整份 HTML 文件。

系統設計決策

  • Patcher 很容易被破壞: 一個小小的 selector 變更,就可能讓補強內容悄悄不再出現。
  • 精準 assertion 可降低脆弱度: 測試應保護必要區塊,而不是因為無害的格式變更而失敗。
  • Fixture-driven 測試會記錄假設: 未來開發者可以看見預期的 HTML 形狀。

程式碼範例 — tests/test_enrichment_patch.py

from bs4 import BeautifulSoup


def add_enrichment(html_text: str) -> str:
    soup = BeautifulSoup(html_text, "html.parser")
    card = soup.select_one(".sentence-card")
    grammar = soup.new_tag("section", **{"class": "grammar-breakdown"})
    grammar.string = "Grammar breakdown: draft"
    pronunciation = soup.new_tag("section", **{"class": "pronunciation-guide"})
    pronunciation.string = "Pronunciation guide: draft"
    card.append(grammar)
    card.append(pronunciation)
    card.append(soup.new_string("\n<!-- enrichmentVersion: grammar-pron-v1 -->\n"))
    return str(soup)


def test_patcher_adds_required_enrichment_sections():
    html = "<article class='sentence-card'><span lang='tl'>Saan po?</span></article>"
    patched = add_enrichment(html)
    assert "grammar-breakdown" in patched
    assert "pronunciation-guide" in patched
    assert "enrichmentVersion: grammar-pron-v1" in patched

程式碼說明

  • 商業邏輯: 測試會保護產生卡片中的必要補強區塊。
  • 程式碼邏輯: 最小 fixture 會被修補,並用精準 assertion 檢查。
  • 預期結果: Selector 或 patcher 回歸會在完整批次執行前被發現。

動手實驗 F — 為補強決策匯出審查者 packet

開發者操作

  • 請 Kiro 將詞彙表缺口、低信心度發音與過長文法筆記合併成一份審查者 packet。
  • 同時寫出 JSON 與 CSV 輸出。
  • 包含 suggestedAction 值,例如 approve-definitionfix-pronunciationshorten-note
  • 依 action type 加入摘要統計。

Kiro 提示範例

建立 enrichment reviewer packet。
合併 glossary unknowns、low-confidence pronunciation tokens 與 grammar-note readability failures。
匯出 enrichment-review-packet.json 與 enrichment-review-packet.csv。
每一列都應包含 issueType、tokenOrTerm、exampleSentence、frequency、suggestedAction 與 reviewerDecision。

系統設計決策

  • 審查者 packet 可降低審查摩擦: 單一 artifact 比分散的 console output 更容易審查。
  • Suggested action 讓 triage 更快: 審查者可以核准、修正、封鎖或要求重寫,而不必解讀原始驗證 log。
  • 空白 reviewerDecision 保留人工權限: 管線只準備工作項目,不宣稱已完成最終核准。

程式碼範例 — review_packet.py

import csv
import json
from collections import Counter
from pathlib import Path

COLUMNS = ["issueType", "tokenOrTerm", "exampleSentence", "frequency", "suggestedAction", "reviewerDecision"]


def write_review_packet(rows: list[dict], json_path="enrichment-review-packet.json", csv_path="enrichment-review-packet.csv") -> dict:
    summary = Counter(row["suggestedAction"] for row in rows)
    payload = {"summary": dict(summary), "items": rows}
    Path(json_path).write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8")
    with open(csv_path, "w", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=COLUMNS)
        writer.writeheader()
        for row in rows:
            writer.writerow({column: row.get(column, "") for column in COLUMNS})
    return {"json": json_path, "csv": csv_path, "summary": dict(summary)}

程式碼說明

  • 商業邏輯: 審查者 packet 會把補強問題轉成可審查工作項目。
  • 程式碼邏輯: 它會寫出穩定的 JSON 與 CSV 輸出,並摘要 suggested actions。
  • 預期結果: 母語人士與課程審查者可以從同一份整合 packet 開始工作。

參考架構備註

  • 本工作坊強調的 Kiro 能力:補強 steering、deterministic 詞彙表記錄、發音信心度報告、HTML 修補 provenance、驗證產生、fixture-based 回歸測試,以及 reviewer-packet 文件。
  • 產品範圍:為 他加祿語 學習卡片提供文法與發音 helper 文字。Helper 輸出在 他加祿語 母語人士審查前都維持 draft。
  • 執行範圍:先建立本機 Python 補強管線。之後可選擇加入自動化,在封裝靜態學習 artifact 前於 CI 執行相同 validators。