Context
Karvi 深度整合(karvi#766, karvi#767)將開始 harvest decisions/lessons/events 到 Edda。需要在 Edda 側驗證三個 endpoint 都能正確處理 Karvi 的呼叫模式。
What Needs to Happen
1. POST /api/decide(karvi#766)
- Karvi 送
{ "decision": "runtime.spawn=cmd.exe", "reason": "verified in #598" }
- 驗證:event 寫入 ledger.db,auto-supersede 同 key 的舊 decision
- 回傳:
{ "event_id": "evt_...", "superseded": "evt_..." | null }
2. POST /api/note(karvi#766)
- Karvi 送
{ "text": "[GH-598] spawn fix pattern", "role": "system", "tags": ["auto-harvest", "lesson"] }
- 驗證:event 寫入 ledger.db with tags
- 回傳:
{ "event_id": "evt_..." }
3. POST /api/events/karvi(karvi#767)
- Karvi 送
{ "version": "karvi.event.v1", "event_id": "karvi-GH-598-plan-0", "event_type": "step_completed", "occurred_at": "...", "task_id": "GH-598", "step_id": "GH-598:plan" }
- 驗證:idempotent — 同 event_id 重送回 200 +
status: "duplicate"
- 回傳:
{ "event_id": "...", "status": "created" | "duplicate" }
4. 整合 smoke test
- 連續送 decide → note → events/karvi,確認都寫入成功
edda ask "runtime" 能查到剛寫的 decision
Definition of Done
Smoke Test
# 1. Decide
curl -X POST http://localhost:3463/api/decide \
-H "Content-Type: application/json" \
-d '{"decision":"test.harvest=works","reason":"integration test"}'
# 2. Note
curl -X POST http://localhost:3463/api/note \
-H "Content-Type: application/json" \
-d '{"text":"test harvest note","role":"system","tags":["auto-harvest","test"]}'
# 3. Karvi event
curl -X POST http://localhost:3463/api/events/karvi \
-H "Content-Type: application/json" \
-d '{"version":"karvi.event.v1","event_id":"karvi-test-001","event_type":"step_completed","occurred_at":"2026-03-20T12:00:00Z","task_id":"T-test","step_id":"T-test:plan"}'
# 4. Query back
curl "http://localhost:3463/api/decisions?q=test.harvest"
References
Decomposed from fagemx/karvi planning pack by plan-decompose
Context
Karvi 深度整合(karvi#766, karvi#767)將開始 harvest decisions/lessons/events 到 Edda。需要在 Edda 側驗證三個 endpoint 都能正確處理 Karvi 的呼叫模式。
What Needs to Happen
1. POST /api/decide(karvi#766)
{ "decision": "runtime.spawn=cmd.exe", "reason": "verified in #598" }{ "event_id": "evt_...", "superseded": "evt_..." | null }2. POST /api/note(karvi#766)
{ "text": "[GH-598] spawn fix pattern", "role": "system", "tags": ["auto-harvest", "lesson"] }{ "event_id": "evt_..." }3. POST /api/events/karvi(karvi#767)
{ "version": "karvi.event.v1", "event_id": "karvi-GH-598-plan-0", "event_type": "step_completed", "occurred_at": "...", "task_id": "GH-598", "step_id": "GH-598:plan" }status: "duplicate"{ "event_id": "...", "status": "created" | "duplicate" }4. 整合 smoke test
edda ask "runtime"能查到剛寫的 decisionDefinition of Done
edda ask "runtime"回傳包含 harvest 的 decisionSmoke Test
References
crates/edda-serve/src/lib.rs:1602-1823Decomposed from fagemx/karvi planning pack by plan-decompose