fix: preserve sell event routing owner

This commit is contained in:
Hermes Agent
2026-09-20 20:34:00 +09:00
parent 3f6a967aa1
commit c66acf6e47
20 changed files with 766 additions and 32 deletions
+60 -2
View File
@@ -65,7 +65,7 @@ class ProgrammableBroker:
return None
def _wire(broker, *, stale_sec=None):
def _wire(broker, *, stale_sec=None, event_emitter=None):
repo = InMemorySlotRepository()
svc = SlotService(repo)
intents = IntentService(svc, repo, InMemoryIntentStore(),
@@ -74,7 +74,7 @@ def _wire(broker, *, stale_sec=None):
ledger = InMemoryLedger()
execution = ExecutionService(
svc, repo, broker, ledger_outbox=outbox,
stale_pending_threshold_sec=stale_sec,
stale_pending_threshold_sec=stale_sec, event_emitter=event_emitter,
)
writer = LedgerWriter(outbox, ledger)
repo.reconcile_universe("default", {"PF-1": "SYM"})
@@ -104,6 +104,64 @@ def test_full_external_cancel_returns_slot_to_holding():
assert r.rolled_back == 1
def test_zero_fill_cancel_preserves_owner_for_ownerless_resell():
broker = ProgrammableBroker()
repo, _svc, intents, execution, _ledger, _writer = _wire(broker)
sid = _buy_to_holding(intents, execution)
assert sid is not None
intents.submit_sell(SellIntent(
intent_id="s-owner-1", slot_id=sid, sell_strategy_id="SELL-B",
))
broker.responder = lambda side: FillStatus(state="cancelled")
execution.run_once()
holding = repo.fetch_slot(sid)
assert holding is not None
assert holding.status is SlotState.HOLDING
assert holding.sell_strategy_id == "SELL-B"
intents.submit_sell(SellIntent(intent_id="s-owner-2", slot_id=sid))
pending = repo.fetch_slot(sid)
assert pending is not None
assert pending.status is SlotState.PENDING_SELL
assert pending.sell_strategy_id == "SELL-B"
def test_partial_sell_cancel_routes_with_sell_owner_and_preserves_it():
emitted: list[tuple[str, str | None]] = []
def emitter(event_type, _slot, owner=None):
emitted.append((event_type, owner))
broker = ProgrammableBroker()
repo, _svc, intents, execution, _ledger, _writer = _wire(
broker, event_emitter=emitter,
)
sid = _buy_to_holding(intents, execution)
assert sid is not None
intents.submit_sell(SellIntent(
intent_id="s-partial-owner", slot_id=sid, sell_strategy_id="SELL-B",
))
broker.balance["005930"] = 6
broker.responder = lambda side: FillStatus(
state="partially_filled",
filled_qty=4,
avg_price=1100.0,
execution_id="exec-partial-owner",
cancelled=True,
)
execution.run_once()
holding = repo.fetch_slot(sid)
assert holding is not None
assert holding.status is SlotState.HOLDING
assert holding.sell_strategy_id == "SELL-B"
assert ("slot_filled_sell", "SELL-B") in emitted
def test_unresolved_poll_observability_is_sanitized_and_deduplicated(caplog):
broker = ProgrammableBroker()
repo, _svc, intents, execution, _ledger, _writer = _wire(broker)