[{"line":2,"elements":[{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":17429314,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:36.730Z","line":13,"name":"TC-01 — CRITICAL violation terminates CSP and deducts wallet","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-01-—-critical-violation-terminates-csp-and-deducts-wallet","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc01\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:18)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":4116978910,"status":"failed"},"line":18,"name":"I raise FPV for csp \"csp-fpv-mf-tc01\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc01\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"CRITICAL\"","offset":63},{"val":"\"WALLET\"","offset":89},{"val":"5000","offset":114}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":231039,"status":"skipped"},"line":19,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":154557,"status":"skipped"},"line":20,"name":"I resolve FPV for csp \"csp-fpv-mf-tc01\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc01\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":129909,"status":"skipped"},"line":21,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":108359,"status":"skipped"},"line":22,"name":"the enforcement posture state for \"csp-fpv-mf-tc01\" should be \"TERMINATED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc01\"","offset":34},{"val":"\"TERMINATED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":117749,"status":"skipped"},"line":23,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -29500 exists for \"csp-fpv-mf-tc01\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-29500","offset":58},{"val":"\"csp-fpv-mf-tc01\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":91206,"status":"skipped"},"line":24,"name":"the wallet balance for \"csp-fpv-mf-tc01\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc01\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":120550,"status":"skipped"},"line":25,"name":"the fpv hold status for \"csp-fpv-mf-tc01\" should be \"CONFIRMED_DEDUCTED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc01\"","offset":24},{"val":"\"CONFIRMED_DEDUCTED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-01"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":254615,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.056Z","line":28,"name":"TC-02 — Overflow floors wallet to zero; remainder goes to liability","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-02-—-overflow-floors-wallet-to-zero;-remainder-goes-to-liability","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc02\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 30000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:31)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":32012794,"status":"failed"},"line":31,"name":"I raise FPV for csp \"csp-fpv-mf-tc02\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 30000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc02\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"WARNING\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"30000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":216314,"status":"skipped"},"line":32,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":209599,"status":"skipped"},"line":33,"name":"I resolve FPV for csp \"csp-fpv-mf-tc02\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc02\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":192302,"status":"skipped"},"line":34,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":20051629,"status":"skipped"},"line":35,"name":"the wallet balance for \"csp-fpv-mf-tc02\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc02\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":204985,"status":"skipped"},"line":36,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -24500 exists for \"csp-fpv-mf-tc02\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-24500","offset":58},{"val":"\"csp-fpv-mf-tc02\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":146344,"status":"skipped"},"line":37,"name":"a liability ledger entry of type \"FPV_OVERFLOW\" with amount 2975500 exists for \"csp-fpv-mf-tc02\"","match":{"arguments":[{"val":"\"FPV_OVERFLOW\"","offset":33},{"val":"2975500","offset":60},{"val":"\"csp-fpv-mf-tc02\"","offset":79}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertLiabilityEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-02"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":276973,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.194Z","line":40,"name":"TC-03 — Raise on a TERMINATED CSP returns 409","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-03-—-raise-on-a-terminated-csp-returns-409","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-terminated\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:41)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":33157705,"status":"failed"},"line":41,"name":"I raise FPV for csp \"csp-fpv-mf-terminated\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-terminated\"","offset":20},{"val":"\"FRAUD\"","offset":52},{"val":"\"WARNING\"","offset":69},{"val":"\"WALLET\"","offset":94},{"val":"5000","offset":119}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":253916,"status":"skipped"},"line":42,"name":"the response status is 409","match":{"arguments":[{"val":"409","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":146832,"status":"skipped"},"line":43,"name":"the error code is \"CSP_ALREADY_TERMINATED\"","match":{"arguments":[{"val":"\"CSP_ALREADY_TERMINATED\"","offset":18}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertErrorCode(java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-03"},{"name":"@p0"},{"name":"@negative"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":292411,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.280Z","line":46,"name":"TC-04 — Resolve with no active investigation returns 404","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-04-—-resolve-with-no-active-investigation-returns-404","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/resolve\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(FpvMoneyFlowSteps.java:67)\n\tat ✽.I resolve FPV for csp \"csp-fpv-mf-tc04\" with decision \"CONFIRM_VIOLATION\"(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:47)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":29638863,"status":"failed"},"line":47,"name":"I resolve FPV for csp \"csp-fpv-mf-tc04\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc04\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":214442,"status":"skipped"},"line":48,"name":"the response status is 404","match":{"arguments":[{"val":"404","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":151671,"status":"skipped"},"line":49,"name":"the error code is \"INVESTIGATION_NOT_FOUND\"","match":{"arguments":[{"val":"\"INVESTIGATION_NOT_FOUND\"","offset":18}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertErrorCode(java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-04"},{"name":"@p0"},{"name":"@negative"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":367242,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.364Z","line":52,"name":"TC-05 — NO_VIOLATION releases hold with no wallet deduction","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-05-—-no-violation-releases-hold-with-no-wallet-deduction","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc05\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 20000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:53)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":21286535,"status":"failed"},"line":53,"name":"I raise FPV for csp \"csp-fpv-mf-tc05\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 20000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc05\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"WARNING\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"20000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":985939,"status":"skipped"},"line":54,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":142675,"status":"skipped"},"line":55,"name":"I resolve FPV for csp \"csp-fpv-mf-tc05\" with decision \"NO_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc05\"","offset":22},{"val":"\"NO_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":129128,"status":"skipped"},"line":56,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":14725793,"status":"skipped"},"line":57,"name":"the fpv hold status for \"csp-fpv-mf-tc05\" should be \"RELEASED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc05\"","offset":24},{"val":"\"RELEASED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":210421,"status":"skipped"},"line":60,"name":"no wallet ledger entry of type \"FPV_DEDUCTION\" exists for \"csp-fpv-mf-tc05\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":31},{"val":"\"csp-fpv-mf-tc05\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertNoWalletLedgerEntry(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":153943,"status":"skipped"},"line":61,"name":"the wallet balance for \"csp-fpv-mf-tc05\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc05\"","offset":23},{"val":"50000","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-05"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":239806,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.465Z","line":64,"name":"TC-06 — Overflow floors wallet to zero; ₹100 to liability","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-06-—-overflow-floors-wallet-to-zero;-₹100-to-liability","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc06\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 60000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:67)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":36429452,"status":"failed"},"line":67,"name":"I raise FPV for csp \"csp-fpv-mf-tc06\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 60000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc06\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"WARNING\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"60000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":229004,"status":"skipped"},"line":68,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":96741,"status":"skipped"},"line":69,"name":"I resolve FPV for csp \"csp-fpv-mf-tc06\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc06\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":338025,"status":"skipped"},"line":70,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":127801,"status":"skipped"},"line":71,"name":"the wallet balance for \"csp-fpv-mf-tc06\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc06\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":110935,"status":"skipped"},"line":72,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -50000 exists for \"csp-fpv-mf-tc06\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-50000","offset":58},{"val":"\"csp-fpv-mf-tc06\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":119387,"status":"skipped"},"line":73,"name":"a liability ledger entry of type \"FPV_OVERFLOW\" with amount 5950000 exists for \"csp-fpv-mf-tc06\"","match":{"arguments":[{"val":"\"FPV_OVERFLOW\"","offset":33},{"val":"5950000","offset":60},{"val":"\"csp-fpv-mf-tc06\"","offset":79}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertLiabilityEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-06"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":215723,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.585Z","line":76,"name":"TC-07/08 — Wallet unchanged during hold; deducted after confirm","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-07/08-—-wallet-unchanged-during-hold;-deducted-after-confirm","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc0708\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:80)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":19433221,"status":"failed"},"line":80,"name":"I raise FPV for csp \"csp-fpv-mf-tc0708\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc0708\"","offset":20},{"val":"\"FRAUD\"","offset":48},{"val":"\"CRITICAL\"","offset":65},{"val":"\"WALLET\"","offset":91},{"val":"5000","offset":116}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":242213,"status":"skipped"},"line":81,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":148996,"status":"skipped"},"line":82,"name":"the wallet balance for \"csp-fpv-mf-tc0708\" should be 29500","match":{"arguments":[{"val":"\"csp-fpv-mf-tc0708\"","offset":23},{"val":"29500","offset":53}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":127674,"status":"skipped"},"line":83,"name":"I resolve FPV for csp \"csp-fpv-mf-tc0708\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc0708\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":56}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":3846629,"status":"skipped"},"line":84,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":118149,"status":"skipped"},"line":85,"name":"the wallet balance for \"csp-fpv-mf-tc0708\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc0708\"","offset":23},{"val":"0","offset":53}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":94343,"status":"skipped"},"line":86,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -29500 exists for \"csp-fpv-mf-tc0708\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-29500","offset":58},{"val":"\"csp-fpv-mf-tc0708\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":98986,"status":"skipped"},"line":87,"name":"the fpv hold status for \"csp-fpv-mf-tc0708\" should be \"CONFIRMED_DEDUCTED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc0708\"","offset":24},{"val":"\"CONFIRMED_DEDUCTED\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-07-08"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":253469,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.690Z","line":90,"name":"TC-09 — Liability cleared by next BASE_PAYOUT credit","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-09-—-liability-cleared-by-next-base-payout-credit","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-payment-settlement-service:8080/events/comp-connection-credit-issued\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.sendCompCredit(FpvMoneyFlowSteps.java:117)\n\tat ✽.I send comp-connection-credit-issued event with amount 30000 for csp \"csp-fpv-mf-tc09\"(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:91)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":29663534,"status":"failed"},"line":91,"name":"I send comp-connection-credit-issued event with amount 30000 for csp \"csp-fpv-mf-tc09\"","match":{"arguments":[{"val":"30000","offset":55},{"val":"\"csp-fpv-mf-tc09\"","offset":69}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.sendCompCredit(long,java.lang.String)"},"keyword":"When "},{"result":{"duration":220512,"status":"skipped"},"line":92,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":112014,"status":"skipped"},"line":93,"name":"a wallet ledger entry of type \"BASE_PAYOUT\" with amount 30000 exists for \"csp-fpv-mf-tc09\"","match":{"arguments":[{"val":"\"BASE_PAYOUT\"","offset":30},{"val":"30000","offset":56},{"val":"\"csp-fpv-mf-tc09\"","offset":73}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":97401,"status":"skipped"},"line":94,"name":"a wallet ledger entry of type \"LIABILITY_AUTO_ADJUST\" with amount -15500 exists for \"csp-fpv-mf-tc09\"","match":{"arguments":[{"val":"\"LIABILITY_AUTO_ADJUST\"","offset":30},{"val":"-15500","offset":66},{"val":"\"csp-fpv-mf-tc09\"","offset":84}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":86160,"status":"skipped"},"line":95,"name":"the wallet balance for \"csp-fpv-mf-tc09\" should be 14500","match":{"arguments":[{"val":"\"csp-fpv-mf-tc09\"","offset":23},{"val":"14500","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":126560,"status":"skipped"},"line":96,"name":"the liability running balance for \"csp-fpv-mf-tc09\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc09\"","offset":34},{"val":"0","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertLiabilityBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-09"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":239511,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.804Z","line":114,"name":"TC-12 — WARNING/DISINTERMEDIATION deducts exact amount","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-warning/<fpv-type>-deducts-exact-amount;;2","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-w-disint\" fpvType \"DISINTERMEDIATION\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:105)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":57404732,"status":"failed"},"line":105,"name":"I raise FPV for csp \"csp-fpv-mf-w-disint\" fpvType \"DISINTERMEDIATION\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-w-disint\"","offset":20},{"val":"\"DISINTERMEDIATION\"","offset":50},{"val":"\"WARNING\"","offset":79},{"val":"\"WALLET\"","offset":104},{"val":"5000","offset":129}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":240325,"status":"skipped"},"line":106,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":123439,"status":"skipped"},"line":107,"name":"I resolve FPV for csp \"csp-fpv-mf-w-disint\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-w-disint\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":109655,"status":"skipped"},"line":108,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":102182,"status":"skipped"},"line":109,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -20000 exists for \"csp-fpv-mf-w-disint\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-20000","offset":58},{"val":"\"csp-fpv-mf-w-disint\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":97984,"status":"skipped"},"line":110,"name":"the wallet balance for \"csp-fpv-mf-w-disint\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-w-disint\"","offset":23},{"val":"0","offset":55}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-12-14"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":284021,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:42.923Z","line":115,"name":"TC-13 — WARNING/SAFETY deducts exact amount","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-warning/<fpv-type>-deducts-exact-amount;;3","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-w-safety\" fpvType \"SAFETY\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 3000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:105)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":36561969,"status":"failed"},"line":105,"name":"I raise FPV for csp \"csp-fpv-mf-w-safety\" fpvType \"SAFETY\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 3000","match":{"arguments":[{"val":"\"csp-fpv-mf-w-safety\"","offset":20},{"val":"\"SAFETY\"","offset":50},{"val":"\"WARNING\"","offset":68},{"val":"\"WALLET\"","offset":93},{"val":"3000","offset":118}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":257061,"status":"skipped"},"line":106,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":131552,"status":"skipped"},"line":107,"name":"I resolve FPV for csp \"csp-fpv-mf-w-safety\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-w-safety\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":125042,"status":"skipped"},"line":108,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":181190,"status":"skipped"},"line":109,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -20000 exists for \"csp-fpv-mf-w-safety\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-20000","offset":58},{"val":"\"csp-fpv-mf-w-safety\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":107783,"status":"skipped"},"line":110,"name":"the wallet balance for \"csp-fpv-mf-w-safety\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-w-safety\"","offset":23},{"val":"0","offset":55}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-12-14"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":306105,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.007Z","line":116,"name":"TC-14 — WARNING/DATA_MISUSE deducts exact amount","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-warning/<fpv-type>-deducts-exact-amount;;4","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-w-data\" fpvType \"DATA_MISUSE\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 2000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:105)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":52594631,"status":"failed"},"line":105,"name":"I raise FPV for csp \"csp-fpv-mf-w-data\" fpvType \"DATA_MISUSE\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 2000","match":{"arguments":[{"val":"\"csp-fpv-mf-w-data\"","offset":20},{"val":"\"DATA_MISUSE\"","offset":48},{"val":"\"WARNING\"","offset":71},{"val":"\"WALLET\"","offset":96},{"val":"2000","offset":121}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":309991,"status":"skipped"},"line":106,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":124093,"status":"skipped"},"line":107,"name":"I resolve FPV for csp \"csp-fpv-mf-w-data\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-w-data\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":56}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":110597,"status":"skipped"},"line":108,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":116719,"status":"skipped"},"line":109,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -20000 exists for \"csp-fpv-mf-w-data\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-20000","offset":58},{"val":"\"csp-fpv-mf-w-data\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":102705,"status":"skipped"},"line":110,"name":"the wallet balance for \"csp-fpv-mf-w-data\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-w-data\"","offset":23},{"val":"0","offset":53}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-12-14"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":218941,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.101Z","line":138,"name":"TC-15 — SERIOUS/DISINTERMEDIATION suspends CSP, no deduction","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-serious/<fpv-type>-suspends-csp--no-deduction;;2","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-s-disint\" fpvType \"DISINTERMEDIATION\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:126)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandleStage(CompletableFuture.java:950)\n\tat java.base/java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:2372)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:238)\n\tat java.net.http/jdk.internal.net.http.Http1Exchange.sendHeadersAsync(Http1Exchange.java:312)\n\tat java.net.http/jdk.internal.net.http.Exchange.lambda$responseAsyncImpl0$8(Exchange.java:581)\n\tat java.net.http/jdk.internal.net.http.Exchange.checkFor407(Exchange.java:452)\n\tat java.net.http/jdk.internal.net.http.Exchange.lambda$responseAsyncImpl0$9(Exchange.java:585)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandleStage(CompletableFuture.java:950)\n\tat java.base/java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:2372)\n\tat java.net.http/jdk.internal.net.http.Exchange.responseAsyncImpl0(Exchange.java:585)\n\tat java.net.http/jdk.internal.net.http.Exchange.responseAsyncImpl(Exchange.java:428)\n\tat java.net.http/jdk.internal.net.http.Exchange.responseAsync(Exchange.java:420)\n\tat java.net.http/jdk.internal.net.http.MultiExchange.responseAsyncImpl(MultiExchange.java:435)\n\tat java.net.http/jdk.internal.net.http.MultiExchange.lambda$responseAsyncImpl$7(MultiExchange.java:477)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 25 more\n","duration":50246802,"status":"failed"},"line":126,"name":"I raise FPV for csp \"csp-fpv-mf-s-disint\" fpvType \"DISINTERMEDIATION\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-disint\"","offset":20},{"val":"\"DISINTERMEDIATION\"","offset":50},{"val":"\"SERIOUS\"","offset":79},{"val":"\"WALLET\"","offset":104},{"val":"5000","offset":129}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":247144,"status":"skipped"},"line":127,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":98424,"status":"skipped"},"line":128,"name":"I resolve FPV for csp \"csp-fpv-mf-s-disint\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-disint\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":102835,"status":"skipped"},"line":129,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":92437,"status":"skipped"},"line":130,"name":"the enforcement posture state for \"csp-fpv-mf-s-disint\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-disint\"","offset":34},{"val":"\"SUSPENDED\"","offset":66}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":77358,"status":"skipped"},"line":131,"name":"the wallet state for \"csp-fpv-mf-s-disint\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-disint\"","offset":21},{"val":"\"HOLD\"","offset":53}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":241836,"status":"skipped"},"line":132,"name":"no wallet ledger entry of type \"FPV_DEDUCTION\" exists for \"csp-fpv-mf-s-disint\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":31},{"val":"\"csp-fpv-mf-s-disint\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertNoWalletLedgerEntry(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":119189,"status":"skipped"},"line":133,"name":"the wallet balance for \"csp-fpv-mf-s-disint\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-disint\"","offset":23},{"val":"50000","offset":55}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":89110,"status":"skipped"},"line":134,"name":"the fpv hold status for \"csp-fpv-mf-s-disint\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-disint\"","offset":24},{"val":"\"ACTIVE\"","offset":56}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-15-18"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":281461,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.187Z","line":139,"name":"TC-16 — SERIOUS/FRAUD suspends CSP, no deduction","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-serious/<fpv-type>-suspends-csp--no-deduction;;3","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-s-fraud\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:126)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":41000311,"status":"failed"},"line":126,"name":"I raise FPV for csp \"csp-fpv-mf-s-fraud\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-fraud\"","offset":20},{"val":"\"FRAUD\"","offset":49},{"val":"\"SERIOUS\"","offset":66},{"val":"\"WALLET\"","offset":91},{"val":"5000","offset":116}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":222851,"status":"skipped"},"line":127,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":115057,"status":"skipped"},"line":128,"name":"I resolve FPV for csp \"csp-fpv-mf-s-fraud\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-fraud\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":57}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":99434,"status":"skipped"},"line":129,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":99218,"status":"skipped"},"line":130,"name":"the enforcement posture state for \"csp-fpv-mf-s-fraud\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-fraud\"","offset":34},{"val":"\"SUSPENDED\"","offset":65}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":101631,"status":"skipped"},"line":131,"name":"the wallet state for \"csp-fpv-mf-s-fraud\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-fraud\"","offset":21},{"val":"\"HOLD\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":91642,"status":"skipped"},"line":132,"name":"no wallet ledger entry of type \"FPV_DEDUCTION\" exists for \"csp-fpv-mf-s-fraud\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":31},{"val":"\"csp-fpv-mf-s-fraud\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertNoWalletLedgerEntry(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":185856,"status":"skipped"},"line":133,"name":"the wallet balance for \"csp-fpv-mf-s-fraud\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-fraud\"","offset":23},{"val":"50000","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":78311,"status":"skipped"},"line":134,"name":"the fpv hold status for \"csp-fpv-mf-s-fraud\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-fraud\"","offset":24},{"val":"\"ACTIVE\"","offset":55}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-15-18"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":262175,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.314Z","line":140,"name":"TC-17 — SERIOUS/SAFETY suspends CSP, no deduction","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-serious/<fpv-type>-suspends-csp--no-deduction;;4","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-s-safety\" fpvType \"SAFETY\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:126)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":22520714,"status":"failed"},"line":126,"name":"I raise FPV for csp \"csp-fpv-mf-s-safety\" fpvType \"SAFETY\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-safety\"","offset":20},{"val":"\"SAFETY\"","offset":50},{"val":"\"SERIOUS\"","offset":68},{"val":"\"WALLET\"","offset":93},{"val":"5000","offset":118}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":202240,"status":"skipped"},"line":127,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":3559184,"status":"skipped"},"line":128,"name":"I resolve FPV for csp \"csp-fpv-mf-s-safety\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-safety\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":193938,"status":"skipped"},"line":129,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":94801,"status":"skipped"},"line":130,"name":"the enforcement posture state for \"csp-fpv-mf-s-safety\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-safety\"","offset":34},{"val":"\"SUSPENDED\"","offset":66}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":91775,"status":"skipped"},"line":131,"name":"the wallet state for \"csp-fpv-mf-s-safety\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-safety\"","offset":21},{"val":"\"HOLD\"","offset":53}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":72565,"status":"skipped"},"line":132,"name":"no wallet ledger entry of type \"FPV_DEDUCTION\" exists for \"csp-fpv-mf-s-safety\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":31},{"val":"\"csp-fpv-mf-s-safety\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertNoWalletLedgerEntry(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":207693,"status":"skipped"},"line":133,"name":"the wallet balance for \"csp-fpv-mf-s-safety\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-safety\"","offset":23},{"val":"50000","offset":55}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":92047,"status":"skipped"},"line":134,"name":"the fpv hold status for \"csp-fpv-mf-s-safety\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-safety\"","offset":24},{"val":"\"ACTIVE\"","offset":56}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-15-18"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":260656,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.425Z","line":141,"name":"TC-18 — SERIOUS/DATA_MISUSE suspends CSP, no deduction","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-<tc-num>-—-serious/<fpv-type>-suspends-csp--no-deduction;;5","type":"scenario","keyword":"Scenario Outline","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-s-data\" fpvType \"DATA_MISUSE\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:126)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":26527345,"status":"failed"},"line":126,"name":"I raise FPV for csp \"csp-fpv-mf-s-data\" fpvType \"DATA_MISUSE\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-data\"","offset":20},{"val":"\"DATA_MISUSE\"","offset":48},{"val":"\"SERIOUS\"","offset":71},{"val":"\"WALLET\"","offset":96},{"val":"5000","offset":121}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":161126,"status":"skipped"},"line":127,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":91116,"status":"skipped"},"line":128,"name":"I resolve FPV for csp \"csp-fpv-mf-s-data\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-data\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":56}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":95741,"status":"skipped"},"line":129,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":89519,"status":"skipped"},"line":130,"name":"the enforcement posture state for \"csp-fpv-mf-s-data\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-data\"","offset":34},{"val":"\"SUSPENDED\"","offset":64}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":91029,"status":"skipped"},"line":131,"name":"the wallet state for \"csp-fpv-mf-s-data\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-data\"","offset":21},{"val":"\"HOLD\"","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":71255,"status":"skipped"},"line":132,"name":"no wallet ledger entry of type \"FPV_DEDUCTION\" exists for \"csp-fpv-mf-s-data\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":31},{"val":"\"csp-fpv-mf-s-data\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertNoWalletLedgerEntry(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":83987,"status":"skipped"},"line":133,"name":"the wallet balance for \"csp-fpv-mf-s-data\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-s-data\"","offset":23},{"val":"50000","offset":53}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":10649656,"status":"skipped"},"line":134,"name":"the fpv hold status for \"csp-fpv-mf-s-data\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-s-data\"","offset":24},{"val":"\"ACTIVE\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-15-18"},{"name":"@p0"},{"name":"@sweep"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":175884,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.535Z","line":146,"name":"TC-19 — NO_VIOLATION on CLOSED wallet releases hold safely","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-19-—-no-violation-on-closed-wallet-releases-hold-safely","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc19\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:147)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":43535611,"status":"failed"},"line":147,"name":"I raise FPV for csp \"csp-fpv-mf-tc19\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc19\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"WARNING\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"5000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":238694,"status":"skipped"},"line":148,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":125229,"status":"skipped"},"line":149,"name":"I resolve FPV for csp \"csp-fpv-mf-tc19\" with decision \"NO_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc19\"","offset":22},{"val":"\"NO_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":79169,"status":"skipped"},"line":150,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":77588,"status":"skipped"},"line":151,"name":"the fpv hold status for \"csp-fpv-mf-tc19\" should be \"RELEASED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc19\"","offset":24},{"val":"\"RELEASED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":72961,"status":"skipped"},"line":152,"name":"the wallet state for \"csp-fpv-mf-tc19\" should be \"CLOSED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc19\"","offset":21},{"val":"\"CLOSED\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":76221,"status":"skipped"},"line":153,"name":"the wallet balance for \"csp-fpv-mf-tc19\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc19\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-19"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":202849,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.626Z","line":156,"name":"TC-20 — SERIOUS on CLOSED wallet defers deduction safely","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-20-—-serious-on-closed-wallet-defers-deduction-safely","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc20\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:157)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":18412910,"status":"failed"},"line":157,"name":"I raise FPV for csp \"csp-fpv-mf-tc20\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc20\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"SERIOUS\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"5000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":272267,"status":"skipped"},"line":158,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":113626,"status":"skipped"},"line":159,"name":"I resolve FPV for csp \"csp-fpv-mf-tc20\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc20\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":73522,"status":"skipped"},"line":160,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":72633,"status":"skipped"},"line":161,"name":"the enforcement posture state for \"csp-fpv-mf-tc20\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc20\"","offset":34},{"val":"\"SUSPENDED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":78705,"status":"skipped"},"line":162,"name":"the wallet state for \"csp-fpv-mf-tc20\" should be \"CLOSED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc20\"","offset":21},{"val":"\"CLOSED\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":78197,"status":"skipped"},"line":163,"name":"the wallet balance for \"csp-fpv-mf-tc20\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc20\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":69236,"status":"skipped"},"line":164,"name":"the fpv hold status for \"csp-fpv-mf-tc20\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc20\"","offset":24},{"val":"\"ACTIVE\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-20"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":8677375,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.711Z","line":167,"name":"TC-21 — CRITICAL terminates CSP and deducts from reactivated wallet","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-21-—-critical-terminates-csp-and-deducts-from-reactivated-wallet","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc21\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:171)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":38471540,"status":"failed"},"line":171,"name":"I raise FPV for csp \"csp-fpv-mf-tc21\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc21\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"CRITICAL\"","offset":63},{"val":"\"WALLET\"","offset":89},{"val":"5000","offset":114}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":169383,"status":"skipped"},"line":172,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":177724,"status":"skipped"},"line":173,"name":"I resolve FPV for csp \"csp-fpv-mf-tc21\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc21\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":184201,"status":"skipped"},"line":174,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":122269,"status":"skipped"},"line":175,"name":"the enforcement posture state for \"csp-fpv-mf-tc21\" should be \"TERMINATED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc21\"","offset":34},{"val":"\"TERMINATED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":153736,"status":"skipped"},"line":176,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -50000 exists for \"csp-fpv-mf-tc21\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-50000","offset":58},{"val":"\"csp-fpv-mf-tc21\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":89617,"status":"skipped"},"line":177,"name":"the wallet balance for \"csp-fpv-mf-tc21\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc21\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":76893,"status":"skipped"},"line":178,"name":"the fpv hold status for \"csp-fpv-mf-tc21\" should be \"CONFIRMED_DEDUCTED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc21\"","offset":24},{"val":"\"CONFIRMED_DEDUCTED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-21"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":225740,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.819Z","line":181,"name":"TC-22 — Raise blocked after CSP termination — same 409 as TC-03","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-22-—-raise-blocked-after-csp-termination-—-same-409-as-tc-03","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc22-term\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:182)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":18321887,"status":"failed"},"line":182,"name":"I raise FPV for csp \"csp-fpv-mf-tc22-term\" fpvType \"FRAUD\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc22-term\"","offset":20},{"val":"\"FRAUD\"","offset":51},{"val":"\"WARNING\"","offset":68},{"val":"\"WALLET\"","offset":93},{"val":"5000","offset":118}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":177854,"status":"skipped"},"line":183,"name":"the response status is 409","match":{"arguments":[{"val":"409","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":87492,"status":"skipped"},"line":184,"name":"the error code is \"CSP_ALREADY_TERMINATED\"","match":{"arguments":[{"val":"\"CSP_ALREADY_TERMINATED\"","offset":18}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertErrorCode(java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-22"},{"name":"@p0"},{"name":"@negative"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":198774,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.891Z","line":189,"name":"TC-23 — OVERTURNED appeal reinstates suspended CSP (S3a)","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-23-—-overturned-appeal-reinstates-suspended-csp-(s3a)","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc23\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:192)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":8805334,"status":"failed"},"line":192,"name":"I raise FPV for csp \"csp-fpv-mf-tc23\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"SERIOUS\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"5000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":189693,"status":"skipped"},"line":193,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":99923,"status":"skipped"},"line":194,"name":"I resolve FPV for csp \"csp-fpv-mf-tc23\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":160693,"status":"skipped"},"line":195,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":74082,"status":"skipped"},"line":196,"name":"the enforcement posture state for \"csp-fpv-mf-tc23\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":34},{"val":"\"SUSPENDED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":62451,"status":"skipped"},"line":197,"name":"the wallet state for \"csp-fpv-mf-tc23\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":21},{"val":"\"HOLD\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":60652,"status":"skipped"},"line":198,"name":"the fpv hold status for \"csp-fpv-mf-tc23\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":24},{"val":"\"ACTIVE\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":58885,"status":"skipped"},"line":200,"name":"I submit contest via DB for csp \"csp-fpv-mf-tc23\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":32}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.submitContestViaDb(java.lang.String)"},"keyword":"When "},{"result":{"duration":59953,"status":"skipped"},"line":201,"name":"I decide contest for csp \"csp-fpv-mf-tc23\" with decision \"OVERTURNED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":25},{"val":"\"OVERTURNED\"","offset":57}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.decideContest(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":57993,"status":"skipped"},"line":202,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":58244,"status":"skipped"},"line":203,"name":"the enforcement posture state for \"csp-fpv-mf-tc23\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":34},{"val":"\"ACTIVE\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":59435,"status":"skipped"},"line":204,"name":"the fpv hold status for \"csp-fpv-mf-tc23\" should be \"RELEASED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":24},{"val":"\"RELEASED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":62572,"status":"skipped"},"line":205,"name":"the compensation posture for \"csp-fpv-mf-tc23\" should be \"COMP_STATE_FULL\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":29},{"val":"\"COMP_STATE_FULL\"","offset":57}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertCompensationPosture(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":58525,"status":"skipped"},"line":210,"name":"the wallet state for \"csp-fpv-mf-tc23\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":21},{"val":"\"ACTIVE\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":67294,"status":"skipped"},"line":211,"name":"the wallet balance for \"csp-fpv-mf-tc23\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc23\"","offset":23},{"val":"50000","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-23"},{"name":"@p0"},{"name":"@contest"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":719764,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:43.981Z","line":214,"name":"TC-24 — UPHELD appeal keeps CSP suspended (S3b)","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-24-—-upheld-appeal-keeps-csp-suspended-(s3b)","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc24\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:217)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":28410510,"status":"failed"},"line":217,"name":"I raise FPV for csp \"csp-fpv-mf-tc24\" fpvType \"FRAUD\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"SERIOUS\"","offset":63},{"val":"\"WALLET\"","offset":88},{"val":"5000","offset":113}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":227798,"status":"skipped"},"line":218,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":89406,"status":"skipped"},"line":219,"name":"I resolve FPV for csp \"csp-fpv-mf-tc24\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":77223,"status":"skipped"},"line":220,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":86151,"status":"skipped"},"line":221,"name":"the enforcement posture state for \"csp-fpv-mf-tc24\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":34},{"val":"\"SUSPENDED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":77323,"status":"skipped"},"line":222,"name":"the wallet state for \"csp-fpv-mf-tc24\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":21},{"val":"\"HOLD\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":66592,"status":"skipped"},"line":223,"name":"the fpv hold status for \"csp-fpv-mf-tc24\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":24},{"val":"\"ACTIVE\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":64561,"status":"skipped"},"line":225,"name":"I submit contest via DB for csp \"csp-fpv-mf-tc24\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":32}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.submitContestViaDb(java.lang.String)"},"keyword":"When "},{"result":{"duration":68015,"status":"skipped"},"line":226,"name":"I decide contest for csp \"csp-fpv-mf-tc24\" with decision \"UPHELD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":25},{"val":"\"UPHELD\"","offset":57}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.decideContest(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":76963,"status":"skipped"},"line":227,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":93830,"status":"skipped"},"line":228,"name":"the enforcement posture state for \"csp-fpv-mf-tc24\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":34},{"val":"\"SUSPENDED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":68450,"status":"skipped"},"line":231,"name":"the wallet state for \"csp-fpv-mf-tc24\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":21},{"val":"\"HOLD\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":73688,"status":"skipped"},"line":232,"name":"the fpv hold status for \"csp-fpv-mf-tc24\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":24},{"val":"\"ACTIVE\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":13741174,"status":"skipped"},"line":233,"name":"the wallet balance for \"csp-fpv-mf-tc24\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc24\"","offset":23},{"val":"50000","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-24"},{"name":"@p0"},{"name":"@contest"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":204879,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:44.100Z","line":238,"name":"TC-25 — CONFIRM_WITH_RECOVERY deducts and reinstates (S5)","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-25-—-confirm-with-recovery-deducts-and-reinstates-(s5)","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc25\" fpvType \"DISINTERMEDIATION\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:243)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":37916558,"status":"failed"},"line":243,"name":"I raise FPV for csp \"csp-fpv-mf-tc25\" fpvType \"DISINTERMEDIATION\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc25\"","offset":20},{"val":"\"DISINTERMEDIATION\"","offset":46},{"val":"\"WARNING\"","offset":75},{"val":"\"WALLET\"","offset":100},{"val":"5000","offset":125}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":207968,"status":"skipped"},"line":244,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":88257,"status":"skipped"},"line":245,"name":"I resolve FPV for csp \"csp-fpv-mf-tc25\" with decision \"CONFIRM_WITH_RECOVERY\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc25\"","offset":22},{"val":"\"CONFIRM_WITH_RECOVERY\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":211765,"status":"skipped"},"line":246,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":100922,"status":"skipped"},"line":247,"name":"the enforcement posture state for \"csp-fpv-mf-tc25\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc25\"","offset":34},{"val":"\"ACTIVE\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":65939,"status":"skipped"},"line":248,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -50000 exists for \"csp-fpv-mf-tc25\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-50000","offset":58},{"val":"\"csp-fpv-mf-tc25\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":64879,"status":"skipped"},"line":249,"name":"the wallet balance for \"csp-fpv-mf-tc25\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc25\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":66828,"status":"skipped"},"line":250,"name":"the fpv hold status for \"csp-fpv-mf-tc25\" should be \"CONFIRMED_DEDUCTED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc25\"","offset":24},{"val":"\"CONFIRMED_DEDUCTED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-25"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":230475,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:44.174Z","line":255,"name":"TC-26 — Higher-severity FPV supersedes active investigation (S8/EN-J1)","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-26-—-higher-severity-fpv-supersedes-active-investigation-(s8/en-j1)","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc26\" fpvType \"DISINTERMEDIATION\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 3000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:260)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":25973742,"status":"failed"},"line":260,"name":"I raise FPV for csp \"csp-fpv-mf-tc26\" fpvType \"DISINTERMEDIATION\" severity \"WARNING\" recoverySource \"WALLET\" estimatedAmount 3000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":20},{"val":"\"DISINTERMEDIATION\"","offset":46},{"val":"\"WARNING\"","offset":75},{"val":"\"WALLET\"","offset":100},{"val":"3000","offset":125}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":187237,"status":"skipped"},"line":261,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":80024,"status":"skipped"},"line":263,"name":"I raise FPV for csp \"csp-fpv-mf-tc26\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 10000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"CRITICAL\"","offset":63},{"val":"\"WALLET\"","offset":89},{"val":"10000","offset":114}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":80196,"status":"skipped"},"line":264,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":92934,"status":"skipped"},"line":265,"name":"the superseded investigation count for \"csp-fpv-mf-tc26\" should be 1","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":39},{"val":"1","offset":67}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertSupersededCount(java.lang.String,int)"},"keyword":"And "},{"result":{"duration":68057,"status":"skipped"},"line":267,"name":"I resolve FPV for csp \"csp-fpv-mf-tc26\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":69370,"status":"skipped"},"line":268,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":73278,"status":"skipped"},"line":269,"name":"the enforcement posture state for \"csp-fpv-mf-tc26\" should be \"TERMINATED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":34},{"val":"\"TERMINATED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":68565,"status":"skipped"},"line":270,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -50000 exists for \"csp-fpv-mf-tc26\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-50000","offset":58},{"val":"\"csp-fpv-mf-tc26\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":79243,"status":"skipped"},"line":271,"name":"the wallet balance for \"csp-fpv-mf-tc26\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":77267,"status":"skipped"},"line":272,"name":"the fpv hold status for \"csp-fpv-mf-tc26\" should be \"CONFIRMED_DEDUCTED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc26\"","offset":24},{"val":"\"CONFIRMED_DEDUCTED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-26"},{"name":"@p0"},{"name":"@supersede"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":216930,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:44.248Z","line":277,"name":"TC-27 — CRITICAL FPV during SUSPENDED terminates immediately (S9/EN-J2)","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-27-—-critical-fpv-during-suspended-terminates-immediately-(s9/en-j2)","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(FpvMoneyFlowSteps.java:56)\n\tat ✽.I raise FPV for csp \"csp-fpv-mf-tc27\" fpvType \"SAFETY\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:282)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":38089143,"status":"failed"},"line":282,"name":"I raise FPV for csp \"csp-fpv-mf-tc27\" fpvType \"SAFETY\" severity \"SERIOUS\" recoverySource \"WALLET\" estimatedAmount 5000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":20},{"val":"\"SAFETY\"","offset":46},{"val":"\"SERIOUS\"","offset":64},{"val":"\"WALLET\"","offset":89},{"val":"5000","offset":114}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":177132,"status":"skipped"},"line":283,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":66772,"status":"skipped"},"line":284,"name":"I resolve FPV for csp \"csp-fpv-mf-tc27\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":70247,"status":"skipped"},"line":285,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":66460,"status":"skipped"},"line":286,"name":"the enforcement posture state for \"csp-fpv-mf-tc27\" should be \"SUSPENDED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":34},{"val":"\"SUSPENDED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":64624,"status":"skipped"},"line":287,"name":"the wallet state for \"csp-fpv-mf-tc27\" should be \"HOLD\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":21},{"val":"\"HOLD\"","offset":49}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":65911,"status":"skipped"},"line":298,"name":"I raise FPV for csp \"csp-fpv-mf-tc27\" fpvType \"FRAUD\" severity \"CRITICAL\" recoverySource \"WALLET\" estimatedAmount 8000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":20},{"val":"\"FRAUD\"","offset":46},{"val":"\"CRITICAL\"","offset":63},{"val":"\"WALLET\"","offset":89},{"val":"8000","offset":114}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String,long)"},"keyword":"When "},{"result":{"duration":108205,"status":"skipped"},"line":299,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":84729,"status":"skipped"},"line":300,"name":"the enforcement posture state for \"csp-fpv-mf-tc27\" should be \"TERMINATED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":34},{"val":"\"TERMINATED\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":70188,"status":"skipped"},"line":301,"name":"a wallet ledger entry of type \"FPV_DEDUCTION\" with amount -50000 exists for \"csp-fpv-mf-tc27\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":30},{"val":"-50000","offset":58},{"val":"\"csp-fpv-mf-tc27\"","offset":76}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletLedgerEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":86531,"status":"skipped"},"line":302,"name":"a liability ledger entry of type \"FPV_OVERFLOW\" with amount 450000 exists for \"csp-fpv-mf-tc27\"","match":{"arguments":[{"val":"\"FPV_OVERFLOW\"","offset":33},{"val":"450000","offset":60},{"val":"\"csp-fpv-mf-tc27\"","offset":78}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertLiabilityEntry(java.lang.String,long,java.lang.String)"},"keyword":"And "},{"result":{"duration":77478,"status":"skipped"},"line":303,"name":"the wallet balance for \"csp-fpv-mf-tc27\" should be 0","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":23},{"val":"0","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "},{"result":{"duration":72424,"status":"skipped"},"line":304,"name":"the fpv hold status for \"csp-fpv-mf-tc27\" should be \"CONFIRMED_DEDUCTED\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc27\"","offset":24},{"val":"\"CONFIRMED_DEDUCTED\"","offset":52}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertFpvHoldStatus(java.lang.String,java.lang.String)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-27"},{"name":"@p0"}]},{"line":7,"name":"","description":"","type":"background","keyword":"Background","steps":[{"result":{"duration":190477,"status":"passed"},"line":8,"name":"QA bearer token is configured","match":{"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.requireBearerToken()"},"keyword":"Given "}]},{"start_timestamp":"2026-08-25T07:20:44.339Z","line":309,"name":"TC-28 — Non-quantifiable FPV (S11) — no deduction","description":"","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability;tc-28-—-non-quantifiable-fpv-(s11)-—-no-deduction","type":"scenario","keyword":"Scenario","steps":[{"result":{"error_message":"org.springframework.web.client.ResourceAccessException: I/O error on POST request for \"http://csp-enforcement-service:8080/api/enforcement/fpv/raise\": null\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:776)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:624)\n\tat org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:572)\n\tat org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:747)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:921)\n\tat org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:830)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.post(FpvMoneyFlowSteps.java:225)\n\tat io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseNonQuantifiableFpv(FpvMoneyFlowSteps.java:83)\n\tat ✽.I raise non-quantifiable FPV for csp \"csp-fpv-mf-tc28\" fpvType \"DATA_MISUSE\" severity \"WARNING\" recoverySource \"WALLET\"(file:///app/integration-tests/src/test/resources/features/fpv/fpv_money_flow.feature:311)\nCaused by: java.net.ConnectException\n\tat java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1065)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238)\n\tat java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)\n\tat java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)\n\tat java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n\tat java.base/java.lang.Thread.run(Thread.java:1583)\nCaused by: java.nio.channels.ClosedChannelException\n\tat java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202)\n\tat java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786)\n\tat java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:571)\n\tat java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212)\n\t... 9 more\n","duration":24339984,"status":"failed"},"line":311,"name":"I raise non-quantifiable FPV for csp \"csp-fpv-mf-tc28\" fpvType \"DATA_MISUSE\" severity \"WARNING\" recoverySource \"WALLET\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc28\"","offset":37},{"val":"\"DATA_MISUSE\"","offset":63},{"val":"\"WARNING\"","offset":86},{"val":"\"WALLET\"","offset":111}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.raiseNonQuantifiableFpv(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":180177,"status":"skipped"},"line":312,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":88454,"status":"skipped"},"line":313,"name":"I resolve FPV for csp \"csp-fpv-mf-tc28\" with decision \"CONFIRM_VIOLATION\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc28\"","offset":22},{"val":"\"CONFIRM_VIOLATION\"","offset":54}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.resolveFpv(java.lang.String,java.lang.String)"},"keyword":"When "},{"result":{"duration":77321,"status":"skipped"},"line":314,"name":"the response status is 200","match":{"arguments":[{"val":"200","offset":23}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertStatus(int)"},"keyword":"Then "},{"result":{"duration":77800,"status":"skipped"},"line":315,"name":"the enforcement posture state for \"csp-fpv-mf-tc28\" should be \"ACTIVE\"","match":{"arguments":[{"val":"\"csp-fpv-mf-tc28\"","offset":34},{"val":"\"ACTIVE\"","offset":62}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertPostureState(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":85791,"status":"skipped"},"line":316,"name":"no wallet ledger entry of type \"FPV_DEDUCTION\" exists for \"csp-fpv-mf-tc28\"","match":{"arguments":[{"val":"\"FPV_DEDUCTION\"","offset":31},{"val":"\"csp-fpv-mf-tc28\"","offset":58}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertNoWalletLedgerEntry(java.lang.String,java.lang.String)"},"keyword":"And "},{"result":{"duration":103987,"status":"skipped"},"line":317,"name":"the wallet balance for \"csp-fpv-mf-tc28\" should be 50000","match":{"arguments":[{"val":"\"csp-fpv-mf-tc28\"","offset":23},{"val":"50000","offset":51}],"location":"io.wiom.csp.e2e.bdd.steps.FpvMoneyFlowSteps.assertWalletBalance(java.lang.String,long)"},"keyword":"And "}],"tags":[{"name":"@fpv"},{"name":"@fpv-money-flow"},{"name":"@tc-fpv-28"},{"name":"@p0"}]}],"name":"FPV money flow — financial holds, deductions, overflow, and liability","description":"  Source: fpv-qa-signoff.html\n  APIs:   POST /api/enforcement/fpv/raise\n          POST /api/enforcement/fpv/resolve","id":"fpv-money-flow-—-financial-holds--deductions--overflow--and-liability","keyword":"Feature","uri":"file:src/test/resources/features/fpv/fpv_money_flow.feature","tags":[{"name":"@fpv","type":"Tag","location":{"line":1,"column":1}},{"name":"@fpv-money-flow","type":"Tag","location":{"line":1,"column":6}}]}]