Skip to content

Commit 17a95a3

Browse files
heehoclaude
andcommitted
feat(daemon): P1-04 auto-verify aggregator hook + --auto-verify CLI flag
place_order submit_state="submitted" 직후 normalized.auto_verify=True 일 때 self.verify_order({"mutation_id": mutation_id}) 1회 호출 → response.data 에 verification_state + verify_snapshot 추가. verify 실패(MutationDomainError) 시에는 data.auto_verify_error = {code, message} 만 추가하고 ok=True 유지 (submit 은 이미 성공했으므로 boundary). validate_place_order_params 가 params.auto_verify (bool, 디폴트 False) 를 수용하여 normalized dict 에 포함. CLI 측 place-order --auto-verify flag 추가 (action_store_true). 디폴트 OFF — financier-v2 SKILL 측 60s verify 폴링과 중복 회피. 27 tests PASS (test_submit_runtime + test_submit_contract + test_cli_bootstrap). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 47d0314 commit 17a95a3

3 files changed

Lines changed: 23 additions & 6 deletions

File tree

src/toss_browser_bridge/cli.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ def main() -> None:
129129
place_order.add_argument("--preview-fingerprint", required=True)
130130
place_order.add_argument("--confirm", action="store_true")
131131
place_order.add_argument("--confirm-text", required=True)
132+
place_order.add_argument("--auto-verify", action="store_true")
132133
verify_order = sub.add_parser("verify-order")
133134
verify_order.add_argument("--mutation-id", required=True)
134135

@@ -181,6 +182,7 @@ def main() -> None:
181182
"preview_fingerprint": args.preview_fingerprint,
182183
"confirm": args.confirm,
183184
"confirm_text": args.confirm_text,
185+
"auto_verify": args.auto_verify,
184186
}
185187
elif args.command == "verify-order":
186188
params = {"mutation_id": args.mutation_id}

src/toss_browser_bridge/daemon.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,18 +1298,30 @@ def place_order(self, params: dict[str, Any]) -> dict[str, Any]:
12981298
verification_state="pending",
12991299
broker_ack=broker_ack,
13001300
)
1301+
1302+
data: dict[str, Any] = {
1303+
"mutation_id": mutation_id,
1304+
"submit_state": submit_state,
1305+
"verification_state": "pending",
1306+
"broker_ack": broker_ack,
1307+
}
1308+
if normalized.get("auto_verify") and submit_state == "submitted":
1309+
try:
1310+
verify_payload = self.verify_order({"mutation_id": mutation_id})
1311+
except MutationDomainError as exc:
1312+
data["auto_verify_error"] = {"code": exc.code, "message": exc.message}
1313+
else:
1314+
verify_data = verify_payload.get("data") or {}
1315+
data["verification_state"] = verify_data.get("verification_state") or "pending"
1316+
if "verify_snapshot" in verify_data:
1317+
data["verify_snapshot"] = verify_data["verify_snapshot"]
13011318
return {
13021319
"ok": True,
13031320
"kind": "place_order",
13041321
"source": SOURCE,
13051322
"checked_at": broker_context.checked_at,
13061323
"capability": "order_submit_ready",
1307-
"data": {
1308-
"mutation_id": mutation_id,
1309-
"submit_state": submit_state,
1310-
"verification_state": "pending",
1311-
"broker_ack": broker_ack,
1312-
},
1324+
"data": data,
13131325
"diagnostics": {
13141326
"endpoint_matrix": broker_context.endpoint_matrix,
13151327
"last_errors": broker_context.last_errors,

src/toss_browser_bridge/submit.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,14 @@ def validate_place_order_params(params: dict[str, Any]) -> dict[str, Any]:
279279
if confirm_text != confirm_phrase:
280280
raise MutationValidationError("confirm_text does not match the canonical confirm phrase", code="submit_blocked")
281281

282+
auto_verify = bool(params.get("auto_verify") or False)
283+
282284
return {
283285
"preview_receipt": receipt,
284286
"preview_fingerprint": preview_fingerprint,
285287
"confirm_phrase": confirm_phrase,
286288
"confirm_phrase_hash": build_confirm_phrase_hash(confirm_phrase),
289+
"auto_verify": auto_verify,
287290
}
288291

289292

0 commit comments

Comments
 (0)