)]}'
{
  "log": [
    {
      "commit": "200f1315a7e494ca1b586f55997e23ff9a1fe802",
      "tree": "1682d7fd4c3f29418858953a50cb2b193f7e2943",
      "parents": [
        "f82dc37aab82512f1842bf55e84f265895e3b8a5",
        "e25d6540838fa79f26591f98d5f197b3ae7cf7c0"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sat Sep 12 19:08:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 19:08:27 2026 +0530"
      },
      "message": "Merge pull request #550 from Aman-Mittal/fix/e2e-summary-expected-failures\n\nfix(ci): stop the e2e summary reporting asserted failures as failures"
    },
    {
      "commit": "f82dc37aab82512f1842bf55e84f265895e3b8a5",
      "tree": "f411397ca584420ac6439692fd286869286097d3",
      "parents": [
        "3061fd9e27bcaf5006285cf94c47c4375245fe0e",
        "2606fe96bcfd09134a7a0ccaf1f20924be5873e7"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sat Sep 12 18:50:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 18:50:40 2026 +0530"
      },
      "message": "Merge pull request #549 from Aman-Mittal/test/date-picker-revisit-coverage\n\ntest(e2e): cover more routed forms in the date picker revisit spec"
    },
    {
      "commit": "e25d6540838fa79f26591f98d5f197b3ae7cf7c0",
      "tree": "45425f465efc0f65d98df44bed700235c05a3ebf",
      "parents": [
        "3061fd9e27bcaf5006285cf94c47c4375245fe0e"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 18:45:23 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 18:45:23 2026 +0530"
      },
      "message": "fix(ci): stop the e2e summary reporting asserted failures as failures\n\nA test.fail() case documents a known bug: Playwright runs it, requires it to\nfail, and exits zero when it does. The summary read result.status alone, so\nsuch a run rendered as \"❌ 1 failing\" while every check was green -- and a\nreport that cries wolf on a passing suite is one nobody reads.\n\nReconcile what a test did with what it was asked to do. An asserted failure\nis counted separately, named in its own section, and given a column in the\nper-file table so the counts still add up: it is neither a broken run nor a\ntest that did not run, and leaving it invisible is how a test.fail() becomes\npermanent.\n\nThe inverse matters as much. When such a test starts passing, the marker is\nstale and Playwright fails the run; that now surfaces as a failure here too,\nrather than a quiet pass the report and the exit code disagree about.\n\nVerified against a real Playwright report containing an expected failure,\nand against the same report with the result flipped to passed.\n"
    },
    {
      "commit": "2606fe96bcfd09134a7a0ccaf1f20924be5873e7",
      "tree": "f411397ca584420ac6439692fd286869286097d3",
      "parents": [
        "3061fd9e27bcaf5006285cf94c47c4375245fe0e"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 18:07:28 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 18:07:28 2026 +0530"
      },
      "message": "test(e2e): cover more routed forms in the date picker revisit spec\n\nThe spec entered two forms; extend it to six across accounting, settings,\ntellers, products and organization, so the revisit failure is watched on a\nrepresentative spread rather than one feature area.\n\nThe list pages behind the new cases only need to render, so they are mocked\nas empty collections instead of dragging in per-feature fixtures.\n\nThe floating rate form is covered with test.fail(): its pickers live inside\na @for over rate periods, so they are created after the first render and\nnever bind at all -- #548, which createPickersReady does not reach because\nthe flag is already true by the time a row is added. The spec asserts the\nbug is still present and turns red when it is fixed, prompting removal of\nthe marker.\n\nVerified each new case fails without the component fix, so none of them is\nvacuous.\n"
    },
    {
      "commit": "3061fd9e27bcaf5006285cf94c47c4375245fe0e",
      "tree": "15f55fd6eea9a7186b8d94d56aad9438ed41a35a",
      "parents": [
        "6161d17f15a667d9ffc6326a5ada446d305db8c1",
        "d250b4e10f74c3dc4d53c7276c87a5fa762478fc"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sat Sep 12 17:47:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 17:47:01 2026 +0530"
      },
      "message": "Merge pull request #547 from Aman-Mittal/fix/date-picker-revisit-rollout\n\nfix(ui): keep date pickers usable on every routed form visit"
    },
    {
      "commit": "d250b4e10f74c3dc4d53c7276c87a5fa762478fc",
      "tree": "15f55fd6eea9a7186b8d94d56aad9438ed41a35a",
      "parents": [
        "2b516f428244ba8b4fa438d91294e5e67936d157"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 15:22:13 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 15:22:13 2026 +0530"
      },
      "message": "test(clients): reach the client list by URL in the revisit spec\n\nDUAL_VIEWPORT_SPECS now matches this spec by glob, so it also runs at phone\nwidth, where the sidebar is collapsed and the Clients link is unreachable --\nthe spec timed out clicking it.\n\nNavigate to the list by URL instead. The revisit that triggers the bug still\nhappens in-app, through the list page\u0027s create button, so the spec covers\nthe same failure at both viewports.\n"
    },
    {
      "commit": "2b516f428244ba8b4fa438d91294e5e67936d157",
      "tree": "269ffa5aa2432376ca3ddabf298777593d2ee7be",
      "parents": [
        "6161d17f15a667d9ffc6326a5ada446d305db8c1"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 15:06:25 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 15:22:00 2026 +0530"
      },
      "message": "fix(ui): keep date pickers usable on every routed form visit\n\nion-datetime-button resolves its target ion-datetime exactly once, in\ncomponentWillLoad, through a global getElementById, and gives up for good\nwhen that lookup misses. The pickers live inside\nion-modal[keepContentsMounted], whose contents Angular mounts later in the\nchange-detection pass.\n\nOn a first visit to a routed page the button\u0027s lazy Ionic chunk is still\nloading, which delays it past that point. On a revisit the chunk is cached,\nso the button initializes first, finds nothing, and renders a blank control\nthat never opens. Reaching any of these forms a second time left every date\nfield unusable until a full page reload.\n\nAdd createPickersReady() and hold the buttons behind it, so they are created\none render after the pickers they look for. Applied to the 50 routed\ncomponents that carry the pattern, 72 buttons in total. Picker IDs are\nunchanged.\n\nDialog-hosted forms are not affected -- an overlay mounts its contents\nbefore the button initializes -- so the 11 dialog components are left alone.\nThe client form is fixed separately in #546.\n\nCovered by an e2e spec that enters the office and staff forms three times\neach without a reload, at both the desktop and mobile viewports. It fails at\nboth viewports without this change.\n"
    },
    {
      "commit": "6161d17f15a667d9ffc6326a5ada446d305db8c1",
      "tree": "f81433df9515706e8a2606d5381a99aa2f757cc3",
      "parents": [
        "8aa358f6df41e176faaeb56864a40d96ef35a91e",
        "c21296a3ddbe13026c579d3b240ff0b4bb9987be"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sat Sep 12 14:42:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 14:42:01 2026 +0530"
      },
      "message": "Merge pull request #545 from WilliamK112/codex/working-capital-array-date-257\n\nrefactor(working-capital): use array date formatter"
    },
    {
      "commit": "8aa358f6df41e176faaeb56864a40d96ef35a91e",
      "tree": "918569539efcdd45046e57985885de8ac1039d8d",
      "parents": [
        "981dd7f33f68eab3ba6d03acdbde3ca10699388e",
        "414e023994b59e4842fb90a23aeef4d017897a60"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sat Sep 12 14:37:04 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 14:37:04 2026 +0530"
      },
      "message": "Merge pull request #546 from Aman-Mittal/fix/541-client-date-picker-revisit\n\nfix(clients): keep create-form date pickers usable on revisit"
    },
    {
      "commit": "414e023994b59e4842fb90a23aeef4d017897a60",
      "tree": "918569539efcdd45046e57985885de8ac1039d8d",
      "parents": [
        "981dd7f33f68eab3ba6d03acdbde3ca10699388e"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 14:23:24 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sat Sep 12 14:23:24 2026 +0530"
      },
      "message": "fix(clients): keep create-form date pickers usable on revisit\n\nion-datetime-button resolves its target ion-datetime exactly once, in\ncomponentWillLoad, through a global getElementById, and gives up for good\nwhen that lookup misses. The pickers it points at live inside\nion-modal[keepContentsMounted], whose contents Angular mounts later in the\nchange-detection pass.\n\nOn a first visit the button\u0027s lazy Ionic chunk is still loading, which\ndelays it past that point. On a revisit the chunk is cached, so the button\ninitializes first, finds nothing, and renders a blank control that never\nopens -- leaving no way to enter the submitted-on, activation or\ndate-of-birth values.\n\nHold the buttons back one render so the pickers are in the DOM before the\nbuttons look for them. The picker IDs are unchanged.\n\nCovered by an e2e spec that walks a full create and then reopens the form,\nwhich is where the failure appears; it fails without this change.\n\nFixes #541\n"
    },
    {
      "commit": "c21296a3ddbe13026c579d3b240ff0b4bb9987be",
      "tree": "73c971528ddc476e95e65577e9a91b025429a308",
      "parents": [
        "981dd7f33f68eab3ba6d03acdbde3ca10699388e"
      ],
      "author": {
        "name": "Ching-Wei Kang",
        "email": "164879897+WilliamK112@users.noreply.github.com",
        "time": "Sat Sep 12 00:09:26 2026 -0500"
      },
      "committer": {
        "name": "Ching-Wei Kang",
        "email": "164879897+WilliamK112@users.noreply.github.com",
        "time": "Sat Sep 12 00:09:26 2026 -0500"
      },
      "message": "refactor(working-capital): use array date formatter\n"
    },
    {
      "commit": "981dd7f33f68eab3ba6d03acdbde3ca10699388e",
      "tree": "08e8f09e8e53cab4671ee2851be58e38e509459d",
      "parents": [
        "e26ba6ec740904a9e875a59084b1a2238e26d59a",
        "d5d8f6ceb370241589ac4f25af722c745d0a91bd"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Fri Sep 11 10:02:38 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 10:02:38 2026 +0530"
      },
      "message": "Merge pull request #535 from Hashim1999164/fix/audit-trails-redirect\n\nSend leftover audit trails path to the audits screen"
    },
    {
      "commit": "e26ba6ec740904a9e875a59084b1a2238e26d59a",
      "tree": "e34d25be566629c9e3b1f26e32714230207ebedc",
      "parents": [
        "c3ebededf5d4122ac8c5723656ef0bf7483bfc62",
        "ad9533c41d5ecbd12adb2a0e557aec3f99ca9086"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Fri Sep 11 10:01:34 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 10:01:34 2026 +0530"
      },
      "message": "Merge pull request #537 from subhranshudash13-dotcom/fix/534-entity-client-search\n\nfix(clients): fix client list search for entity clients (#534)"
    },
    {
      "commit": "d5d8f6ceb370241589ac4f25af722c745d0a91bd",
      "tree": "ba8cd0ffd4a13f1a89794adb7552bd4fd539d3d6",
      "parents": [
        "28d3c5ff145ace4d863d50396e4e78402fdb2ed0"
      ],
      "author": {
        "name": "Hashim Khan",
        "email": "64767361+Hashim1999164@users.noreply.github.com",
        "time": "Fri Sep 11 02:11:17 2026 +0500"
      },
      "committer": {
        "name": "Hashim Khan",
        "email": "sardarhashim30@gmail.com",
        "time": "Fri Sep 11 02:11:17 2026 +0500"
      },
      "message": "Add playwright test for leftover audit trails path\n"
    },
    {
      "commit": "ad9533c41d5ecbd12adb2a0e557aec3f99ca9086",
      "tree": "8c92a439b1eaabf4d05083016f4a082792d9a2ea",
      "parents": [
        "400c8aa3ed2fc95b1754481a66fc9bc77559d74c"
      ],
      "author": {
        "name": "subhranshudash13-dotcom",
        "email": "subhranshu.dash13@gmail.com",
        "time": "Thu Sep 10 16:32:21 2026 +0530"
      },
      "committer": {
        "name": "subhranshudash13-dotcom",
        "email": "subhranshu.dash13@gmail.com",
        "time": "Thu Sep 10 18:04:11 2026 +0530"
      },
      "message": "test(e2e): move entity client search test to backend suite\n"
    },
    {
      "commit": "c3ebededf5d4122ac8c5723656ef0bf7483bfc62",
      "tree": "be1c96070d034ea8eb3c6d73abdf5fada49a8aba",
      "parents": [
        "aeb667f55e7b888b4e143a1c81376d36409a48d2",
        "5daf031958b2a83248264592ff455f5b4d0493ee"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Thu Sep 10 10:46:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 10:46:51 2026 +0530"
      },
      "message": "Merge pull request #525 from zhangxinyao88/codex/docs-contributor-agent-guide\n\ndocs: clarify contributor and agent workflows"
    },
    {
      "commit": "aeb667f55e7b888b4e143a1c81376d36409a48d2",
      "tree": "ed8d24ab583be4035e66f7902776b2754833d6ff",
      "parents": [
        "1398a8f4ed6bbac9aa210e8232dbada2cae641e9",
        "ca1eaf7a2193f409114a0eaa25cc8678e90c217c"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Thu Sep 10 10:44:22 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 10:44:22 2026 +0530"
      },
      "message": "Merge pull request #536 from opensource-joe/fix/484-default-theme-contrast\n\nfix(a11y): meet WCAG AA contrast in the shipped default theme"
    },
    {
      "commit": "1398a8f4ed6bbac9aa210e8232dbada2cae641e9",
      "tree": "1894e14f0a98fe2559ab78a4d67bc24c1d7e077a",
      "parents": [
        "c3b62447d860ed8bc13c3ca10bf66cfc8d493430",
        "4670c9d3751cdfcb2c813b534f7bc47a729496ba"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Thu Sep 10 10:41:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 10:41:51 2026 +0530"
      },
      "message": "Merge pull request #539 from apache/dependabot/npm_and_yarn/js-yaml-4.3.2\n\nbuild(deps-dev): bump js-yaml from 4.3.1 to 4.3.2"
    },
    {
      "commit": "4670c9d3751cdfcb2c813b534f7bc47a729496ba",
      "tree": "1894e14f0a98fe2559ab78a4d67bc24c1d7e077a",
      "parents": [
        "c3b62447d860ed8bc13c3ca10bf66cfc8d493430"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 10 04:38:49 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 04:38:49 2026 +0000"
      },
      "message": "build(deps-dev): bump js-yaml from 4.3.1 to 4.3.2\n\nBumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.3.1 to 4.3.2.\n- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.2/CHANGELOG.md)\n- [Commits](https://github.com/nodeca/js-yaml/compare/4.3.1...4.3.2)\n\n---\nupdated-dependencies:\n- dependency-name: js-yaml\n  dependency-version: 4.3.2\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "c3b62447d860ed8bc13c3ca10bf66cfc8d493430",
      "tree": "21122f77ada257207e9b7ce08c0d2232354adc08",
      "parents": [
        "86f26eaee96370e7a83709b4ac2f1502e9eb823f",
        "8ed8708fb34c41bdf6249acac11173b76b1b14f2"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Thu Sep 10 09:59:50 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 09:59:50 2026 +0530"
      },
      "message": "Merge pull request #538 from apache/dependabot/npm_and_yarn/hono-4.13.7\n\nbuild(deps): bump hono from 4.13.4 to 4.13.7"
    },
    {
      "commit": "5daf031958b2a83248264592ff455f5b4d0493ee",
      "tree": "4cbfce93952d49ba36322108a21d53e4c865dfd7",
      "parents": [
        "43a9ba2b6960c16f95bec6ec030cbe6e452276bb"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Wed Sep 09 23:39:36 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Wed Sep 09 23:39:36 2026 -0400"
      },
      "message": "docs: add AI contribution guidance\n"
    },
    {
      "commit": "8ed8708fb34c41bdf6249acac11173b76b1b14f2",
      "tree": "21122f77ada257207e9b7ce08c0d2232354adc08",
      "parents": [
        "86f26eaee96370e7a83709b4ac2f1502e9eb823f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 10 02:39:54 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 02:39:54 2026 +0000"
      },
      "message": "build(deps): bump hono from 4.13.4 to 4.13.7\n\nBumps [hono](https://github.com/honojs/hono) from 4.13.4 to 4.13.7.\n- [Release notes](https://github.com/honojs/hono/releases)\n- [Commits](https://github.com/honojs/hono/compare/v4.13.4...v4.13.7)\n\n---\nupdated-dependencies:\n- dependency-name: hono\n  dependency-version: 4.13.7\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "400c8aa3ed2fc95b1754481a66fc9bc77559d74c",
      "tree": "7e3f0fe21eebad1e2877fa0c5a60aa15cdabb3c0",
      "parents": [
        "86f26eaee96370e7a83709b4ac2f1502e9eb823f"
      ],
      "author": {
        "name": "subhranshudash13-dotcom",
        "email": "subhranshu.dash13@gmail.com",
        "time": "Wed Sep 09 18:32:09 2026 +0530"
      },
      "committer": {
        "name": "subhranshudash13-dotcom",
        "email": "subhranshu.dash13@gmail.com",
        "time": "Wed Sep 09 18:32:29 2026 +0530"
      },
      "message": "fix(clients): remove hardcoded legalForm to support entity client search (#534)\n"
    },
    {
      "commit": "ca1eaf7a2193f409114a0eaa25cc8678e90c217c",
      "tree": "81086b96ee31bd53aa83c6cc7bca4fe5a7918a37",
      "parents": [
        "86f26eaee96370e7a83709b4ac2f1502e9eb823f"
      ],
      "author": {
        "name": "Joe Castle",
        "email": "joecastleengineering@gmail.com",
        "time": "Wed Sep 09 08:54:07 2026 -0400"
      },
      "committer": {
        "name": "Joe Castle",
        "email": "joecastleengineering@gmail.com",
        "time": "Wed Sep 09 08:54:07 2026 -0400"
      },
      "message": "fix(a11y): meet WCAG AA contrast in the shipped default theme\n\nSix elements in the header and on the dashboard fail AA contrast in the\nlight theme: the app title and system-info value at 3.15:1 and 2.83:1,\nthe Guide and Logout buttons at 4.30:1 and 3.82:1, and the dashboard\ntrend and health values at 2.19:1 and 2.10:1.\n\nThe palette is chosen for fills. A colour that reads well behind white\ntext is usually too light to read as words on white, which is why\n--primary-strong already exists. Complete that pattern rather than\npatching the six CSS sites: --error-strong for the remaining\nwhite-on-fill case, and --primary-text, --warning-text and\n--success-text for the palette drawn as text. The text tokens are\ntheme-scoped, because on the dark card the shipped values already clear\nAA and darkening them fails.\n\nAll four are brandable, so a deployment that recolours the palette does\nnot find its blue everywhere except the header title, and --error-strong\ncarries the same white-text contrast floor as --primary-strong.\n\nThe suite has run color-contrast as part of wcag2aa the whole time, but\nevery scan is scoped to ion-card or an open modal on the client routes,\nso it has never seen the chrome. Adds a scan of the banner and the\ndashboard, which is what surfaces these six.\n\nCloses #484\n"
    },
    {
      "commit": "28d3c5ff145ace4d863d50396e4e78402fdb2ed0",
      "tree": "0edb7d43d3fd522c63291e44c8ae60cef7416571",
      "parents": [
        "86f26eaee96370e7a83709b4ac2f1502e9eb823f"
      ],
      "author": {
        "name": "Hashim Khan",
        "email": "64767361+Hashim1999164@users.noreply.github.com",
        "time": "Wed Sep 09 14:13:29 2026 +0500"
      },
      "committer": {
        "name": "Hashim Khan",
        "email": "sardarhashim30@gmail.com",
        "time": "Wed Sep 09 14:13:29 2026 +0500"
      },
      "message": "Send leftover audit trails path to the audits screen\n\nUnknown leftover path missed the audits route and the catch all dumped people on the dashboard.\n"
    },
    {
      "commit": "86f26eaee96370e7a83709b4ac2f1502e9eb823f",
      "tree": "f49810960964891722204c61c5b4fb5152a2c2c1",
      "parents": [
        "632a298678a4970b163362095f7df9c0c4444c30",
        "11973d111ebc67f04082ba8cbf851eefcdf2baf7"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Tue Sep 08 13:16:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 13:16:39 2026 +0530"
      },
      "message": "Merge pull request #532 from ryux1/fix/mobile-stepper\n\nfix: keep client stepper visible on mobile"
    },
    {
      "commit": "11973d111ebc67f04082ba8cbf851eefcdf2baf7",
      "tree": "f49810960964891722204c61c5b4fb5152a2c2c1",
      "parents": [
        "1a1216649b61a4cdb23e8f1c9d4c957623ff3f9e"
      ],
      "author": {
        "name": "ryux1",
        "email": "code@ryux1.dev",
        "time": "Tue Sep 08 06:46:19 2026 +0200"
      },
      "committer": {
        "name": "ryux1",
        "email": "code@ryux1.dev",
        "time": "Tue Sep 08 06:46:19 2026 +0200"
      },
      "message": "fix: align stepper with mobile breakpoint\n"
    },
    {
      "commit": "1a1216649b61a4cdb23e8f1c9d4c957623ff3f9e",
      "tree": "3e3085862f8e5aa913658ac6c71941a53ae9d62d",
      "parents": [
        "632a298678a4970b163362095f7df9c0c4444c30"
      ],
      "author": {
        "name": "ryux1",
        "email": "code@ryux1.dev",
        "time": "Mon Sep 07 17:40:05 2026 +0200"
      },
      "committer": {
        "name": "ryux1",
        "email": "code@ryux1.dev",
        "time": "Mon Sep 07 17:40:05 2026 +0200"
      },
      "message": "fix: keep mobile stepper in view\n\nFixes #489\n"
    },
    {
      "commit": "632a298678a4970b163362095f7df9c0c4444c30",
      "tree": "d3ed9e41304ff43a6c5f7d217748faa8e1f1a265",
      "parents": [
        "b52b7e91dd1cfe0384ea43481365b62527e5599b",
        "acf4a429e0c241a6b07c9b227d454a9f5bec2518"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Mon Sep 07 11:30:04 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 11:30:04 2026 +0530"
      },
      "message": "Merge pull request #531 from apache/chore/fineract-spec-sync\n\nchore(api): sync the Fineract OpenAPI spec"
    },
    {
      "commit": "acf4a429e0c241a6b07c9b227d454a9f5bec2518",
      "tree": "d3ed9e41304ff43a6c5f7d217748faa8e1f1a265",
      "parents": [
        "b52b7e91dd1cfe0384ea43481365b62527e5599b"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Sep 07 04:32:56 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 04:32:56 2026 +0000"
      },
      "message": "chore(api): sync the Fineract OpenAPI spec and regenerate the client\n\n"
    },
    {
      "commit": "b52b7e91dd1cfe0384ea43481365b62527e5599b",
      "tree": "d67d1f93c54fcd9dc206e3b771d86f8815cbdcf6",
      "parents": [
        "3293d53fad7ddbf3f6406d77fb29f184e04effc7",
        "a62595c88db17f955ca5a5822989320184b84342"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Mon Sep 07 10:00:09 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 10:00:09 2026 +0530"
      },
      "message": "Merge pull request #529 from JebastineE/fix/blank-section-routes\n\nfix: redirect blank section routes"
    },
    {
      "commit": "43a9ba2b6960c16f95bec6ec030cbe6e452276bb",
      "tree": "98addc516797ca0c738b6720f45e711450266ba2",
      "parents": [
        "3ffb5c60d602b358427dde66b8e28338a907be4b"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Sep 06 18:08:17 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Sep 06 18:08:17 2026 -0400"
      },
      "message": "docs: correct local workflow guidance\n"
    },
    {
      "commit": "a62595c88db17f955ca5a5822989320184b84342",
      "tree": "9b45e27b2af2ed7213384726562c79739b73bcd4",
      "parents": [
        "e685150bbf9d07fb9157a4b3a8d9b1c35a5b91f7"
      ],
      "author": {
        "name": "Jebastine E",
        "email": "jebastine230906@gmail.com",
        "time": "Sun Sep 06 23:18:33 2026 +0530"
      },
      "committer": {
        "name": "Jebastine E",
        "email": "jebastine230906@gmail.com",
        "time": "Sun Sep 06 23:18:33 2026 +0530"
      },
      "message": "test: add section route redirect e2e coverage\n"
    },
    {
      "commit": "3293d53fad7ddbf3f6406d77fb29f184e04effc7",
      "tree": "e63d3469236d942db22147471936bd4209ae2d62",
      "parents": [
        "0d4638c2324fb972d9e6de37ee42317a42b7b71e",
        "d7f9a5fc8184fe73b721dab01b82e436608e77c0"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 22:18:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 22:18:21 2026 +0530"
      },
      "message": "Merge pull request #500 from GruffElixir/fix/490-mobile-paginator\n\nfix(paginator): reflow controls on mobile"
    },
    {
      "commit": "d7f9a5fc8184fe73b721dab01b82e436608e77c0",
      "tree": "e63d3469236d942db22147471936bd4209ae2d62",
      "parents": [
        "1a64fb30ba2d0d45e6317ee1204a6d350010b934"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 21:20:02 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 22:04:06 2026 +0530"
      },
      "message": "test(paginator): assert rendered mobile label layout\n"
    },
    {
      "commit": "1a64fb30ba2d0d45e6317ee1204a6d350010b934",
      "tree": "062727274769950eb76fe8c97adfc799a83aca5a",
      "parents": [
        "674c8dd9442932e72a1095030a75da00e9409711"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 15:38:19 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 22:04:06 2026 +0530"
      },
      "message": "test(paginator): cover mobile label layout\n"
    },
    {
      "commit": "674c8dd9442932e72a1095030a75da00e9409711",
      "tree": "37d9614afea7c4a81a9d466b5a630cbbc276490f",
      "parents": [
        "1a0f91d3bfd09847e000c7b5330d8b54ad841f5f"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:16:50 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 22:03:28 2026 +0530"
      },
      "message": "fix(paginator): preserve mobile label width\n"
    },
    {
      "commit": "1a0f91d3bfd09847e000c7b5330d8b54ad841f5f",
      "tree": "7c9b0ffebe0d9e7b732d00c39261fd6bb291225e",
      "parents": [
        "0d4638c2324fb972d9e6de37ee42317a42b7b71e"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 13:59:41 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 22:03:28 2026 +0530"
      },
      "message": "fix(paginator): reflow controls on mobile\n"
    },
    {
      "commit": "0d4638c2324fb972d9e6de37ee42317a42b7b71e",
      "tree": "65c5777835aea21b62540d71343ea043e563a235",
      "parents": [
        "d8f13e7eb68c6bb0a55f73ae327edc0a0ff98272",
        "59b72f3e2e8629f9f4c806b245bbb3d76a61b70f"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 21:59:34 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 21:59:34 2026 +0530"
      },
      "message": "Merge pull request #524 from arpitjain099/fix/interest-pause-invalid-variation-id\n\nfix(loans): send an unusable interest-pause id back to the list"
    },
    {
      "commit": "e685150bbf9d07fb9157a4b3a8d9b1c35a5b91f7",
      "tree": "e149bcfd1a08b9671a8c1cdb5f33a3f0f2a3234b",
      "parents": [
        "55abe539f89c915a86aabafea9ad7b9c83861100"
      ],
      "author": {
        "name": "Jebastine E",
        "email": "jebastine230906@gmail.com",
        "time": "Sun Sep 06 21:52:03 2026 +0530"
      },
      "committer": {
        "name": "Jebastine E",
        "email": "jebastine230906@gmail.com",
        "time": "Sun Sep 06 21:52:03 2026 +0530"
      },
      "message": "fix: redirect blank section routes\n"
    },
    {
      "commit": "d8f13e7eb68c6bb0a55f73ae327edc0a0ff98272",
      "tree": "d6624334990c26ccdb5f22c6fbf2b7db1168a91a",
      "parents": [
        "55abe539f89c915a86aabafea9ad7b9c83861100",
        "2cd49640885271ec3f3a4f849d7d92cddde85df7"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 21:39:44 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 21:39:44 2026 +0530"
      },
      "message": "Merge pull request #526 from Aman-Mittal/feat/revamp-guidance-tour\n\nfeat(guide): give every screen a tour that is about that screen"
    },
    {
      "commit": "2cd49640885271ec3f3a4f849d7d92cddde85df7",
      "tree": "d6624334990c26ccdb5f22c6fbf2b7db1168a91a",
      "parents": [
        "f8e5563f9ec8366fb086e646d42264f47b3506f8"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 21:28:01 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 21:28:01 2026 +0530"
      },
      "message": "fix(guide): keep the visible label as the button\u0027s accessible name\n\n`feature-coverage.spec.ts` looks for the Guide button by the accessible name\n`/Help Tour|Guide/`, and it stopped finding it. The cause was not the renamed\nstring: I had put the long form on an `aria-label`, which *replaces* visible\ntext as the accessible name, so the button read \"Guide\" and answered to \"Open\nthe guided tour for this screen\".\n\nThat is WCAG 2.5.3 Label in Name. Someone driving the page by voice says \"click\nGuide\" and nothing happens, and the spec is exactly the check that catches it.\n\nThe long wording is a description now — `appTooltip` wires `aria-describedby` —\nand the visible text is the name again, so the existing spec needs no change.\n\n  feature-coverage.spec.ts -g \"help tour button\"   1 passed\n  guidance-tour.spec.ts                            5 passed\n  accessibility.spec.ts                            3 passed\n"
    },
    {
      "commit": "f8e5563f9ec8366fb086e646d42264f47b3506f8",
      "tree": "9ede1c5209f846b1b5d3f1d8c795a32f945e522c",
      "parents": [
        "bbf2cf79778e2fe697c431a2f8bea995f75dee8c"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 21:01:21 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 21:01:21 2026 +0530"
      },
      "message": "test(guide): build the fixture DOM instead of assigning HTML\n\n`npm run ga:check` treats `.innerHTML` as a raw HTML sink wherever it appears\nunder `src/`, and rejects it — a test is not exempt from a rule about sinks, and\nthe gate is right not to carve out an exception it would then have to police.\n\nThe fixtures only ever needed an element with a class on it, so an `el()` helper\nand `append` do the same job. The comment explaining this originally quoted the\nsink it was avoiding, which tripped the same pattern; it describes it instead.\n\n  8/9 gates pass; 0 blocking failure(s), 0 undetermined.\n\nThe one remaining line is the advisory adapter-boundary backlog at 323, which\n`git diff apache/main...HEAD -- eslint-suppressions.json` shows this branch does\nnot touch.\n"
    },
    {
      "commit": "bbf2cf79778e2fe697c431a2f8bea995f75dee8c",
      "tree": "104a35461211b6169cd806a0135933faf4ada4a1",
      "parents": [
        "55abe539f89c915a86aabafea9ad7b9c83861100"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 20:25:23 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 20:25:23 2026 +0530"
      },
      "message": "feat(guide): give every screen a tour that is about that screen\n\nThe Guide button opened the *dashboard* tour on every route it did not\nrecognise, so pressing it on Accounting welcomed the user to a dashboard they\nwere not looking at. Route matching was `url.includes(\u0027/loans\u0027)`, which claimed\nany path with those characters anywhere in it.\n\nNow each URL resolves through anchored patterns, most specific first, and a\nscreen with no hand-written copy gets a tour composed from its own route title\nplus one step per control that is actually on it. A hand-written tour that\npoints at nothing gains those steps too, which took the section pages from one\ncard to four. No screen borrows another\u0027s copy, and no step describes something\nthat is not there.\n\nFour selectors pointed at elements that cannot exist. Each rendered its copy and\nhighlighted nothing, which is invisible from the outside:\n\n  button[headerActions]   the attribute sits on an ion-button, whose native\n                          button is in a shadow root that never carries it\n  mat-select[name\u003d...]    Material leftovers; this application has no Angular\n                          Material at all\n  .tab-group              applied by no template anywhere — a dead style rule in\n                          five record views, from the Material port. All sixteen\n                          screens with tabs render an ion-segment\n  [headerActions] alone   groups, centres and share accounts ask app-data-table\n                          for a create button instead of projecting one\n\nSteps are scoped: a content step is searched inside `main`, so a loose selector\ncan no longer reach the shell the way a bare `ul` once resolved to the sidebar\u0027s\nnav list. Resolution retries while the view settles, rather than silently\nfinding nothing on a screen that is still fetching.\n\nWalking all twenty guided views at 412x839 and at 1440x900 found three more:\n\n- the business-date and Guide steps pointed at controls that move into the\n  header\u0027s overflow menu on a narrow viewport, so both highlighted nothing;\n- the share-account form\u0027s last select sat 30px under the mobile sheet;\n- on the dashboard at 1440x900 the card painted over 77.6% of the System Status\n  card — that step\u0027s entire subject, with 48px showing.\n\nBoth widths now get room to scroll a target clear of the card. Measured after:\n0% covered, and no step at either width fails to find its target.\n\nEscape listens on `document` rather than on the host. The tour is non-modal by\ndesign, so a user who clicks the thing a step describes moved focus into the\npage, and Escape then did nothing at all.\n\nA tour also no longer survives navigation. Opening it on the dashboard and\nclicking Clients used to leave the dashboard card over the client list, with\nNext explaining Fineract environment health and nothing highlighted.\n\nThe highlight colour is a themed token instead of a hex in a component. One\nvalue cannot serve both: against the surfaces a highlight lands on, #b45309 is\n4.23-5.02:1 in light and only 3.32-3.87:1 in dark, while #f59e0b is 7.76-9.05:1\nin dark and 1.81-2.15:1 in light. Measured live in dark mode afterwards: 7.76:1\nand 8.72:1 for the outline, 7.69:1 for the card text.\n\nThe highlight no longer sets position or z-index, which was enough to move a\ngrid child while the tour was open, and \"Step X of Y\" and the button\u0027s own label\nare translated rather than hardcoded English.\n\nDOCS/GUIDED_TOUR.md covers how a tour is chosen, how one is composed, and the\nselector traps above. DOCS/MOBILE.md said the narrow header hides the business\ndate and guide; it moves them into a popover, which is what the new grouped\nselectors depend on.\n"
    },
    {
      "commit": "3ffb5c60d602b358427dde66b8e28338a907be4b",
      "tree": "cc02a380b0070aa68a8f3e9caeacf81844729fea",
      "parents": [
        "55abe539f89c915a86aabafea9ad7b9c83861100"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Sep 06 09:10:49 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Sep 06 09:10:49 2026 -0400"
      },
      "message": "docs: clarify contributor and agent workflows\n"
    },
    {
      "commit": "55abe539f89c915a86aabafea9ad7b9c83861100",
      "tree": "1ba8dd302059b6a049be81d09e44050eb0d3bc15",
      "parents": [
        "8ff9ad61617cf3a7883262556c40de79e38d0885",
        "b438c29e4d955954bfe2cc474dc6eeaa72ea69e1"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 18:09:11 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 18:09:11 2026 +0530"
      },
      "message": "Merge pull request #523 from Aman-Mittal/fix/487-branding-overlay-optin\n\nfix(config): only fetch the branding overlay when a deployment ships one"
    },
    {
      "commit": "b438c29e4d955954bfe2cc474dc6eeaa72ea69e1",
      "tree": "54978beb431b02ced551d3ee94f769454310a2fe",
      "parents": [
        "a7d003b2029adfe460936216d09a59fe1793a583"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 17:55:30 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 17:55:30 2026 +0530"
      },
      "message": "test(e2e): declare the overlay in the fixtures that mount one\n\nBoth branding suites served `branding/config.json` while the layer beneath it\nsaid nothing, which is a state the container entrypoint cannot produce — it sets\n`brandingOverlayEnabled` from the directory the deployer copied in. Once the\nprobe is gated on that flag the fixtures modelled a deployment that shipped\n`branding/` and never told the application, and 26 tests failed.\n\n`deployment-customization` derives the flag from whether the test asked for an\noverlay at all, so the \"no overlay mounted\" cases keep exercising the off path.\n`branded-deployment` always mounts one, so it is always on.\n\nAdds the assertion the fix is actually about, which only an e2e can make: with no\noverlay declared, nothing under `/branding/` is requested. A unit test cannot see\nthis — it is about a request not being on the wire, and the console entry it used\nto produce was written by the browser, not by the application.\n\n28 passed across both specs.\n"
    },
    {
      "commit": "59b72f3e2e8629f9f4c806b245bbb3d76a61b70f",
      "tree": "643aef9d619e3375534097d7dc82729768a9c1a0",
      "parents": [
        "8ff9ad61617cf3a7883262556c40de79e38d0885"
      ],
      "author": {
        "name": "Arpit Jain",
        "email": "arpitjain099@gmail.com",
        "time": "Sun Sep 06 08:19:33 2026 -0400"
      },
      "committer": {
        "name": "Arpit Jain",
        "email": "arpitjain099@gmail.com",
        "time": "Sun Sep 06 08:19:33 2026 -0400"
      },
      "message": "fix(loans): send an unusable interest-pause id back to the list\n\nSigned-off-by: Arpit Jain \u003carpitjain099@gmail.com\u003e\n"
    },
    {
      "commit": "8ff9ad61617cf3a7883262556c40de79e38d0885",
      "tree": "14c8a743afc74f72f688ca4a26a5a39d1c7b9dd5",
      "parents": [
        "69569d9a3b5391d64a1953fb4ec58b18e31e0823",
        "26a9895562cf5a3aa6e4a006d2153e03ed98b468"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 17:26:05 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 17:26:05 2026 +0530"
      },
      "message": "Merge pull request #520 from apache/dependabot/github_actions/zizmorcore/zizmor-action-0.6.3\n\nbuild(deps): bump zizmorcore/zizmor-action from 0.6.2 to 0.6.3"
    },
    {
      "commit": "69569d9a3b5391d64a1953fb4ec58b18e31e0823",
      "tree": "e228f6aad5a7e06145c3f7f9071b7de24c678b6c",
      "parents": [
        "f18d959216d0f2f6f1eb8ddd570785e989082876",
        "873c4364a7c04e479d6ba86386cc00df4cc9c238"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 17:25:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 17:25:47 2026 +0530"
      },
      "message": "Merge pull request #519 from apache/dependabot/github_actions/actions/setup-java-6.0.0\n\nbuild(deps): bump actions/setup-java from 5.7.0 to 6.0.0"
    },
    {
      "commit": "a7d003b2029adfe460936216d09a59fe1793a583",
      "tree": "88d87f56e2074ad6e39200d41977056211f23f6b",
      "parents": [
        "f18d959216d0f2f6f1eb8ddd570785e989082876"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 17:23:27 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 17:23:43 2026 +0530"
      },
      "message": "fix(config): only fetch the branding overlay when a deployment ships one\n\n`branding/config.json` and `branding/i18n/{lang}.json` were requested on every\nload. They are absent on every default install — which is the documented, correct\nstate — so a fresh deployment reported two 404s in the browser console on every\nroute.\n\nThe application already declined to *report* those failures: both fetches carry\n`skipErrorToast`, and both resolve to `{}`. That is as far as this side can go. A\n404 is a network-level event the browser writes regardless, so the only way for a\nsupported configuration to stop looking like a misconfiguration is not to make\nthe request.\n\n`brandingOverlayEnabled` gates both. It cannot live in the overlay itself — a\nfile cannot announce its own absence — so it belongs in the layer below, and the\ncontainer entrypoint sets it by looking for the directory the deployer already\ndeclared with `COPY branding/ ...`. Nothing new to remember, and the heredoc\u0027s own\nrule is satisfied: this is a fact about the container\u0027s filesystem, which is\nexactly what that file is the right source for.\n\nThe loader resolves `ConfigService` on use rather than as a field. Injecting it\nat construction closes a cycle — `ConfigService` needs `HttpClient`, whose\n`errorInterceptor` needs `I18N`, which needs the loader — and Angular reports\nthat as NG0200 during bootstrap with nothing rendered at all. The unit tests do\nnot catch it, because they provide `ConfigService` directly; it shows up the\nmoment the application is actually loaded.\n\nVerified against a running dev server: `/branding/config.json` and\n`/branding/i18n/en.json` are no longer requested, and with the flag on and an\noverlay present both return 200 and the overlay\u0027s `appName` renders.\n"
    },
    {
      "commit": "f18d959216d0f2f6f1eb8ddd570785e989082876",
      "tree": "cde16bbfa05e8b916821f30cdcf5727f8eee2e18",
      "parents": [
        "bd5747e52e0ea08c593574ea0a7d2ec344b0ec3e",
        "87113dfe91e4f4726fdb3f6b30fce27cec3dd8d3"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 17:21:26 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 17:21:26 2026 +0530"
      },
      "message": "Merge pull request #515 from Aman-Mittal/fix/496-date-only-utc-parse\n\nfix(dates): read a date-only string as a calendar date, not as UTC midnight"
    },
    {
      "commit": "26a9895562cf5a3aa6e4a006d2153e03ed98b468",
      "tree": "95212bcbcae87bbfee3ae0da2986afc0dcd283b1",
      "parents": [
        "bd5747e52e0ea08c593574ea0a7d2ec344b0ec3e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 06 11:44:58 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 11:44:58 2026 +0000"
      },
      "message": "build(deps): bump zizmorcore/zizmor-action from 0.6.2 to 0.6.3\n\nBumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.6.2 to 0.6.3.\n- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)\n- [Commits](https://github.com/zizmorcore/zizmor-action/compare/3dc1ecc9bcb9e94e9b2c709687979e1298497054...70fb788f84895a7701f5643d103d587e460b5c99)\n\n---\nupdated-dependencies:\n- dependency-name: zizmorcore/zizmor-action\n  dependency-version: 0.6.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "873c4364a7c04e479d6ba86386cc00df4cc9c238",
      "tree": "04ce68d4d050bb71bdf7cc92401ca5d558cc299b",
      "parents": [
        "bd5747e52e0ea08c593574ea0a7d2ec344b0ec3e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 06 11:44:49 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 11:44:49 2026 +0000"
      },
      "message": "build(deps): bump actions/setup-java from 5.7.0 to 6.0.0\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.7.0 to 6.0.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/b6effb05e454b25005698d916606bdc6ffcbf961...dd06d9cba3e5552c54d9f8ea23572deb30010f7c)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "87113dfe91e4f4726fdb3f6b30fce27cec3dd8d3",
      "tree": "fa9f7aa1cd8d1482d455335610ee5824303c5f18",
      "parents": [
        "bd093a029ce4b484a25ba70b24337e54ff7b9cee"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 17:09:10 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 17:09:10 2026 +0530"
      },
      "message": "fix(dates): stop routing dates back through UTC at the call sites\n\nThe helper fix alone does not reach these; each one converts to UTC before the\nhelper ever sees the value.\n\nFive call sites wrapped a string in `new Date()` before passing it on. The\ndialogs behind them return `toIsoDate(new Date())` — a bare `YYYY-MM-DD` — so\nthat wrapper re-parsed it as UTC midnight and the day was lost before the\ndate-only branch could apply. The helper already accepts the string.\n\nTwo dialogs seeded their picker from `new Date().toISOString()`, a UTC instant.\nConfirming without touching the picker therefore sent a different calendar day\nthan the one on screen, for anyone whose local date and UTC date differ at that\nmoment. Both now use `toIsoDate(new Date())`, matching what the group and client\naction dialogs already did.\n\nThe audit-log filter built its range with `toISOString().split(\u0027T\u0027)`, which the\ndate formatter\u0027s own doc comment warns against, so \"from today\" read as tomorrow\neast of Greenwich and yesterday west of it.\n\nThree screens had already worked around the underlying defect by hand —\n`deposit-account-view` and `share-account-view` split the ISO string into parts\nbefore formatting, both with a comment explaining why, and `loan-view` carried a\nprivate `isoToFineractDate` doing the same. All three are now the helper\u0027s own\nbehaviour and are collapsed.\n\nThe center-view fixtures used `...T00:00:00.000Z`, which no dialog in this\napplication produces; they passed only because fixture and formatter agreed to\nread the value as UTC. They now carry the calendar date the dialogs actually\nreturn, which is what makes them a guard.\n\nVerified at 236 files / 1419 tests under both TZ\u003dAmerica/New_York and the local\nzone, with `npm run build` clean.\n"
    },
    {
      "commit": "bd5747e52e0ea08c593574ea0a7d2ec344b0ec3e",
      "tree": "107bedb823263e1e359202951c5fdf081565f148",
      "parents": [
        "e6b31e4d61c563818df962d7efeafb55c9c5f136",
        "3f6d990dd6389e91af79b152ed33d31a1eb885ee"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 17:00:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 17:00:27 2026 +0530"
      },
      "message": "Merge pull request #499 from GruffElixir/fix/491-mobile-dashboard\n\nfix(dashboard): stack widgets on mobile"
    },
    {
      "commit": "bd093a029ce4b484a25ba70b24337e54ff7b9cee",
      "tree": "dfca1f7e0d1ba102b7a160ca245b284970c6cbf8",
      "parents": [
        "e6b31e4d61c563818df962d7efeafb55c9c5f136"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 16:56:11 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 16:56:11 2026 +0530"
      },
      "message": "fix(dates): read a date-only string as a calendar date, not as UTC midnight\n\n`formatDateToFineract` handed every string to `new Date()`. Per ECMAScript a\ndate-only string is parsed as **UTC midnight**, while the getters that build the\noutput read **local** time, so at any negative offset the two disagree:\n\n  TZ\u003dAmerica/New_York  \u00272026-01-15\u0027  -\u003e  14 January 2026\n  TZ\u003dAmerica/New_York  \u00272026-01-01\u0027  -\u003e  31 December 2025\n\nEvery screen that pre-fills a date from an API response and is saved without\nre-picking that field submitted the day before. On the 1st of a month the shift\ncrosses into the previous month, and on 1 January into the previous year.\n\nA string carrying a time or an explicit zone is still left to `new Date()`,\nwhich reads both correctly. Only the bare `YYYY-MM-DD` form changes.\n\nThe parts are also range-checked. `new Date(2026, 12, 45)` does not fail — it\nrolls forward to 14 February 2027 — and handing a malformed value back as a real\ndate is worse than refusing it, since the caller sends the result to the platform\nas the user\u0027s chosen date.\n\nCI now runs the unit suite a second time under `TZ\u003dAmerica/New_York`. Nothing\nelse in this project tests west of Greenwich: the runner\u0027s clock is UTC and\nplaywright.config.ts pins Asia/Kolkata, so a local/UTC mix-up is invisible to\nevery suite we have. That is how this shipped, and no assertion running only at\nUTC can catch its return — the three new cases pass at UTC either way.\n"
    },
    {
      "commit": "3f6d990dd6389e91af79b152ed33d31a1eb885ee",
      "tree": "a0586e96871054894cbbbf407d71ea030bf97015",
      "parents": [
        "4c96c29bee285b5c9694c17ea7ffce06682daf05"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 16:31:53 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 16:31:53 2026 +0530"
      },
      "message": "fix: format mobile shell e2e assertion\n"
    },
    {
      "commit": "e6b31e4d61c563818df962d7efeafb55c9c5f136",
      "tree": "2f20579ae0dcb3cb1133b0093c0118ca29b0c356",
      "parents": [
        "b0b4fa0976e93e54621a30eabbe10ce30f0d8f69",
        "15e399169e67d57dafedb1c83b3961306d17bcff"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 16:06:18 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 16:06:18 2026 +0530"
      },
      "message": "Merge pull request #502 from GruffElixir/fix/482-scrollable-login\n\nfix(login): keep form reachable in short viewports"
    },
    {
      "commit": "b0b4fa0976e93e54621a30eabbe10ce30f0d8f69",
      "tree": "84232842952c516f14acefaa10a99ea14940d889",
      "parents": [
        "3c6d7479e67f73eb733d04f50e2c96de91799ccf",
        "715d939adce9022c4d77ec39135e385b0d7f8b2f"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 16:05:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 16:05:39 2026 +0530"
      },
      "message": "Merge pull request #511 from Aman-Mittal/docs/drop-karma-test-command\n\ndocs: drop the Karma flags from the unit-test command"
    },
    {
      "commit": "715d939adce9022c4d77ec39135e385b0d7f8b2f",
      "tree": "8a5c6469c3d1487f182eac0c344c4967eb81ba24",
      "parents": [
        "c956bec0852a53707e17778a87da1cc4675fadcd"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 16:00:18 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 16:01:07 2026 +0530"
      },
      "message": "docs: drop the Karma flags from the unit-test command\n\n`--browsers\u003dChromeHeadless` no longer works. Under the Vitest builder the\noption needs a browser provider, and the check is for the bare `playwright` or\n`webdriverio` package. This project depends on `@playwright/test`, which does\nnot satisfy it, so the run dies before a single test:\n\n  Error: The \"browsers\" option requires either \"playwright\" or \"webdriverio\" to\n  be installed within the project.\n\n`--watch\u003dfalse` is harmless — the builder still takes a `watch` option — but it\nis redundant outside a TTY, where watch mode is already off.\n\nBoth files now name `npm run test:unit`, the command CI runs.\n"
    },
    {
      "commit": "3c6d7479e67f73eb733d04f50e2c96de91799ccf",
      "tree": "37ce162073b5c35ba8adfc73f32bf2fa2eec5643",
      "parents": [
        "c956bec0852a53707e17778a87da1cc4675fadcd",
        "71ebbb4acb053701fe8a5929ca689d0697e29d55"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 16:00:32 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 16:00:32 2026 +0530"
      },
      "message": "Merge pull request #509 from apache/chore/fineract-spec-sync\n\nchore(api): sync the Fineract OpenAPI spec"
    },
    {
      "commit": "4c96c29bee285b5c9694c17ea7ffce06682daf05",
      "tree": "80f563111752b002ee17de94ce4c83643bff298a",
      "parents": [
        "00851a2c714cea2464566f0906c4f0ac2f5cd4fe"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 15:37:27 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 15:37:27 2026 +0530"
      },
      "message": "test(dashboard): cover mobile column stacking\n"
    },
    {
      "commit": "71ebbb4acb053701fe8a5929ca689d0697e29d55",
      "tree": "37ce162073b5c35ba8adfc73f32bf2fa2eec5643",
      "parents": [
        "ae64b0d9a3d8c6f46aab1b00470da4d2e2b84946"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 15:26:04 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 15:29:42 2026 +0530"
      },
      "message": "fix(loans): send the parameters updateDisbursementDate actually takes\n\nThe regenerated client types the request body for\n`PUT /loans/{loanId}/disbursements/{disbursementId}`, which the previous spec\nleft as a bare `string`. That turned the call site into a compile error, and\nlooking at what the command really accepts showed the screen had never worked.\n\nVerified against a multi-tranche loan on a live 1.16.0-SNAPSHOT platform:\n\n  {\"expectedDisbursementDate\":\"25 August 2026\",\"principal\":725,\"note\":\"\"}\n  -\u003e 400  error.msg.parameter.unsupported  [principal]\n     400  error.msg.parameter.unsupported  [note]\n\n`updateDisbursementDate` takes the tranche\u0027s current date as\n`expectedDisbursementDate` and the edit as `updatedExpectedDisbursementDate`\nand `updatedPrincipal`, all three mandatory, alongside `dateFormat` and\n`locale`. It has no `note` at all, and one stray parameter fails the whole\nrequest, so the note field is gone rather than silently dropped.\n\nTwo smaller defects surfaced with it:\n\n- The platform answers with `expectedDisbursementDate` as a `[year, month,\n  day]` array even though the spec declares a string, so a plain text box\n  rendered `2026,8,25` to the user. It is now a date input fed by\n  `toEditableDate`, which handles both shapes.\n- Converting that value back for the wire cannot go through\n  `new Date(\u00272026-08-25\u0027)`, which is UTC midnight, because\n  `formatDateToFineract` reads the day back with local getters — a day earlier\n  for every user west of Greenwich. `isoToFineractDate` splits the parts by\n  hand instead.\n\nThe same body now returns 200 and the tranche moves:\n\n  {\"expectedDisbursementDate\":\"10 August 2026\",\n   \"updatedExpectedDisbursementDate\":\"25 August 2026\",\n   \"updatedPrincipal\":725,\"dateFormat\":\"dd MMMM yyyy\",\"locale\":\"en\"}\n  -\u003e 200, and GET answers [2026,8,25] / 725\n"
    },
    {
      "commit": "15e399169e67d57dafedb1c83b3961306d17bcff",
      "tree": "0438e1ca497751984234954442a108386791b111",
      "parents": [
        "b88c38220d2cf3880624d07f523e0de1774f4983"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 15:28:58 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 15:28:58 2026 +0530"
      },
      "message": "fix(login): add alignment fallback\n"
    },
    {
      "commit": "ae64b0d9a3d8c6f46aab1b00470da4d2e2b84946",
      "tree": "d125bd6297ce66c910a44be98bf5667e1be346f5",
      "parents": [
        "b6ef894f0363b1de11e0c6a743e8809642e70e4e",
        "c956bec0852a53707e17778a87da1cc4675fadcd"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 15:28:08 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 15:28:08 2026 +0530"
      },
      "message": "Merge remote-tracking branch \u0027apache/main\u0027 into pr509-ff\n"
    },
    {
      "commit": "c956bec0852a53707e17778a87da1cc4675fadcd",
      "tree": "acb0cfa284349f334adc456f965ea7faed97eb22",
      "parents": [
        "948df72a5034d28a430ff5dc281c275cedbf5412",
        "700bd85511a58940154c2cb25e06a4e3c40635d6"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 14:59:45 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 14:59:45 2026 +0530"
      },
      "message": "Merge pull request #508 from Aman-Mittal/feat/loan-refund-by-cash\n\nfeat(loans): offer Refund by Cash on a loan paid ahead of schedule"
    },
    {
      "commit": "b6ef894f0363b1de11e0c6a743e8809642e70e4e",
      "tree": "b73bc32038d52ed095929b672274f65039baa761",
      "parents": [
        "948df72a5034d28a430ff5dc281c275cedbf5412"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Sun Sep 06 09:20:11 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 09:20:11 2026 +0000"
      },
      "message": "chore(api): sync the Fineract OpenAPI spec and regenerate the client\n\n"
    },
    {
      "commit": "948df72a5034d28a430ff5dc281c275cedbf5412",
      "tree": "294803ee02385058cb5de22e67ca7550a3a39865",
      "parents": [
        "05df95b353bb7401a5769bfa0f6fb61ae28065d9",
        "ef38c30a44a91750c26ca14603454d491d836a51"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 14:46:33 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 14:46:33 2026 +0530"
      },
      "message": "Merge pull request #478 from vaishaldsouza/fix/448-regenerate-openapi-specs\n\nfix(api): regenerate OpenAPI specs and fix preprocessor execution (#448)"
    },
    {
      "commit": "700bd85511a58940154c2cb25e06a4e3c40635d6",
      "tree": "2ba73dec2de2b6451e1320a77936731738c180ef",
      "parents": [
        "7c51d90b02cfa7ae896881d9378a784bfb036789"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 14:45:56 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 14:45:56 2026 +0530"
      },
      "message": "feat(loans): offer Refund by Cash on a loan paid ahead of schedule\n\nThe platform accepts `refundByCash` on a loan transaction, but no screen\never sent it. It is the counter-side of taking a repayment: handing back\nmoney a borrower paid ahead of schedule, in cash, with no card or wallet\nrail behind it.\n\nThe shared transaction form already carries the whole request. It is\ndriven by the route\u0027s `:type` segment and posts\n`postLoansLoanIdTransactions(loanId, transaction, type)` with\ntransactionDate, dateFormat, locale, transactionAmount and paymentTypeId\n— exactly the body the command takes. So this is a menu entry, a title\nkey and `AMOUNT_VISIBLE_TYPES` membership, not a new form.\n\nOffered conditionally, per the rule #268 set for undo-last-disbursal.\nThe window is narrower than it first looks, and both edges were probed\nagainst a running platform rather than inferred:\n\n  active, nothing paid ahead   403 error.msg.loan.refund.amount.invalid\n                                   \"loan is not paid in advance\"\n  overpaid, therefore closed   400 error.msg.loan.refund.account.is.not.active\n\nSo the action needs the loan to be active *and* carrying an advance\nbalance, which is what `hasAdvanceBalance()` checks. `paidInAdvance` is\nabsent from the generated GetLoansLoanIdResponse (#448), so it is read\ndefensively — the same shape `isOverpaid` already uses for `status`.\n\nAddresses #506. Charge refund, the other half of that issue, additionally\nneeds a `loanChargeId` picker and is left for its own change.\n"
    },
    {
      "commit": "ef38c30a44a91750c26ca14603454d491d836a51",
      "tree": "d357083c0a7f1132a8c36406557e437d4c67766e",
      "parents": [
        "dc2fdb9b359efee1b2c947cc78841d82c7b8e48a"
      ],
      "author": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Sun Sep 06 14:33:48 2026 +0530"
      },
      "committer": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Sun Sep 06 14:33:48 2026 +0530"
      },
      "message": "chore: revert unintended changes to preprocess-spec.mjs\n"
    },
    {
      "commit": "05df95b353bb7401a5769bfa0f6fb61ae28065d9",
      "tree": "f1a4568b45da3fd12e3cf1c733c2f711a1ed5940",
      "parents": [
        "7c51d90b02cfa7ae896881d9378a784bfb036789",
        "3e6a476b14631bbdc41e8463a5bae22d0cffb84f"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 14:28:28 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 14:28:28 2026 +0530"
      },
      "message": "Merge pull request #501 from GruffElixir/fix/483-login-aria-invalid\n\nfix(login): delay invalid field announcements"
    },
    {
      "commit": "b88c38220d2cf3880624d07f523e0de1774f4983",
      "tree": "f25c30427438a7abbadf3a90a59a4f8bbb2feb59",
      "parents": [
        "1e873fd3cb44a7f08d0f2716d2904e7c06a6c908"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:18:02 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:18:02 2026 +0530"
      },
      "message": "fix(login): add small viewport fallback\n"
    },
    {
      "commit": "1e873fd3cb44a7f08d0f2716d2904e7c06a6c908",
      "tree": "c9e7f9cceed85f958c3cac2e3b21a44710ba2689",
      "parents": [
        "d2b75ef0eb21373ce560d1d09be2a6dc8f77f133"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:03:09 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:14:09 2026 +0530"
      },
      "message": "fix(login): keep form reachable in short viewports\n"
    },
    {
      "commit": "3e6a476b14631bbdc41e8463a5bae22d0cffb84f",
      "tree": "b56a2357cddc08c82eeeebe41651c3f3cd6d11fb",
      "parents": [
        "d2b75ef0eb21373ce560d1d09be2a6dc8f77f133"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:02:07 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:14:06 2026 +0530"
      },
      "message": "fix(login): delay invalid field announcements\n"
    },
    {
      "commit": "00851a2c714cea2464566f0906c4f0ac2f5cd4fe",
      "tree": "5dbff2308a90e5c162fb2162490b1aee0400a113",
      "parents": [
        "d2b75ef0eb21373ce560d1d09be2a6dc8f77f133"
      ],
      "author": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 13:58:55 2026 +0530"
      },
      "committer": {
        "name": "GruffElixir",
        "email": "136691411+GruffElixir@users.noreply.github.com",
        "time": "Sun Sep 06 14:14:02 2026 +0530"
      },
      "message": "fix(dashboard): stack widgets on mobile\n"
    },
    {
      "commit": "7c51d90b02cfa7ae896881d9378a784bfb036789",
      "tree": "ab2bdffd9271c99a4683ddfec24f8887c84a8286",
      "parents": [
        "5bc14c5884e4e98aaf1e31c969b48f9465d6a6f2",
        "435f18f01251c30990a0cb15d4dd1a8110f1b386"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 13:56:15 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 13:56:15 2026 +0530"
      },
      "message": "Merge pull request #498 from Aman-Mittal/fix/ui-findings-and-test-coverage\n\nfix(ui): five live-testing defects, plus Batch API and mobile-sidebar test coverage"
    },
    {
      "commit": "5bc14c5884e4e98aaf1e31c969b48f9465d6a6f2",
      "tree": "336999b531c6eb978197f0b21e696068058ae9b0",
      "parents": [
        "d2b75ef0eb21373ce560d1d09be2a6dc8f77f133",
        "af31444f4984fb0fefd264f16cf5c2117e3c426f"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 13:52:57 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 13:52:57 2026 +0530"
      },
      "message": "Merge pull request #495 from ryux1/fix/register-navigation-icons\n\nfix: register navigation-only icons"
    },
    {
      "commit": "435f18f01251c30990a0cb15d4dd1a8110f1b386",
      "tree": "9b5a62f39cc7fcda6eab88655f02fd4f34b739e5",
      "parents": [
        "dcb03083d252048d7b96da09957c52f619dc5ea5"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:45:33 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:45:33 2026 +0530"
      },
      "message": "test(e2e): follow the Guide label and the moved axe fingerprint\n\nTwo tests encoded the behaviour the UI fixes changed.\n\ne2e-journey asserted the Guide button by its old accessible name, \"Help\nTour\" — the very mismatch the fix corrects — so it looked for a control\nthat no longer answers to that name. Now asserts \"Guide\". Note\nfeature-coverage already matched /Help Tour|Guide/ and needed no change.\n\nThe client-form axe baseline already carries this violation twice:\nIonic renders ion-select\u0027s trigger as a `button` and reflects `required`\nonto it as `aria-required`, which ARIA does not allow on that role. The\nplaceholder did not introduce it — it added a `has-placeholder` class to\nthe host, and axe names a node by the shortest unique selector for it,\nso the fingerprint moved off `ion-select[name\u003d\"officeId\"]` and stopped\nmatching. Adds the third state-class variant and records why the\nfingerprint tracks host state, so this is not rediscovered next time.\n"
    },
    {
      "commit": "dcb03083d252048d7b96da09957c52f619dc5ea5",
      "tree": "56e67861722610ddcbdf5e70bbb3efb9791e86c5",
      "parents": [
        "4e24df7267649c8975ddb17c34dfaf54ecd60dd2"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:29:41 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:29:41 2026 +0530"
      },
      "message": "test: cover the sidebar\u0027s two viewport modes, and unbreak mobile login\n\nSidebarService and SidebarComponent behave as two different things\ndepending on viewport — a collapsible column on a wide one, a modal\ndrawer on a narrow one — and only the wide case was covered. Adds the\nnarrow-viewport half: the drawer is inert while closed, Escape and the\nclose button shut it, a completed navigation closes it so the\ndestination is not left behind an overlay, and leaving mobile clears the\ndrawer flag so returning does not restore an overlay nobody asked for.\n\nThe e2e login helper waited on `getByRole(\u0027navigation\u0027)`, which only\nresolves on a wide viewport: SidebarComponent\u0027s role is `navigation`\nthere but `dialog` once it becomes a modal drawer, so the helper could\nnever resolve for a mobile-viewport caller. Waits on #app-navigation\ninstead, which is stable across both modes.\n"
    },
    {
      "commit": "4e24df7267649c8975ddb17c34dfaf54ecd60dd2",
      "tree": "807d2e36c34839dc1432a4f37af29f08a727a985",
      "parents": [
        "86ee94c59a16b383ed45d2011259bbd9f0b9fa43"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:29:30 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:29:30 2026 +0530"
      },
      "message": "test(e2e): cover Batch API operations against a real backend\n\nMirrors Fineract\u0027s own BatchApi.feature scenario \"As a user I would like\nto run a sample Batch API scenario\" (TestRailId C63), whose glue code is\nBatchApiStepDef.runSampleBatchApiCall(). That scenario POSTs a four-step\nbatch straight through BatchApiApi; the Backoffice UI\u0027s equivalent\nsurface is /admin/batch-operations, so the same reference-chained batch\nis driven through that screen instead.\n\nThe point is the passthrough: `$.clientId` and `$.loanId` are Fineract\u0027s\nown batch reference syntax, resolved server-side, and a step\u0027s `body` has\nto stay a JSON *string* for the token to survive as literal text. This\nproves the UI\u0027s JSON.parse -\u003e BatchAPIService.postBatches path neither\ndrops nor reshapes what that substitution depends on.\n\nAdds seedLoanCharge to the seed helpers (a flat, specified-due-date LOAN\ncharge) and test ids to BatchOperationsComponent, which had no stable\nhooks on its textarea, submit, error text or results card.\n"
    },
    {
      "commit": "86ee94c59a16b383ed45d2011259bbd9f0b9fa43",
      "tree": "40a1c025d2fab5de588a6e28dddf667d0548075e",
      "parents": [
        "a24a06ba851b2bfb2ab87f5d04d7b3535375e57c"
      ],
      "author": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:29:18 2026 +0530"
      },
      "committer": {
        "name": "Aman Mittal",
        "email": "aman.mittal3052000@gmail.com",
        "time": "Sun Sep 06 13:29:18 2026 +0530"
      },
      "message": "fix(ui): correct five defects found in live testing\n\nPaginator: `rangeLabel` applied Fineract\u0027s \"of many\" sentinel whenever\n`length % pageSize \u003d\u003d\u003d 1`, which is the right hedge for a genuinely paged\nresponse but wrong for a caller that already holds the whole result set.\nOffices, backed by a plain-array endpoint, showed \"1 - 1 of many\" for its\nsingle record. Adds an `exactTotal` input (default false, so server-paged\nscreens are unchanged) and has DataTableComponent pass `localLogic()`.\n\nCreate Client: the required Office select rendered as a bare chevron with\nno text, while Legal Form beside it always shows a pre-selected value.\nAdds a placeholder through a new CLIENTS.SELECT_OFFICE key.\n\nHeader: the Guide button\u0027s accessible name was \"Help Tour\" while its\nvisible label reads \"Guide\", which Lighthouse flags as\nlabel-content-name-mismatch and which strands anyone told the visible\nlabel by a sighted assistant.\n\nindex.html: no meta description, so the page had nothing to offer a link\npreview or a crawler. The text is deployment-agnostic; the branding\noverlay covers appName and tokens at runtime, not static head content.\n\nNotifications: the one list screen that rendered an empty tbody rather\nthan an empty state, so \"nothing yet\" looked like \"failed to load\". Adds\na *cdkNoDataRow reusing COMMON.NO_DATA, matching the shared data table.\n"
    },
    {
      "commit": "d2b75ef0eb21373ce560d1d09be2a6dc8f77f133",
      "tree": "80f57ce6319f2f5f01eca932c4522ed0ae6bdada",
      "parents": [
        "a24a06ba851b2bfb2ab87f5d04d7b3535375e57c",
        "ae93bbebbacad5b85504a6a0fade82078204bc24"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 13:19:00 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 13:19:00 2026 +0530"
      },
      "message": "Merge pull request #481 from LE0-Lin/fix/edit-interest-pause\n\nfeat(loans): edit interest pause periods"
    },
    {
      "commit": "af31444f4984fb0fefd264f16cf5c2117e3c426f",
      "tree": "a0403026a2c6398e1af8c0d4e5f8419c20aeff15",
      "parents": [
        "a24a06ba851b2bfb2ab87f5d04d7b3535375e57c"
      ],
      "author": {
        "name": "ryux1",
        "email": "code@ryux1.dev",
        "time": "Sun Sep 06 09:38:34 2026 +0200"
      },
      "committer": {
        "name": "ryux1",
        "email": "code@ryux1.dev",
        "time": "Sun Sep 06 09:38:34 2026 +0200"
      },
      "message": "fix: register navigation-only icons\n"
    },
    {
      "commit": "a24a06ba851b2bfb2ab87f5d04d7b3535375e57c",
      "tree": "f84b78d6df68d88a52fea43e62cf3325797a6bb6",
      "parents": [
        "7c5fa4e014f9cbfaa83025184f3bd7cf23979b00",
        "299ecd9e8803e4cdfe45feacec14f11182646d2e"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Sun Sep 06 12:05:44 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 12:05:44 2026 +0530"
      },
      "message": "Merge pull request #480 from zhangxinyao88/codex/issue-328-empty-client-cta\n\nfeat(clients): add account CTAs to empty profile tabs"
    },
    {
      "commit": "ae93bbebbacad5b85504a6a0fade82078204bc24",
      "tree": "50c78f80eb536d2dbd0acaf35176acf2a09776b3",
      "parents": [
        "a639f810640447026f0cbf40fa4d6b797899a20a"
      ],
      "author": {
        "name": "Zhibo Lin",
        "email": "147509942+LE0-Lin@users.noreply.github.com",
        "time": "Sun Sep 06 14:10:41 2026 +0800"
      },
      "committer": {
        "name": "Zhibo Lin",
        "email": "147509942+LE0-Lin@users.noreply.github.com",
        "time": "Sun Sep 06 14:10:41 2026 +0800"
      },
      "message": "fix: record interest pause update API\n"
    },
    {
      "commit": "299ecd9e8803e4cdfe45feacec14f11182646d2e",
      "tree": "f84b78d6df68d88a52fea43e62cf3325797a6bb6",
      "parents": [
        "a0173da4e95b254a6952fc1cda8529489b61c072"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sat Sep 05 12:46:45 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sat Sep 05 12:46:45 2026 -0400"
      },
      "message": "test(e2e): mock business date for client CTA flow\n"
    },
    {
      "commit": "a0173da4e95b254a6952fc1cda8529489b61c072",
      "tree": "f2eee2c0ab7884696d758244dc4ff56e1638ac4f",
      "parents": [
        "6d28736e81b4e4fccec00d2f7f81bf73673319f4"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sat Sep 05 11:52:06 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sat Sep 05 11:52:06 2026 -0400"
      },
      "message": "test(e2e): capture empty account CTA states\n"
    },
    {
      "commit": "6d28736e81b4e4fccec00d2f7f81bf73673319f4",
      "tree": "d8d25cc732636ab4b9f4139d50d36eee31668ace",
      "parents": [
        "7acc0976d82d5e38a2dc6afcbbc04ef8aff5704e"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sat Sep 05 11:51:28 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sat Sep 05 11:51:28 2026 -0400"
      },
      "message": "test(e2e): cover empty client account CTAs\n"
    },
    {
      "commit": "7acc0976d82d5e38a2dc6afcbbc04ef8aff5704e",
      "tree": "80e69278ef5193bf50db4a719963562b97c30b62",
      "parents": [
        "c876d5e534b4883d7affe0764ff9632f5d64b037"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Fri Sep 04 23:57:48 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Fri Sep 04 23:57:48 2026 -0400"
      },
      "message": "test(clients): cover empty account CTA permissions and populated tabs\n"
    },
    {
      "commit": "a639f810640447026f0cbf40fa4d6b797899a20a",
      "tree": "e80de6d2ed45affc0b4c73c14ea6e0705e37e1c8",
      "parents": [
        "7c5fa4e014f9cbfaa83025184f3bd7cf23979b00"
      ],
      "author": {
        "name": "Zhibo Lin",
        "email": "147509942+LE0-Lin@users.noreply.github.com",
        "time": "Sat Sep 05 10:57:38 2026 +0800"
      },
      "committer": {
        "name": "Zhibo Lin",
        "email": "147509942+LE0-Lin@users.noreply.github.com",
        "time": "Sat Sep 05 10:57:38 2026 +0800"
      },
      "message": "feat(loans): edit interest pause periods\n"
    },
    {
      "commit": "c876d5e534b4883d7affe0764ff9632f5d64b037",
      "tree": "80ec3afbcd655c608f8480bcba475af7f6494db3",
      "parents": [
        "7c5fa4e014f9cbfaa83025184f3bd7cf23979b00"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Fri Sep 04 22:19:10 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Fri Sep 04 22:19:10 2026 -0400"
      },
      "message": "feat(clients): add account CTAs to empty profile tabs\n"
    },
    {
      "commit": "7c5fa4e014f9cbfaa83025184f3bd7cf23979b00",
      "tree": "66a49abf1e9b8685db5f196ce2f4d4ab1aaf1b71",
      "parents": [
        "dba29ba426a77f5f4af9f3169a6040b1b9256d21",
        "dc667e4daf82d653b622ac047d94bb7f9a6b538c"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Fri Sep 04 09:55:36 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 09:55:36 2026 +0530"
      },
      "message": "Merge pull request #479 from zhangxinyao88/codex/remove-karma-jasmine\n\ntest: remove deprecated Karma runner"
    },
    {
      "commit": "dc667e4daf82d653b622ac047d94bb7f9a6b538c",
      "tree": "66a49abf1e9b8685db5f196ce2f4d4ab1aaf1b71",
      "parents": [
        "dba29ba426a77f5f4af9f3169a6040b1b9256d21"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Thu Sep 03 19:07:14 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Thu Sep 03 19:07:14 2026 -0400"
      },
      "message": "test: remove deprecated Karma runner\n"
    },
    {
      "commit": "dc2fdb9b359efee1b2c947cc78841d82c7b8e48a",
      "tree": "d4dbdb7a6629a1505a478e7442043a20f9dbfd7c",
      "parents": [
        "f53187ccb05b8dbe67ab9468759a28b78a7daef1"
      ],
      "author": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Thu Sep 03 19:21:06 2026 +0530"
      },
      "committer": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Thu Sep 03 19:21:06 2026 +0530"
      },
      "message": "fix(test): remove zero-fraction numbers to resolve ESLint unicorn/no-zero-fractions\n"
    },
    {
      "commit": "f53187ccb05b8dbe67ab9468759a28b78a7daef1",
      "tree": "0de2dc77696fd8496d6546f34658aff8d7a5612f",
      "parents": [
        "0b74b4bef75e5d1cdfeab09621f8026cf6c74256"
      ],
      "author": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Thu Sep 03 18:48:30 2026 +0530"
      },
      "committer": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Thu Sep 03 18:48:30 2026 +0530"
      },
      "message": "fix(api): regenerate OpenAPI client against current upstream and fix floating-rate create/update payload split\n"
    },
    {
      "commit": "dba29ba426a77f5f4af9f3169a6040b1b9256d21",
      "tree": "c9cbb84859e3dc3c67254bdbc66a6c981bd70b13",
      "parents": [
        "88dd78cb04b9a124042bfa795e46dcf7a6bc6bfb",
        "9621fa7c71c2e4a21f4c908a4e8b2c1f77a830ca"
      ],
      "author": {
        "name": "Aman-Mittal",
        "email": "32237955+Aman-Mittal@users.noreply.github.com",
        "time": "Thu Sep 03 18:02:15 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 18:02:15 2026 +0530"
      },
      "message": "Merge pull request #476 from zhangxinyao88/codex/issue-406-loans-vitest\n\ntest(loans): migrate specs to Vitest"
    },
    {
      "commit": "0b74b4bef75e5d1cdfeab09621f8026cf6c74256",
      "tree": "dd978e913b4fc3875d46637affd0a0244e72c847",
      "parents": [
        "88dd78cb04b9a124042bfa795e46dcf7a6bc6bfb"
      ],
      "author": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Thu Sep 03 00:45:13 2026 +0530"
      },
      "committer": {
        "name": "Vaishal Dsouza",
        "email": "vaishaldsouza@gmail.com",
        "time": "Thu Sep 03 00:45:13 2026 +0530"
      },
      "message": "fix(api): regenerate OpenAPI specs and fix preprocessor execution (#448)\n"
    },
    {
      "commit": "9621fa7c71c2e4a21f4c908a4e8b2c1f77a830ca",
      "tree": "c9cbb84859e3dc3c67254bdbc66a6c981bd70b13",
      "parents": [
        "c52006f450b1493d2a9e536664c8811d97f36f7f"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Wed Sep 02 13:35:04 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Wed Sep 02 13:35:04 2026 -0400"
      },
      "message": "ci: skip Karma once migration reaches zero\n"
    },
    {
      "commit": "c52006f450b1493d2a9e536664c8811d97f36f7f",
      "tree": "12589f0f88c86f61dfc0bab06c31db430a0c90c6",
      "parents": [
        "88dd78cb04b9a124042bfa795e46dcf7a6bc6bfb"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Tue Sep 01 18:25:10 2026 -0400"
      },
      "committer": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Wed Sep 02 11:25:10 2026 -0400"
      },
      "message": "test(loans): migrate specs to Vitest\n"
    }
  ],
  "next": "88dd78cb04b9a124042bfa795e46dcf7a6bc6bfb"
}
