PR G: portal /transactions page + 12-state machine view #11
Reference in New Issue
Block a user
Delete Branch "devin/1776876388-portal-transactions"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements step 8 from the architecture gap-analysis — the first portal page backed by the CurrenciCombo orchestrator (PR A–F). Stacks on the live Solace portal branch (PR #2), not on the orchestrator branches, because this is a frontend-only change.
What lands
Routes
GET /transactions— list of recent plans. Columns: Plan ID, State (chip), Instrument hint, Owner, Updated,›.GET /transactions/:planId— detail view with three cards:from_state → to_state, actor, actor_role (SoD chip), reason, timestamp. Straight from thestate_transitionstable introduced by PR A.eventstable introduced by PR D. Demonstrates the hash chain visually.Backend wiring —
src/services/orchestrator.tslistPlans()→GET /api/plansgetPlanState(id)→GET /api/plans/:id/stategetPlanEvents(id)→GET /api/plans/:id/eventsprobeOrchestrator()→GET /healthWhen
VITE_ORCHESTRATOR_URLis unset (orchestrator not yet deployed), every call returns deterministic demo data so the 12-state view and audit trail still render. Matches howproxmox/dbisCorealready degrade. Each card gets aLIVE/DEGRADED/DEMObadge so it is obvious which is which.UI chrome
backendCatalogso the existing DashboardBackendStatusBarpicks it up automatically (LIVEwhenVITE_ORCHESTRATOR_URLis set,MOCKEDotherwise).CSS
All new styles appended to
src/index.cssunder a clearly-labelled/transactions page (PR G)block — no existing rules changed. Covers state-pill grid, source badges, state chips, role chips, portal table rows.Out of scope
/eventsonce on mount. Adding anEventSourcesubscription is a follow-up.listPlans()returns whatever the orchestrator returns — no page-size negotiation yet.Verification
UI verification of the three cards + demo-data fallback will be performed in test mode after merge (or by a reviewer locally).
Series order
A → B → C → D → E → F → G → H.
Base:
devin/1776532671-solace-bank-portal(the live-portal branch, PR #2). Diff here is G-only.Test report —
/transactionspageRan live against a local Vite build at
http://127.0.0.1:5173with orchestrator intentionally unset (theDEMOfallback — only exercisable path until orchestrator ships). 2 tests, 14 sub-assertions, all passed./transactionslist view — passed/transactions/demo-pay-014detail (12-state grid + audit trail + signed event stream) — passedAdversarial DOM-assertion check (click to expand)
Headline adversarial check: the
PARTIALLY_EXECUTEDpill must bependingand notvisited(demo transitions never entered that state). A brokenvisitedset would fail here. It passed, along with all other 11 pill-class checks.Audit row spot-checks (all OK):
∅ → DRAFT/ops.bob/submitter/plan createdREADY_FOR_PREPARE → PREPARED/ops.chen/approver/approve — prepare (SoD)VALIDATING → COMMITTED/ops.eve/validator/reconciled + committed (SoD)Event stream spot-checks (all OK):
demo-sig-0000, prev_hash∅state.committedCaveats:
DEMOpath is exercisable today (orchestrator not deployed).LIVE/DEGRADEDbranches are wired identically in code but not verified end-to-end.Session: https://app.devin.ai/sessions/a33f9ebe303d413aab86e04252a1b4a1
Adds the first portal page backed by the CurrenciCombo orchestrator (PR A-F). Renders: - /transactions \u2014 list of recent plans with state chip, instrument hint, owner, last-updated. - /transactions/:planId \u2014 detail view with three cards: 1. 12-state machine grid highlighting current + visited states. 2. Audit trail table: from\u2192to, actor, actor_role (SoD), reason, timestamp \u2014 straight from state_transitions. 3. Signed event stream: id, type, signature, prev_hash, at \u2014 straight from events (PR D). Backend wiring (src/services/orchestrator.ts): - listPlans() GET /api/plans - getPlanState(id) GET /api/plans/:id/state - getPlanEvents(id) GET /api/plans/:id/events - probeOrchestrator() GET /health If VITE_ORCHESTRATOR_URL is unset (orchestrator not deployed yet), every call returns deterministic demo data so the 12-state view and audit trail still render. Mirrors how proxmox/dbisCore fall back. Badge on every card shows LIVE / DEGRADED / DEMO. Also registers the orchestrator in backendCatalog so the existing BackendStatusBar on the Dashboard picks it up automatically. PortalLayout gets a new 'Transactions' nav item (GitBranch icon). Portal code from PR #2 is untouched except for the new route + nav entry.07d47e726eto0bda0b76f1