Fix unmanaged reconciliation review blockers

Co-authored-by: genichin <4282227+genichin@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-09-13 02:21:37 +00:00
committed by GitHub
co-authored by genichin
parent f9284d1de8
commit 591db7adb7
26 changed files with 484 additions and 87 deletions
+58 -2
View File
@@ -12,6 +12,7 @@ Subcommands:
sync — sync slot qty to broker ground truth (direct-DB; REQ-105)
verify — re-check C-case reconcile-warning (direct-DB; REQ-106)
unmanaged list — query durable unmanaged-position lifecycle state
unmanaged audit — inspect lifecycle/operator audit trail for one symbol
unmanaged record — record explicit operator disposition + evidence reference
ledger backfill — evidence-backed historical ledger recovery
ledger skips list — query durable skipped-ledger records
@@ -38,6 +39,7 @@ LedgerWriter path, and resolves matching durable skipped-ledger records.
from __future__ import annotations
import argparse
import getpass
import json as _json
import logging
import re
@@ -78,6 +80,14 @@ def _resolve_instance(args) -> str:
return topology.DEFAULT_INSTANCE_KEY
def _operator_actor() -> str:
try:
username = getpass.getuser().strip()
except Exception: # noqa: BLE001
username = ""
return f"cli:{username or 'unknown'}"
# --------------------------------------------------------------------------- #
# default transport-backed RPC (overridable in tests)
# --------------------------------------------------------------------------- #
@@ -659,6 +669,13 @@ def _build_parser() -> argparse.ArgumentParser:
p_unmanaged_list.add_argument("--symbol", default=None)
_add_common(p_unmanaged_list)
p_unmanaged_audit = p_unmanaged_sub.add_parser(
"audit",
help="Show lifecycle/operator audit trail for one unmanaged position",
)
p_unmanaged_audit.add_argument("symbol")
_add_common(p_unmanaged_audit)
p_unmanaged_record = p_unmanaged_sub.add_parser(
"record",
help="Record an explicit operator disposition for an unmanaged position",
@@ -670,7 +687,6 @@ def _build_parser() -> argparse.ArgumentParser:
)
p_unmanaged_record.add_argument("--evidence-ref", required=True)
p_unmanaged_record.add_argument("--note", default="")
p_unmanaged_record.add_argument("--actor", default="operator")
_add_common(p_unmanaged_record)
p_ledger = sub.add_parser(
@@ -1040,6 +1056,44 @@ def _cmd_unmanaged_list(args, cfg) -> int:
return 0
def _cmd_unmanaged_audit(args, cfg) -> int:
from trex_core.adapters.portfolio.unmanaged_position_store import (
PostgreSQLUnmanagedPositionStore,
)
instance = _resolve_instance(args)
store = PostgreSQLUnmanagedPositionStore(cfg.dsn)
state = store.get_state(instance_key=instance, symbol=args.symbol)
if state is None:
_fail(
f"unmanaged position not found: instance={instance} symbol={args.symbol}",
args.json,
)
return 1
audit = store.list_audit(instance_key=instance, symbol=args.symbol)
payload = {
"instance_key": instance,
"symbol": args.symbol,
"state": state,
"audit": audit,
}
if args.json:
_emit(payload, as_json=True)
else:
print(
f"instance={instance} symbol={args.symbol} lifecycle={state['lifecycle_state']} "
f"entries={len(audit)}"
)
for row in audit:
print(
f" {row['event_type']}\tat={row['recorded_at']}\t"
f"quantity={row.get('quantity')}\taction={row.get('action') or '-'}\t"
f"actor={row.get('actor') or '-'}\tevidence_ref={row.get('evidence_ref') or '-'}\t"
f"note={row.get('note') or '-'}"
)
return 0
def _cmd_unmanaged_record(args, cfg) -> int:
from trex_core.adapters.portfolio.unmanaged_position_store import (
PostgreSQLUnmanagedPositionStore,
@@ -1051,7 +1105,7 @@ def _cmd_unmanaged_record(args, cfg) -> int:
symbol=args.symbol,
action=args.action,
evidence_ref=args.evidence_ref,
actor=args.actor,
actor=_operator_actor(),
note=args.note,
)
if state is None:
@@ -1536,6 +1590,8 @@ def main(argv: list[str] | None = None, *, rpc=None, confirm=None) -> int:
return _cmd_verify(args, cfg)
if args.cmd == "unmanaged" and getattr(args, "unmanaged_cmd", None) == "list":
return _cmd_unmanaged_list(args, cfg)
if args.cmd == "unmanaged" and getattr(args, "unmanaged_cmd", None) == "audit":
return _cmd_unmanaged_audit(args, cfg)
if args.cmd == "unmanaged" and getattr(args, "unmanaged_cmd", None) == "record":
return _cmd_unmanaged_record(args, cfg)