| name | aibdd-form-activity |
| description | 將上游 `/aibdd-flows-specify` 產出的 Activity modeling elements 逐一翻譯成 `.activity` DSL,寫入檔案並執行語法驗證。 |
| metadata | {"user-invocable":false,"source":"project-level dogfooding"} |
aibdd-form-activity
Formulation skill。只負責把 /aibdd-flows-specify 的 02-activity-analyze 已完成的 Activity modeling elements 轉成 .activity 語法;不重新判斷 actor 合法性、action 顆粒度、reuse、operation partition、或需求語意。
§1 REFERENCES
| ID | Path | Phase scope | Purpose |
|---|
| R1 | aibdd-core::ssot/spec-package-paths.md | global | kickoff boundary-aware path SSOT |
| R2 | references/role-and-contract.md | Phase 1 | caller payload schema + role boundary |
| R3 | references/format-reference.md | Phase 2 | Activity element → .activity syntax mapping |
| R4 | scripts/decoder.py | Phase 4 | .activity DSL decoder(同時為 SKILL.md Phase 4 syntax validator 與 BDD subject;spec SSOT = scripts/tests/activity-decode.feature + scripts/tests/activity-benchmark.feature) |
§2 SOP
Phase 1 — ASSERT intake|驗證 caller payload
produces: $$payload, $$target_path, $$format, $$activity
$contract = READ references/role-and-contract.md
$$payload = READ caller payload
$$target_path = PARSE $$payload.target_path
$$format = PARSE $$payload.format
$reasoning = PARSE $$payload.reasoning
$$activity = PARSE $reasoning.activity_analysis.activity
$graph_gaps = PARSE $reasoning.activity_analysis.graph_gaps
$exit_status = PARSE $reasoning.activity_analysis.exit_status
$payload_ok = JUDGE $$payload against $contract
- ASSERT
$payload_ok
- ASSERT
$$target_path non-empty
- ASSERT
$$format == ".activity"
- ASSERT
$$activity.name non-empty
- ASSERT
$$activity.initial exists
- ASSERT count(
$$activity.finals) >= 1
- ASSERT every element in
$$activity.nodes is one of Action | Decision | Fork | Merge | Join
- ASSERT
$exit_status == "complete"
- ASSERT count(
$graph_gaps) == 0
Phase 2 — RENDER element by element|轉成 Activity DSL
produces: $$activity_doc
$syntax_map = READ references/format-reference.md
$header = RENDER [ACTIVITY] ${$$activity.name}
$actors = RENDER one [ACTOR] line per $$activity.actors[]
$initial = RENDER [INITIAL]
$node_lines = DERIVE empty line list
- LOOP per
$node in $$activity.nodes
6.1 BRANCH $node.type
ui_step | command | query:
6.1.1 $line = RENDER Action as [STEP:${$node.display_id}] @${actor.name} ${$node.name} {${$node.binds_feature}}
decision:
6.1.2 $line = RENDER Decision as [DECISION:${$node.display_id}] ${$node.condition}
6.1.3 $path_lines = RENDER every decision_path as [BRANCH:${$node.display_id}:${path.guard}]
fork:
6.1.4 $line = RENDER Fork as [FORK:${$node.display_id}]
6.1.5 $path_lines = RENDER every fork_path as [PARALLEL:${$node.display_id}]
merge:
6.1.6 $line = RENDER Merge as [MERGE:${$node.display_id}]
join:
6.1.7 $line = RENDER Join as [JOIN:${$node.display_id}]
6.2 $node_lines = DERIVE append $line and $path_lines
END LOOP
$finals = RENDER one [FINAL] line per $$activity.finals[]
$$activity_doc = RENDER .activity document from $header, $actors, $initial, $node_lines, and $finals
- ASSERT
$$activity_doc contains [ACTIVITY], [INITIAL], and [FINAL]
Phase 3 — WRITE artifact|寫入 Activity 檔
produces: $$written_paths
$target_exists = MATCH path_exists($$target_path)
- IF
$target_exists ∧ $$payload.mode != "overwrite":
2.1 $msg = DRAFT "path 衝突:target_path 已存在,caller 需指定 mode=overwrite 或改 target_path"
2.2 RETURN $msg
- WRITE
$$target_path ← $$activity_doc
$$written_paths = DERIVE [$$target_path]
- ASSERT
$$target_path in $$written_paths
Phase 4 — VALIDATE syntax|語法驗證
produces: $$validation_report
$validator = COMPUTE scripts/decoder.py
$validation_out = TRIGGER python3 ${$validator} ${$$target_path}
$$validation_report = PARSE $validation_out, schema=activity-syntax-validation-report
- ASSERT
$$validation_report.ok == true
Phase 5 — RETURN report|回傳 caller 訊號
produces: $$report
$$report = DRAFT report JSON ← {status: "completed", target_path: $$target_path, written_paths: $$written_paths, syntax_valid: $$validation_report.ok, validation_report: $$validation_report}
- RETURN
$$report
§3 FAILURE & FALLBACK
Phase 1 fail handling
- IF caller payload 完全空: RETURN "empty payload — caller misuse"
- IF
target_path 未指定: RETURN "target_path missing"
- IF
format != ".activity": RETURN "format unsupported"
- IF
reasoning.activity_analysis.activity 缺失: RETURN "activity modeling elements missing"
Phase 2 fail handling
- IF Activity element 無法映射到
.activity tag: RETURN element formulation error
- IF Actor reference 無法 resolve 成 actor name: RETURN actor reference error
Phase 3 fail handling
- IF WRITE IO 失敗: RETURN IO error to caller
- IF
target_path 已存在且 mode != overwrite: RETURN path conflict
Phase 4 fail handling
- IF validator exit != 0: RETURN syntax validation report to caller
- IF validator JSON parse 失敗: RETURN validator protocol error
Phase 5 fail handling
- IF RETURN 失敗(caller 已斷線): WRITE
${$$target_path}.report ← $$report
§4 CROSS-REFERENCES
- 由上游
/aibdd-flows-specify(flow/activity modeling)DELEGATE。
- 上游必須先完成 Activity modeling;本 skill 不補需求、不改顆粒度、不新增 model element。