From d5c18258c471afe80306161e5e17b59b04667190 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 9 Sep 2026 10:32:27 +0300 Subject: [PATCH] spec: archive compact portfolio totals --- .../.openspec.yaml | 0 .../completion-evidence.md | 4030 +++++++++++++++++ .../design.md | 0 .../proposal.md | 0 .../specs/portfolio-view/spec.md | 0 .../tasks.md | 0 .../visuals/a1-error-stale-narrow.png | Bin .../visuals/a1-loading-narrow.png | Bin .../visuals/a1-long-320.png | Bin .../visuals/a1-long-wide.png | Bin .../visuals/a1-narrow.png | Bin .../visuals/a1-refresh-narrow.png | Bin .../visuals/a1-single-wide.png | Bin .../visuals/a1-wide.png | Bin openspec/specs/portfolio-view/spec.md | 245 +- 15 files changed, 4270 insertions(+), 5 deletions(-) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/.openspec.yaml (100%) create mode 100644 openspec/changes/archive/2026-09-09-compact-portfolio-totals/completion-evidence.md rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/design.md (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/proposal.md (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/specs/portfolio-view/spec.md (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/tasks.md (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-error-stale-narrow.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-loading-narrow.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-long-320.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-long-wide.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-narrow.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-refresh-narrow.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-single-wide.png (100%) rename openspec/changes/{compact-portfolio-totals => archive/2026-09-09-compact-portfolio-totals}/visuals/a1-wide.png (100%) diff --git a/openspec/changes/compact-portfolio-totals/.openspec.yaml b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/.openspec.yaml similarity index 100% rename from openspec/changes/compact-portfolio-totals/.openspec.yaml rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/.openspec.yaml diff --git a/openspec/changes/archive/2026-09-09-compact-portfolio-totals/completion-evidence.md b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/completion-evidence.md new file mode 100644 index 0000000..1c64624 --- /dev/null +++ b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/completion-evidence.md @@ -0,0 +1,4030 @@ +# Completion Evidence: compact-portfolio-totals + +## Delivery Map and commits + +- frontend: affected; delivery commit `47fbc212831058f1a0f1226dd262bf5c37870e34`. +- docs: affected; delivery commit `2985def574f1c22f9c41f6755b802342fafb30cd`. +- specs: affected; delivery commit `b06a35bbaab83700f3435b50a559614860e5c07c`. +- frontend: compact totals, exact currency presentation, accessible names and matching loading geometry. +- docs: as-built portfolio-view feature description. +- specs: approved planning, eight a1-symbols-r1 materials and completed Tasks 1.1–1.4, 2.1–2.2. +- backend: N/A; calculations, data acquisition and HTTP/OpenAPI contract unchanged. +- runtime-openapi: N/A; neither side of API contract changed. + +## Approval and Finalization checks + +All four approval fingerprints match; explicit owner message IDs and their preceding approval requests independently read in the two source tasks recorded below. Native status refreshed exact Delta membership. All eight Design material hashes match. Full PASS inventory re-expanded after delivery commits, including commit-hook execution: unchanged. All implementation Tasks checked. + +Semantic sync: three ADDED requirements have no identity collision; the one MODIFIED client state requirement preserves the two prior scenario identities with approved cache semantics and adds six scenarios. Existing Purpose and all unrelated requirements remain unchanged. Current specs instructions JSON is valid; optional rules absent. No audit-derived registry update applies. + +```json +{ + "proposal": { + "fingerprint": "sha256:ee68cbe232cbac748ac0a3174e875f6c841f298c4010f09ab9a905f0d7ee4463", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c0fe9ced94e036462642154fa7a16dd5df92ea465f6332b46de0afce7f9bd564" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "proposal", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/proposal.md" + ] + }, + "decision_source": { + "thread": "01a084a2-276b-77a0-b875-2b3e8e1b03e0", + "message": "01a084a5-dff2-7fd3-97d2-138876580d13", + "quote": "все ок, давай дальше" + } + }, + "specs": { + "fingerprint": "sha256:d62a508d1dcf3b63fcf4b698ba057adc332dc411cd9fa0c25ddb9fcae14d777d", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "c2ac78e160d85485d02cee24fd28abb45a947813b0266f3535d49ec6fd58b0bb" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "specs", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md" + ] + }, + "decision_source": { + "thread": "01a084a2-276b-77a0-b875-2b3e8e1b03e0", + "message": "01a084ab-709c-70f2-8833-066583e6692e", + "quote": "ок, идем дальше" + } + }, + "design": { + "fingerprint": "sha256:ea69a333dabc0e82280a5a78ee6dd724935cdbc2b3ea0b656f2759ee901a97a3", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/design.md", + "kind": "file", + "mode": "100644", + "sha256": "39fc7651a290c9380ab4e12bb76309082c4f2ebe5c5b8bdf7dbd3b48fcd1f7b0" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "c63c8a30cc932582f591422dd4871c6663cb55567218cee988d7119d77d4a4e3" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "138b000b334f54294f6cd8e88d607619608b05620231267fc1dc0477e1f87f46" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png", + "kind": "file", + "mode": "100644", + "sha256": "48d62eaa497819e6312f5ae56afa393f92c7bb0970543cd9b3abdd5960480534" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "ecccaee124c72b0f4f22bd92b31ef97e260c830782761ed9e7aab4c33a7e0af0" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "8ee71bb406abaa980e08f57c45e007fb66183786dfd251c9280a6ff62205d922" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "e453606105a96290a2d2358e039935c89187a90127ffe4228374ae6e16c9e252" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "6f163dd4a4ba461df5e715bab5757f4698986aade56ae38f02585d9c8d366b28" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "b406552e01098a5b95183d6a54bd59b3bf827387d33d73a6a453d83140b8da10" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "design", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/design.md", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-wide.png" + ] + }, + "decision_source": { + "thread": "01a084ad-40c8-78e3-9a70-654d4b62f390", + "message": "01a084b3-622f-7a31-98f7-b82aa1749371", + "quote": "окей, давай дальше" + } + }, + "tasks": { + "fingerprint": "sha256:d1ef7906b9f5cd27e93fdf1f42cb48f9da8f970cec5554e2edbc2e9f97ab2354", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "abcd9e150f392b4c10093f72168c6bc3cb7dae6a3991927ca41919cd490c0f6a" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "tasks", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/tasks.md" + ] + }, + "decision_source": { + "thread": "01a084ad-40c8-78e3-9a70-654d4b62f390", + "message": "01a084b6-68f1-7591-9a5c-d48fef8cb3bf", + "quote": "все ок, напиши промпт, чтобы продолжить дальше" + } + } +} +``` + +## Independent Validation evidence + +Source: independent task `01a084dc-4e2d-7d50-bfe7-18bf6162ae5e`, immutable `004-validation-1.md`. Verdict PASS; no Critical or Important findings. The following observed evidence and exact input binding are preserved from that record. + +## Completed work and relevant evidence +Independent reviewer task 01a084dc-4e2d-7d50-bfe7-18bf6162ae5e, separate from Implementation. Read shared protocol, lifecycle, context/governance authorities, state snapshot and only current 003-implementation-3.md. No older records read. All native Apply context files read; all eight a1-symbols-r1 PNGs independently viewed and raw SHA-256 verified. +Native status and instructions apply used --change compact-portfolio-totals --json --store wealth-ledger-specs (exit 0; /tmp/cpt-status.json, /tmp/cpt-apply.json). Fresh native Delta membership exactly specs/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md. All six implementation Tasks 1.1–1.4, 2.1–2.2 checked; none changed by this reviewer. +All four approval fingerprints matched current canonical paths; Tasks normalized only checklist progress. Explicit owner messages independently inspected through read_thread: Proposal/Specs task 01a084a2-276b-77a0-b875-2b3e8e1b03e0 and Design/Tasks task 01a084ad-40c8-78e3-9a70-654d4b62f390. Message IDs and scope match preserved state decision_source; each reply follows the corresponding approval request (Design includes all eight materials). + +### Fresh gates +Every Node execution activated applicable .nvmrc using source ~/.nvm/nvm.sh; nvm use --silent. Specs selected frontend runtime before cd ../specs. No saved Implementation gate reused. +- frontend cwd: npm ci (exit 0); npm run verify (exit 0). OpenAPI snapshot, TypeScript, Biome, coverage, Knip, dependency boundaries, app and Storybook builds pass. 26 test files, 136 tests passed; total coverage statements 90%, branches 85.22%, functions 88.12%, lines 91.74%. Logs /tmp/cpt-validation-frontend-install.log and /tmp/cpt-validation-frontend-gate.log. Existing build chunk-size warnings are nonblocking. +- docs cwd: npm ci (exit 0); npm run verify (exit 0). Markdown lint 44 files, zero issues; git diff --check passed. Logs /tmp/cpt-validation-docs-install.log and /tmp/cpt-validation-docs-gate.log. +- specs cwd: openspec schema validate wealth-ledger-sdd --verbose (exit 0), openspec validate compact-portfolio-totals --type change --strict --store wealth-ledger-specs (exit 0), openspec validate --specs --strict --store wealth-ledger-specs (exit 0, 25 passed / 0 failed). Logs /tmp/cpt-validation-schema.log, /tmp/cpt-validation-change.log, /tmp/cpt-validation-specs.log. + +### Independent semantic and acceptance review +Complete frontend working diff (including untracked PortfolioTotals.test.tsx), docs diff and native planning package reviewed. No production, tests, planning or Tasks edits. Only shared formatDecimal exports changed outside presentation/i18n; formatter algorithm and formatMoney behavior remain unchanged. Currency membership/order is direct input mapping; USD/CAD and unknown ISO stay distinct. dl/dt/dd establishes each currency/value pair, hidden accessible names are localized, decorative signs hidden; no card tab stops, live regions or interactions added. Negative first digit stays with minus; text bytes remain unchanged. CSS owns reflow, no JS measurements, rounding, clipping, ellipsis or domain aggregation added. +Account VM selects empty using positions and cashBalances and passes raw totals into unchanged loaded composition. Existing production query has staleTime 30000; application QueryClient disables retry and focus refetch; no polling configured. Fresh regression tests prove cached 503/404 -> retry -> successful USD -0.5 transition, retained UTC timestamps before success, server/client warning separation, loading, error actions and nonempty portfolios without totals. Synthetic browser callbacks are not substituted for this query integration proof. +Docs feature additions accurately describe this behavior. No new or changed Markdown links; scoped local-link review finds no introduced issue. Main portfolio-view baseline inspected for relevant monetary and state semantics; its old hide-on-expiry and unconditional 404 language is explicitly replaced by approved MODIFIED requirement. Other baseline behavior is retained. No debug/temp stories or new dependencies in delivery inventory. Required architecture ownership and frontend mandatory component conventions hold. + +### Independent browser evidence +Fresh localhost harness in /tmp/cpt-validation-browser imports actual current frontend AccountPageLoaded/Loading and actual CSS, i18n, theme and cssVariablesResolver; fixture controls and baseline comparison exist only in /tmp. Its main.tsx adapts the prior synthetic fixture source, whose data was independently checked. Prior implementation screenshots were not treated as independent proof. Vite invocation: frontend cwd, activated .nvmrc, ./node_modules/.bin/vite --config /tmp/cpt-validation-browser/vite.config.mjs. Initial sandbox bind EPERM; explicitly authorized escalated rerun on 127.0.0.1:6010 succeeded. Computer Use in-app Chromium inspected DOM, native AX and rendered screenshots. Relevant raw interaction/measurement outputs are in this reviewer task, tool calls titled “Подтвердить 56 случаев с полной конфигурацией theme и показать 200% reflow”, “Проверить loading geometry, занятость и отсутствие фокуса”, and “Проверить раздельные предупреждения, сохранённые суммы и клавиатурный retry”. +Final 56-case matrix = widths 320,390,767,769,991,993,1440 × normal/single/long/extra × CSS zoom 1/2. All exact expected strings match, zero grid/card/amount scrollWidth > clientWidth. Fixtures cover approved normal and long values, negative fraction, CAD, XYZ and 60-digit continuous fraction. No focusable card descendants. Baseline comparison uses HEAD presentation with same inputs, font, width and scale. +At 100% ordinary three totals: 191px vs 289.390625px on widths 320/390/767; 124px vs 187.59375px at 769/991; 57px vs 85.796875px at 993/1440. One ordinary total: 57px vs 85.796875px at all seven widths. Columns 1/2/3 match 48em/62em boundaries. Long values reflow below badge as needed; no fixed canvas line-break requirement. Enlarged text is allowed to increase card height by Design. +Observed style: white card, 1px gray-3 border, radius 8px, padding 12px; badge 40x24; amount 20px, weight 600, line-height 31px. Screenshots at narrow/wide and 200% match applicable card design; neighboring sections are unchanged and outside redesign scope. +Loading at all seven widths: 3 decorative 57px cards, expected columns, busy=true, no focusable descendants, zero overflow. Native AX reads Russian currency names and full amounts, no decorative duplicate symbols. Fresh browser states refresh/error/stale/error+stale/success preserve full totals and timestamp; only client error offers retry. Enter on actual Retry invokes callback, switches to progress while retaining totals/time. No totals with cash yields zero cards and visible cash section. Browser zoom evidence is CSS zoom 200%, not native browser UI zoom; browser checks use synthetic presentation props, integration tests prove actual cache transitions. These limits do not replace or weaken declared checks. + +## Input binding +Verdict source: this independent Validation task and this immutable record. Inventory was captured before fresh gates and re-expanded after checks; full byte-derived inventory and fingerprint identical. Roots cover entire frontend/docs/specs Git candidate membership, including dependency/config files, new nonignored files, current main baseline, raw planning/Tasks, all Design materials and local AGENTS. Relevant workspace instructions explicitly included. Own navigation files and completion-evidence excluded from self-hash; no unrelated repository changes excluded. Generated ignored node_modules/build artifacts are reconstructed outputs; npm ci binds dependencies to included lockfiles. Exact fingerprint procedure: context authority wealth-ledger-input-v1. Commit/staging alone does not invalidate this content binding. On reuse re-expand roots and retain former missing paths. + +```json +{ + "roots": [ + "frontend/", + "docs/", + "specs/" + ], + "exclusions": [ + "specs/openspec/changes/compact-portfolio-totals/completion-evidence.md" + ], + "workspace_paths": [ + ".agents/skills/sdd-session/SKILL.md", + ".agents/skills/sdd-session/references/workflow-protocol.md", + ".agents/skills/sdd-validation/SKILL.md", + "AGENTS.md" + ], + "purpose": "Full affected repository gate inputs and independent planning/delivery review; all Git candidate files, including new nonignored files. Ignored node_modules/build outputs excluded as generated; dependencies installed by npm ci. Backend N/A unchanged API/data contract.", + "fingerprint": "sha256:83d3e09bd8cd4462dee51d2cfa6b66aa524624434158f155714ce686ca1eb499", + "gate_fingerprints": { + "frontend": "sha256:468375ac62b6a08ce49b3a9bb54eb0e495e905111db48668e627e4163447d1a1", + "docs": "sha256:19832f7f3f44817e3ca1b43a3ae39c23e205b6b590047e1252fa85b3b314d26b", + "specs": "sha256:b0862db28fd59a26dd66d9a6d60aa664b4e61bacaabe1fae3ca190a18f3ebc8a" + }, + "inventory": [ + { + "path": ".agents/skills/sdd-session/SKILL.md", + "kind": "file", + "mode": "100644", + "sha256": "38e45d11b4e4f2aab18148930f10582d1badabf970537e47a8f89f73f8ab454a" + }, + { + "path": ".agents/skills/sdd-session/references/workflow-protocol.md", + "kind": "file", + "mode": "100644", + "sha256": "f4462e9fc6057064113e76ee6755d4b19db3ca07af9ce4379cb0c806b4437d06" + }, + { + "path": ".agents/skills/sdd-validation/SKILL.md", + "kind": "file", + "mode": "100644", + "sha256": "14831a87057ed7a2978ada0b7b1dbf7019aef74cef4ef78ed2091429c2d6ffcc" + }, + { + "path": "AGENTS.md", + "kind": "file", + "mode": "100644", + "sha256": "3e5ed52ca50a0424fb967a92afeaca6e162f3c16e01d0fcb352e48362235cd7f" + }, + { + "path": "docs/.gitignore", + "kind": "file", + "mode": "100644", + "sha256": "4d56952b0fb13bf8f9b6c13a6d4c34a075bac3af447636a1df4335d7576e2f97" + }, + { + "path": "docs/.markdownlint-cli2.jsonc", + "kind": "file", + "mode": "100644", + "sha256": "be63447d1d31bcedba10e009b12bd9bab07d5918bc8de8093865c74a54e7fe78" + }, + { + "path": "docs/.nvmrc", + "kind": "file", + "mode": "100644", + "sha256": "f14b4987904bcb5814e4459a057ed4d20f58a633152288a761214dcd28780b56" + }, + { + "path": "docs/AGENTS.md", + "kind": "file", + "mode": "100644", + "sha256": "a934307476c518f447a91c83e139b17860da32608cee69e210cb4ec985f5d9d1" + }, + { + "path": "docs/adr/001-prisma-sqlite-local-mvp.md", + "kind": "file", + "mode": "100644", + "sha256": "e43d6d771bebd53bc6864646cb13b5f7501d610edac17fe13b2e7ac945613757" + }, + { + "path": "docs/adr/002-nest-generated-openapi-contract.md", + "kind": "file", + "mode": "100644", + "sha256": "13b55e00d9e362d4764ef55976bb250ea78c0931a1da8f0453baaa091b5a8bd2" + }, + { + "path": "docs/adr/003-tbank-server-side-grpc-boundary.md", + "kind": "file", + "mode": "100644", + "sha256": "913388ffa0dec5dabed83e72805aa1074390ea09e600c35db744d7dd10385ed6" + }, + { + "path": "docs/adr/004-encrypted-per-user-tbank-token.md", + "kind": "file", + "mode": "100644", + "sha256": "7345db35f23bf7436a05749a7223191cdd43a0490b80252d57f8aed52cf5eb81" + }, + { + "path": "docs/adr/005-tbank-upstream-resilience.md", + "kind": "file", + "mode": "100644", + "sha256": "d176fe9d114c3f3cfef5437ad109fc4c0763996df13811f82d94db375ed81416" + }, + { + "path": "docs/adr/006-auth-session-policy.md", + "kind": "file", + "mode": "100644", + "sha256": "ad17b1ca13be43b476f47b4395eff0639162928a761fa0c540ba8d9f2de23661" + }, + { + "path": "docs/adr/007-react-query-fetch-policy.md", + "kind": "file", + "mode": "100644", + "sha256": "deb1c7cff757e6f500d8ba1a6982baaeb79d8fdf4aa0127cbc32d8530df86665" + }, + { + "path": "docs/adr/008-pino-backend-logging.md", + "kind": "file", + "mode": "100644", + "sha256": "3420b3fbe6893b08390366a418fed0e7024a5e8566c037b6d3e9158bf8fc3848" + }, + { + "path": "docs/adr/009-concurrent-refresh-rotation-policy.md", + "kind": "file", + "mode": "100644", + "sha256": "0eb9ec3f94fe5cd7eddf601d8dd98b1ea1c482c58f4af039ed0d36d9219d265f" + }, + { + "path": "docs/adr/010-native-openspec-sdd-and-local-orchestration.md", + "kind": "file", + "mode": "100644", + "sha256": "b53109e4c6ccf104a8ef87d8f8f007cf8291de6cf99351201741df390e89dee1" + }, + { + "path": "docs/adr/README.md", + "kind": "file", + "mode": "100644", + "sha256": "87397b932d073691809e8c7d16c0979e6251fe8babdd8c3545a951feef0dc13a" + }, + { + "path": "docs/architecture/README.md", + "kind": "file", + "mode": "100644", + "sha256": "e84fba694c45cb6d5c747e7b44a4678280794b828c33a7ce0c3b6dc75f38b614" + }, + { + "path": "docs/architecture/domain-glossary.md", + "kind": "file", + "mode": "100644", + "sha256": "246278c09dfe2a53cbece93b0db1ae1ab44f08cfa87167da2e5d98f37b39f8b1" + }, + { + "path": "docs/architecture/system-overview.md", + "kind": "file", + "mode": "100644", + "sha256": "6b9b0b24f3b22a0e78f6f3315045af33d101a31309eab9063f5f099ea002a921" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/README.md", + "kind": "file", + "mode": "100644", + "sha256": "b38ec6ac31d18cf6a4ceb8bf5c176640f8909c8d708884eb1d2106e503423321" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/deepseek-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "a2cc3b5ebf4c4ced326d4ca8cad1da59c725ae0538c5f5df0b885203d03177f4" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/gemini-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "528952869ceeef2502a90baadb9d4802aada1fbf342730acc35535f3adbc77e5" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/grok-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "a57789cb6f6c7f9415ba45a279d347ee8e5749063b62d2d9d8a4c214938d8136" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/kimi-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "67f5d725f548c221c824a90ee0254f2d4805479cd3069563c3732e844fd625b7" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/qwen-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "74b41a6c1f8302da649e00c5bf83b34804a604f0b0a563261fb3e5ac6f30abe5" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd-v2-review/zai-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "af06d4060e43d91ba2aac2ca453f0cea6a226fc0ccff66d68412c3d646018979" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd/README.md", + "kind": "file", + "mode": "100644", + "sha256": "7d9949ff660b77df66c6c1a863681dcd0ee6af00b131394ffa9c3154034c52a6" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd/deepseek-result.md", + "kind": "file", + "mode": "100644", + "sha256": "2d50f4c195507ceb079d69489c03f1ea8a81185e2594dd51ff6a293ab8198db8" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd/gemini-result.md", + "kind": "file", + "mode": "100644", + "sha256": "af95a4c208c993621a6c15102a1e26684eee6c2966b166f6ba23b600d0e33696" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd/kimi-result.md", + "kind": "file", + "mode": "100644", + "sha256": "31d423903cde2d7c1feb711cc625c77864964bb66cfd0cacb734c5c6bbdddd17" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd/qwen-result.md", + "kind": "file", + "mode": "100644", + "sha256": "1b6582efe55b7044d2bebc9c1a146df1963e4103c5517c259ccf617d6d2b4f14" + }, + { + "path": "docs/audits/2026-08-26-wealth-ledger-sdd/zai-result.md", + "kind": "file", + "mode": "100644", + "sha256": "0bdb7785087c8d1b6fe532d578804aa498bfc90935623d79c1003cd1899d5bad" + }, + { + "path": "docs/audits/2026-08-frontend-repository-audits/README.md", + "kind": "file", + "mode": "100644", + "sha256": "49054cc1df4206a105a2d192457012097fc1fe856d68b95dec7c497b8138ce31" + }, + { + "path": "docs/audits/2026-08-frontend-repository-audits/frontend-repository-audit-2026-08-28.md", + "kind": "file", + "mode": "100644", + "sha256": "6b7968ebeb7eac1017e2c75e7e7888486d8a232bed7730f760960d77c5343e24" + }, + { + "path": "docs/audits/2026-08-frontend-repository-audits/frontend-repository-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "1071171cfc987113ea209383c687b0b54932e5a390726ca62650b0de90a722b6" + }, + { + "path": "docs/audits/2026-08-frontend-repository-audits/frontend-structural-maintainability-audit.md", + "kind": "file", + "mode": "100644", + "sha256": "7b5de5c82951f70b8ec7431468ed5cffee3bcf98ba09b029d327a8bb72c1fc36" + }, + { + "path": "docs/audits/README.md", + "kind": "file", + "mode": "100644", + "sha256": "84d665f0cbe510f379e4473750c962ea1a0e2aa24161c86ef6f742ba66227f4b" + }, + { + "path": "docs/audits/audit-13-08-2026.md", + "kind": "file", + "mode": "100644", + "sha256": "3e5829193d0854156bcfac1214e7bfca60c6e8d8ce8db9154fa807a431c636c8" + }, + { + "path": "docs/audits/audit-20-08-2026.md", + "kind": "file", + "mode": "100644", + "sha256": "27e2cc3fc3ad3d3f2cdc20728d6b812254d923a2f0e1e45be2f14490ece0dabf" + }, + { + "path": "docs/audits/audit-24-08-2026.md", + "kind": "file", + "mode": "100644", + "sha256": "163085a69de87ba1dd28e3f82118786167f9c0489ea9dd2695cf9ab2e8a68bac" + }, + { + "path": "docs/audits/codex-sessions-token-audit-2026-08-26.md", + "kind": "file", + "mode": "100644", + "sha256": "e2d805d48dc793468bcc2f5126ab72cdfcfec6d1ec8d5916897dfe432192a73d" + }, + { + "path": "docs/development/README.md", + "kind": "file", + "mode": "100644", + "sha256": "08b06c2ad2c7e6ad32320a4cbc42e251a612ac82900ef74bbaecf376b4b1a2f9" + }, + { + "path": "docs/development/agent-token-efficiency.md", + "kind": "file", + "mode": "100644", + "sha256": "dae11d6a0dccc381d671173162740e74908c57414b4db07e12f79f316a13562a" + }, + { + "path": "docs/development/audit-remediation.md", + "kind": "file", + "mode": "100644", + "sha256": "be6a892e8f97dca5549b6508281f52d529946988408035ac8ce1801994423ce4" + }, + { + "path": "docs/development/backend-workflow.md", + "kind": "file", + "mode": "100644", + "sha256": "5c87fa0c931f56efddc0fa887627e55ec6728467c61fbf1394447f78cef9896d" + }, + { + "path": "docs/development/completion-evidence.md", + "kind": "file", + "mode": "100644", + "sha256": "5c1f3fb3c72613c25c8591355a56cdd10749295d22425df6dd7f36b27fbc2434" + }, + { + "path": "docs/development/design-system.md", + "kind": "file", + "mode": "100644", + "sha256": "2e82bb27e2c7dde5f31315f731c8cd97258570608dcc8518c9679688c8145eec" + }, + { + "path": "docs/development/engineering-governance.md", + "kind": "file", + "mode": "100644", + "sha256": "643822346cfa50a30e79d3bcfdd649a7902a43da7a8a31ce773e984fb179fa5c" + }, + { + "path": "docs/development/frontend-workflow.md", + "kind": "file", + "mode": "100644", + "sha256": "5eed875b21f69812ff92660ac3199f8b2a9e55427092f1e9713d8c81501feef7" + }, + { + "path": "docs/development/openspec-authority-and-lifecycle.md", + "kind": "file", + "mode": "100644", + "sha256": "ddf26cabeecc70b512fadc6c24958bc33c408cf91bbb45d49f9483a1851e4c31" + }, + { + "path": "docs/development/runtime-openapi-verification.md", + "kind": "file", + "mode": "100644", + "sha256": "499989c73752b75e7ba92c268c8eb5fdf26ea1e709467c63173a157a63b22014" + }, + { + "path": "docs/development/ui-catalog.md", + "kind": "file", + "mode": "100644", + "sha256": "4157bc32721a7aa76abbf45f69a250b9512c74ef4de2ac6186e13e72398cb8be" + }, + { + "path": "docs/features/README.md", + "kind": "file", + "mode": "100644", + "sha256": "2a38cae1914bcf930596cb893890e78c1a65faa91543564422fb6b38fa405bea" + }, + { + "path": "docs/features/authentication.md", + "kind": "file", + "mode": "100644", + "sha256": "68d987a914c0a37e7e39fae167be0aad25c8f33552999a0f9d0eb35776bccdfe" + }, + { + "path": "docs/features/brokerage-account-income-analytics.md", + "kind": "file", + "mode": "100644", + "sha256": "bf7b7a0f8ce554efa762574c45608938aa8fb51db4d01dc9a6c3dbc13f63c5f2" + }, + { + "path": "docs/features/brokerage-account-ledger.md", + "kind": "file", + "mode": "100644", + "sha256": "b2d10d9da77e6e96c511b2f4bb55dfa87da4f530c4c9666a49b93b835b4647d1" + }, + { + "path": "docs/features/brokerage-account-upcoming-events.md", + "kind": "file", + "mode": "100644", + "sha256": "f041f612a4cdf784ce75e11fcea673f673bcf2cfe5b63602277a0c976935b7e2" + }, + { + "path": "docs/features/brokerage-accounts.md", + "kind": "file", + "mode": "100644", + "sha256": "7e32238f1addf3e229b210ecf35f112d742e40dcf9bda42e545f2961250309ea" + }, + { + "path": "docs/features/frontend-ui-resilience.md", + "kind": "file", + "mode": "100644", + "sha256": "fffcfa56a1d9d073db603d4e42e739b47ba2066acca51e994c1b7b7eaac43f27" + }, + { + "path": "docs/features/portfolio-view.md", + "kind": "file", + "mode": "100644", + "sha256": "f8261c9e799ce648df98a3b08642cd25a118aa964d8aed30a397141b0ccce47e" + }, + { + "path": "docs/features/tbank-connection.md", + "kind": "file", + "mode": "100644", + "sha256": "0846ccfa3c2a821fea374c3bebba0038d449a7e588fcd6e4871a9d7d04668702" + }, + { + "path": "docs/package-lock.json", + "kind": "file", + "mode": "100644", + "sha256": "e71ed9ea9040268cbb5f4002bf7a60d85f1808fc3eb5288305eae35559088d55" + }, + { + "path": "docs/package.json", + "kind": "file", + "mode": "100644", + "sha256": "f183b2f571b7ff73af7a071d49be568f3616c8e84b91127358ed679778227973" + }, + { + "path": "frontend/.env.example", + "kind": "file", + "mode": "100644", + "sha256": "71153d43d010a50437ea3c54c34fd26c55470399219021918428a0a7178e9213" + }, + { + "path": "frontend/.gitignore", + "kind": "file", + "mode": "100644", + "sha256": "1820d069d49f5ea71159a8d50e55db1d02b5010825e1da111386a0a5be01eaed" + }, + { + "path": "frontend/.husky/commit-msg", + "kind": "file", + "mode": "100755", + "sha256": "ba793c27e4dd0c45841bb290fb8771ef92611eebfd7b8fde2f15394b2baa7dee" + }, + { + "path": "frontend/.husky/pre-commit", + "kind": "file", + "mode": "100755", + "sha256": "3166f419c8d677f3556b87d2c1a502664cfebe9c7d2149ac3699359c30e2409d" + }, + { + "path": "frontend/.nvmrc", + "kind": "file", + "mode": "100644", + "sha256": "f14b4987904bcb5814e4459a057ed4d20f58a633152288a761214dcd28780b56" + }, + { + "path": "frontend/.storybook/dependency-cruiser.cjs", + "kind": "file", + "mode": "100644", + "sha256": "0d30b6034cab756bb1beb1cbd720c8fe73026278aeb0100f17e0133582547694" + }, + { + "path": "frontend/.storybook/main.ts", + "kind": "file", + "mode": "100644", + "sha256": "0ee75a2839e02389cdfe113cafaf61b4ceae864656a5bf0e603c5b9de096d61c" + }, + { + "path": "frontend/.storybook/preview.tsx", + "kind": "file", + "mode": "100644", + "sha256": "05434fa7b625bf0ecb58c0d81684b30055c6c6ee6cb2b42b38591e7a33781ba3" + }, + { + "path": "frontend/AGENTS.md", + "kind": "file", + "mode": "100644", + "sha256": "cacf1dc8f6dad83c1c35212ed806204eb28faf9bc8d7217cb2da372411008cc7" + }, + { + "path": "frontend/README.md", + "kind": "file", + "mode": "100644", + "sha256": "ffdaeb7f2a05d3f842f102766f7471fd66c470728884410bc6d90a637b1721a5" + }, + { + "path": "frontend/biome.json", + "kind": "file", + "mode": "100644", + "sha256": "d42ba2c972d01e98cb03a474c50afed340e426cb6ff98bcf7495eacaf8372f0f" + }, + { + "path": "frontend/commitlint.config.cjs", + "kind": "file", + "mode": "100644", + "sha256": "eda2b3989c752320cce88af66b8d488ca4c6f8c417fcd3b9f4e8fd54fbda9284" + }, + { + "path": "frontend/dependency-cruiser.cjs", + "kind": "file", + "mode": "100644", + "sha256": "c931344af98938f3e4df01abb0db759b3e47d16084fc7c198edff2a846f5021d" + }, + { + "path": "frontend/docs/API-LAYER.md", + "kind": "file", + "mode": "100644", + "sha256": "9bc5e3fa848a49f7990c2d2727381d47c21ec9d4ea73a7223d5ae3c93be14f88" + }, + { + "path": "frontend/docs/CONVENTIONS.md", + "kind": "file", + "mode": "100644", + "sha256": "75fb467b458a40e49d6a837cbc22809838f15e1010e8f6c7d671414b5e833b80" + }, + { + "path": "frontend/docs/README.md", + "kind": "file", + "mode": "100644", + "sha256": "4a4f69aab159b4f6e68b0d7d1e5b997691db3c0dc77b8ea367eeb4354c3b3986" + }, + { + "path": "frontend/docs/STRUCTURE.md", + "kind": "file", + "mode": "100644", + "sha256": "f6fdec18b0b86baad1009b40d431d9d5c66b5aee3cd2e676e9836d52a367c50a" + }, + { + "path": "frontend/docs/TESTING.md", + "kind": "file", + "mode": "100644", + "sha256": "85dd9e70440f2d395eee30d9790ba2e0eabba69c5571578dad9c475144d478ea" + }, + { + "path": "frontend/docs/UI-PATTERN.md", + "kind": "file", + "mode": "100644", + "sha256": "13e90ca029e66456a066d67ce8338294ca540bf2fd368309c59571ef23d2588c" + }, + { + "path": "frontend/index.html", + "kind": "file", + "mode": "100644", + "sha256": "71a8cff454e6f9f761a0a934d3cd58f8fa72d1c6281e53ae22b38711b8730288" + }, + { + "path": "frontend/knip.json", + "kind": "file", + "mode": "100644", + "sha256": "a195a4ae649c0d6998ae34328481f2b7426c658c3dcfb40ff69c11bb7cceea08" + }, + { + "path": "frontend/package-lock.json", + "kind": "file", + "mode": "100644", + "sha256": "341a036a0fce7efd6f507e09893b6613ee3513d70b6cb4cb3733e14ecb6ce1d5" + }, + { + "path": "frontend/package.json", + "kind": "file", + "mode": "100644", + "sha256": "a375786c0da27d74347539ed395135f540bb94d8a0ff40a5bc425ba66f87996e" + }, + { + "path": "frontend/public/favicon.svg", + "kind": "file", + "mode": "100644", + "sha256": "a63748301b50343c1bf3729564d40e36633ce8847987c280ac2f5a3646841b0d" + }, + { + "path": "frontend/public/icons.svg", + "kind": "file", + "mode": "100644", + "sha256": "8a06bf817b3cb62c3c9e7585dd5975d66c6be15e63d565daea59d4cac40a4a39" + }, + { + "path": "frontend/scripts/check-openapi.mjs", + "kind": "file", + "mode": "100644", + "sha256": "e03760ce70a5e7fee38f2862ddc559c31ab18423b475c03619b7f9854906c937" + }, + { + "path": "frontend/src/app/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "916c2f50916e33565bd7d55e4b751ba227bc516de53704d59df58b5efe0727c9" + }, + { + "path": "frontend/src/app/routes/AppRoutes.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "270e09cb6081ed03f60e64df61aae4614370ae1a85577b9ea73b40473854430f" + }, + { + "path": "frontend/src/app/routes/AppRoutes.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2fa3448504fd351d53856f80e82ab4f5e6f7616c2ee51fca765602e08302efd9" + }, + { + "path": "frontend/src/app/routes/ProtectedLayout.tsx", + "kind": "file", + "mode": "100644", + "sha256": "e9f05e96f393e161b039d342440b64d14f0656431a1712e043735b6b855294a1" + }, + { + "path": "frontend/src/app/routes/RouteErrorBoundary.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "cb21d17cc519ecd294f49bf7e81758b95012a58eb3874497bf8deaefa8ca6d1a" + }, + { + "path": "frontend/src/app/routes/RouteErrorBoundary.tsx", + "kind": "file", + "mode": "100644", + "sha256": "45d27f3afda5c382751f6e3cc8547a1c4562361eb8780ddb7e577256ce865d0b" + }, + { + "path": "frontend/src/app/routes/RouteFallback.tsx", + "kind": "file", + "mode": "100644", + "sha256": "187b0c0c3a828d8828d8b234d5ba722fbbdc246ed8c852548f323ce5e52e455d" + }, + { + "path": "frontend/src/app/routes/RouteGuards.tsx", + "kind": "file", + "mode": "100644", + "sha256": "0ece306b18df665427bf00794ffc52112f3893321edd4c01cb2cf709911b6a34" + }, + { + "path": "frontend/src/app/routes/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "5349945f286313fd06df177d43d226b727646056fbfea4ab737ac5301790eac7" + }, + { + "path": "frontend/src/app/ui/AccountBreadcrumbs.tsx", + "kind": "file", + "mode": "100644", + "sha256": "c38291e83facd7105c710e8e1827d9d8adc01c98943cfb3449bea6e90e5f5826" + }, + { + "path": "frontend/src/app/ui/App.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2cffedebe0b98d60bfe8d1d26752dcd3ee1b0da3a4b575d1bdb03471dff0030e" + }, + { + "path": "frontend/src/app/ui/AppBreadcrumbs.module.css", + "kind": "file", + "mode": "100644", + "sha256": "5ee3c223a10327120bed54a71b9d22023d8597e9db347e9e91f5c9276a33c7da" + }, + { + "path": "frontend/src/app/ui/AppBreadcrumbs.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "a881a844060e88f2d0f062ff232160eb35980587a7e22794186183acddfcde2c" + }, + { + "path": "frontend/src/app/ui/AppBreadcrumbs.tsx", + "kind": "file", + "mode": "100644", + "sha256": "94335087a5c175c313b072801536480e3b48057bf19e00213d812d06198010b7" + }, + { + "path": "frontend/src/app/ui/BreadcrumbTrail.tsx", + "kind": "file", + "mode": "100644", + "sha256": "ab0ce496eb8d73c015719f36f0c66e98a9d3da4c56cdfdd5fd69848dc40c2269" + }, + { + "path": "frontend/src/app/ui/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "77fd6a747b349594d3c4145bc0e2bbb3e90d70a5b7805e94557e3a7d5136200f" + }, + { + "path": "frontend/src/assets/hero.png", + "kind": "file", + "mode": "100644", + "sha256": "881ffbcaafc212e49addad08846a5b82761355fa20624253af3477ba33262c5c" + }, + { + "path": "frontend/src/assets/react.svg", + "kind": "file", + "mode": "100644", + "sha256": "35ef61ed53b323ae94a16a8ec659b3d0af3880698791133f23b084085ab1c2e5" + }, + { + "path": "frontend/src/assets/vite.svg", + "kind": "file", + "mode": "100644", + "sha256": "5be21acd42eb7b896e517f4e0f0f11eb5c5d9e54fbbcebe9453f033008fcca6f" + }, + { + "path": "frontend/src/entities/broker-operation/api/useBrokerageOperations.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "8e926e8984f57c554a129b43a71ab32ad6964f7d42544084de52503808df807c" + }, + { + "path": "frontend/src/entities/broker-operation/api/useBrokerageOperations.ts", + "kind": "file", + "mode": "100644", + "sha256": "940c1e6828af0a0111f44ea7b3e459e53e0fbae51147c4408b64503150655ed5" + }, + { + "path": "frontend/src/entities/broker-operation/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "4e09b8b326c418535e843d5ce6a40e781982e0309771f2c39662a81aaf35fa2e" + }, + { + "path": "frontend/src/entities/broker-operation/model/display.ts", + "kind": "file", + "mode": "100644", + "sha256": "c2f624d4159f6abef51a02ae891b4756f8d891219a2fa40f19371bcc769bbfbb" + }, + { + "path": "frontend/src/entities/broker-operation/ui/LedgerEntryRow.module.css", + "kind": "file", + "mode": "100644", + "sha256": "c20f2c6fc42362f1f5786a58b7ab81fb70d4a620438a8b2d1f85de1edd4f49cb" + }, + { + "path": "frontend/src/entities/broker-operation/ui/LedgerEntryRow.tsx", + "kind": "file", + "mode": "100644", + "sha256": "1b863f3e11e53b820135d8c8f74c1f51868528abcec866a3a0bb90dd0dd9bb7e" + }, + { + "path": "frontend/src/entities/brokerage-account/api/useBrokerageAccounts.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "5547bba2b73d4362bf8a28c9542c552d27895176af85dc0e2815514dbc42f3f6" + }, + { + "path": "frontend/src/entities/brokerage-account/api/useBrokerageAccounts.ts", + "kind": "file", + "mode": "100644", + "sha256": "777dc47b9e5373d00d1e9aafeda16d903961332044a8a53bce75b27cb4e2e970" + }, + { + "path": "frontend/src/entities/brokerage-account/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "c39922c507a2fd0b00555e6403258d453a44c3ff6d15bc5549664b49ff7d465f" + }, + { + "path": "frontend/src/entities/brokerage-account/model/display.ts", + "kind": "file", + "mode": "100644", + "sha256": "cf8ac5c71ed4880c4ecdda54d9654490d541497dad837398d2e768aeda09c5b7" + }, + { + "path": "frontend/src/entities/brokerage-account/ui/BrokerageAccountList.module.css", + "kind": "file", + "mode": "100644", + "sha256": "1214d8657833a336190a037745c88e205d03162a2a5c6fea7dc4a7e89b8194b3" + }, + { + "path": "frontend/src/entities/brokerage-account/ui/BrokerageAccountList.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "f901105c428c0c1149ff6ae6fc180d853036d6e5b5fa7d114f58f019a6f4a804" + }, + { + "path": "frontend/src/entities/brokerage-account/ui/BrokerageAccountList.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "8b8c836509486010ea3d1e6103edcf16cb5845ed5b8b174fe76a6c7ab4487855" + }, + { + "path": "frontend/src/entities/brokerage-account/ui/BrokerageAccountList.tsx", + "kind": "file", + "mode": "100644", + "sha256": "c77c41ca8984c36402b2ae23a178e7e3d2a6955e76fa0ddfd82e61054702a815" + }, + { + "path": "frontend/src/entities/brokerage-event/api/useBrokerageEvents.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "63211bf87150b004c58404d6a41806148eaddd945272ce7934ca88266d137896" + }, + { + "path": "frontend/src/entities/brokerage-event/api/useBrokerageEvents.ts", + "kind": "file", + "mode": "100644", + "sha256": "8b0d8a3d3202aedd69efca839e777711b44d8c79b677cedf75b2a0941673c1d7" + }, + { + "path": "frontend/src/entities/brokerage-event/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "6e8a418ef85d3fa95f6a727297a70609f01160ef254ff8b4d1dffb0c16b4b9e9" + }, + { + "path": "frontend/src/entities/income/api/useIncome.ts", + "kind": "file", + "mode": "100644", + "sha256": "e4f29cab3639aca0750913c364b01f5d876784f2abd19c98f94994f3a1b761d6" + }, + { + "path": "frontend/src/entities/income/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "31be30a5f707316af8a3307bd86d38a4152a5601170f7defca637aca1b6b667d" + }, + { + "path": "frontend/src/entities/portfolio/api/usePortfolio.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "3ca6f73af2e1bf44c88eec3590e7ffe072e617d4401cf7a23643ff8ef44782a2" + }, + { + "path": "frontend/src/entities/portfolio/api/usePortfolio.ts", + "kind": "file", + "mode": "100644", + "sha256": "db5edf155da5992f4f60e2909c2d9872b69add47a778a4a15808b1381bbbc21e" + }, + { + "path": "frontend/src/entities/portfolio/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "741bed6b52affbde608fa3809e153db54ce0e5368f61c86ecfd97b41f3173db7" + }, + { + "path": "frontend/src/entities/portfolio/model/display.test.ts", + "kind": "file", + "mode": "100644", + "sha256": "bd7a0c75ca7aac94c99addc4a80150432958b966d20689f6858798460aa32bb6" + }, + { + "path": "frontend/src/entities/portfolio/model/display.ts", + "kind": "file", + "mode": "100644", + "sha256": "05c82e80532566ad042d0c4a8e491cf853a6fe3a5a8a5ee1e64afa2cd21d9abc" + }, + { + "path": "frontend/src/features/auth/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "e753ea28bc12ee02b3f5c5c88e0135b0647cfc923f31c067585752b359d7dccb" + }, + { + "path": "frontend/src/features/auth/model/auth.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "124b93ecd38607425930067a6021f0a73c0b49d94c86693169df200c7f924d7d" + }, + { + "path": "frontend/src/features/auth/model/auth.tsx", + "kind": "file", + "mode": "100644", + "sha256": "3cabda4d2c863cd7ec4edc26e783086d3cded61dbcf600c396b8e248e6727111" + }, + { + "path": "frontend/src/features/auth/model/validation.ts", + "kind": "file", + "mode": "100644", + "sha256": "3a75a1cfcf0adff1ad15fcd8e030d63731dd6a8c3a8195ea3758b81d21434ca1" + }, + { + "path": "frontend/src/features/auth/ui/AuthForm.module.css", + "kind": "file", + "mode": "100644", + "sha256": "d45861d840614c9f3226ffcb82397feae7b63415aef47967ba609d4c830880ad" + }, + { + "path": "frontend/src/features/auth/ui/AuthForm.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2ecce514e944a596158b4c7a9a62dc71e27035a2dad30d244c470f1acf27a43f" + }, + { + "path": "frontend/src/features/auth/ui/AuthForm.tsx", + "kind": "file", + "mode": "100644", + "sha256": "8324ca8b2435d72f9808869c7884b7e8ab3fe511141dd076472970815b1b9635" + }, + { + "path": "frontend/src/features/auth/ui/AuthPageLayout.module.css", + "kind": "file", + "mode": "100644", + "sha256": "0f0d56b173312701a8b0412bb8b6da3f098a867b131c4b23d442ecbc79061cf7" + }, + { + "path": "frontend/src/features/auth/ui/AuthPageLayout.tsx", + "kind": "file", + "mode": "100644", + "sha256": "83111c2fb3517b80756f890ca3f7d5d9f6da5e5d9758b7ff5d840a979a8c083e" + }, + { + "path": "frontend/src/features/auth/ui/LoginForm.tsx", + "kind": "file", + "mode": "100644", + "sha256": "8e4561241c21d14c87e4b9f5d413d8bbe0adeeb4204fb8b91b5b6b735aa443d3" + }, + { + "path": "frontend/src/features/auth/ui/RegisterForm.tsx", + "kind": "file", + "mode": "100644", + "sha256": "946ac85c6efb952092fac8a8f6a58c26ed27d9eebf57c609935f0d0517824e92" + }, + { + "path": "frontend/src/features/tbank-connection/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "fb48585faea80f8e1f252e222a7256486518d767b66032d111deeededd3113ca" + }, + { + "path": "frontend/src/features/tbank-connection/model/connection-boundary.ts", + "kind": "file", + "mode": "100644", + "sha256": "673636a6275565755a383cba89a29c42c61ade16fd499308103aa9d9cbb32d73" + }, + { + "path": "frontend/src/features/tbank-connection/ui/TbankConnectionSection.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "a1324a729d5a4a4545a5431c170e50c205df0fc7a17aef3af3e7acfedd263087" + }, + { + "path": "frontend/src/features/tbank-connection/ui/TbankConnectionSection.tsx", + "kind": "file", + "mode": "100644", + "sha256": "87b3e3d0c114166c6c9c5cde6a99bfdbd6b3a6ae342e744a0734fb6a7630870f" + }, + { + "path": "frontend/src/features/tbank-connection/ui/TbankConnectionSection.view.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "690d130a1ae2d4e49b1e05349ef70123a48baadee13f6778f058d3d02c439399" + }, + { + "path": "frontend/src/features/tbank-connection/ui/TbankConnectionSection.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "5095f80b8a698c78beff4f6ee6688a76d058929813475298976458df1ec33c68" + }, + { + "path": "frontend/src/features/tbank-connection/ui/TbankConnectionSection.vm.ts", + "kind": "file", + "mode": "100644", + "sha256": "09fd1fecdc3b3261f0e48072ef42a75bbaa92100861b4e4564ceab27044d5095" + }, + { + "path": "frontend/src/features/tbank-connection/ui/TbankConnectionSectionLoaded.tsx", + "kind": "file", + "mode": "100644", + "sha256": "ef66e1d01c4bcf752b1c77f4e27bd01f23afa5ce3527b5b13001fad1d03bacc0" + }, + { + "path": "frontend/src/main.tsx", + "kind": "file", + "mode": "100644", + "sha256": "ba06f55346657614504488b64c12f11c2fcde3f7f407f627a53cd378f10ed362" + }, + { + "path": "frontend/src/pages/account-events/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "8ca150b0224671f8aedf2e9c51d5d8cf07a99aa88e8ad2ad631869a0852eb3c4" + }, + { + "path": "frontend/src/pages/account-events/ui/AccountEventsPage.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "092266dce3058a0888f809b0b2edfd91fb93d0412ae21409021352cbb31747b6" + }, + { + "path": "frontend/src/pages/account-events/ui/AccountEventsPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "ef4a005d7cd955db6e9c8caa525593417dbc836587801118f07026d9108b71bf" + }, + { + "path": "frontend/src/pages/account-events/ui/AccountEventsPage.vm.ts", + "kind": "file", + "mode": "100644", + "sha256": "c73bc8df3b9a16703a853823864df62525eb0808f6cf4306d46763a16909b426" + }, + { + "path": "frontend/src/pages/account-events/ui/components/AccountEventRow.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "7e68b58167a4b94e36a53bd6afa46f02a15812bbcc2134f8d9db895b36140677" + }, + { + "path": "frontend/src/pages/account-events/ui/components/AccountEventsPageEmpty.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "d107a120c5b0b2fcb5148a9a5295de9e70ca1143d9aa463c052099d8e0beae23" + }, + { + "path": "frontend/src/pages/account-events/ui/components/AccountEventsPageError.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b592d310ef3f3f3903ec928ed80be8090ec03458b82df9595958d9ebe2fe24ce" + }, + { + "path": "frontend/src/pages/account-events/ui/components/AccountEventsPageLoaded.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2231260ea36c10973d99b04aa669ea005b5a170f717110f8c2918d8b753028aa" + }, + { + "path": "frontend/src/pages/account-events/ui/components/AccountEventsPageLoading.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "87c15175cff3ffd21ee5600ac7bc6778cb9a5d62787a067a3140825ad70296d7" + }, + { + "path": "frontend/src/pages/account-income/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "6e4320e2d46dd1f9205da955915d1dcd8c52ddfc99dc0eefd529ed473560a0ca" + }, + { + "path": "frontend/src/pages/account-income/ui/AccountIncomePage.module.css", + "kind": "file", + "mode": "100644", + "sha256": "948c2c317aa93c8a15cf7f5221980b8063a8326bf70641e7c2403d23eb6e2df7" + }, + { + "path": "frontend/src/pages/account-income/ui/AccountIncomePage.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "5844d4515ce3fd04cf3d283039d9c5e396f6b2742ee6f01e0312c55c25562dc0" + }, + { + "path": "frontend/src/pages/account-income/ui/AccountIncomePage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "7d96d2fe6ccc62bb29e82b71dd26c82de4c7a6cd783c24177ab6dab7df712b9b" + }, + { + "path": "frontend/src/pages/account-income/ui/AccountIncomePage.vm.ts", + "kind": "file", + "mode": "100644", + "sha256": "0c98d08ec0c2ed37fccc6c573293b97a0fa61a7d0202c07f7d80eb56a30d88f9" + }, + { + "path": "frontend/src/pages/account-income/ui/components/AccountIncomePageError.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "881bf2279bc644094096ba09c377e5d5f47fd8d18fca4316377e867d69c6b5b6" + }, + { + "path": "frontend/src/pages/account-income/ui/components/AccountIncomePageLoaded.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "f961337393750024699e33eaeaf4f4223842a338a4c4dc7b609f2c61efd3c465" + }, + { + "path": "frontend/src/pages/account-income/ui/components/AccountIncomePageLoading.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "fb799544f998d4d9082e6decaa1e4e97784adc1196196bc5c85341a931dddb6d" + }, + { + "path": "frontend/src/pages/account-income/ui/components/IncomeBreakdown.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "97bf6d52cc7289a9814bdbb8a3180db40d5c56728c641846d29a83092b4f8063" + }, + { + "path": "frontend/src/pages/account-income/ui/components/IncomeComparisons.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "97a5cc4b73214a0785e9a73b0588ca2b9cb3b5df634e44320f643d0ae1f8b573" + }, + { + "path": "frontend/src/pages/account-income/ui/components/IncomeForecast.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "c825b843685692d9f22367a6b1d857026ea106f168fd6d3285b73d49dc87cd98" + }, + { + "path": "frontend/src/pages/account-income/ui/components/IncomeSummary.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b498969cec972dd25c738b0b2a5fab9fddfa2071fe403feba8b3defbe96a4e2f" + }, + { + "path": "frontend/src/pages/account-income/ui/components/IncomeTrend.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b40e96330418d1143691d47632c097db9a3c964056660397faa72bd09283bb9a" + }, + { + "path": "frontend/src/pages/account-operations/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "52547737449ffd6c907d93f685698500ac63999a68f6ef2411d0abecde85e453" + }, + { + "path": "frontend/src/pages/account-operations/ui/AccountOperationsPage.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "98d047e57b00cbdb22027e2f382f26c4fe77db07d59dd6c307f79ad03768e2af" + }, + { + "path": "frontend/src/pages/account-operations/ui/AccountOperationsPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "1429f228fe702a9e467270b8c86be761ad682f2b0e46f054772cb6850406eb64" + }, + { + "path": "frontend/src/pages/account-operations/ui/AccountOperationsPage.vm.ts", + "kind": "file", + "mode": "100644", + "sha256": "8677eefcf98e2e48ca108224306d8f9d3fcdd3977cf4a91a0a571f1d459f6eaa" + }, + { + "path": "frontend/src/pages/account-operations/ui/components/AccountOperationsPageError.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "694f220b6fbc3ef0bfd09478e40dead28efb4c0b474b2db3ae400c0ed106bb85" + }, + { + "path": "frontend/src/pages/account-operations/ui/components/AccountOperationsPageLoaded.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "ceefca357d7bf19b0cd53715dd9700bd4e7343ab436950e4efeb6c90b87833cf" + }, + { + "path": "frontend/src/pages/account-operations/ui/components/AccountOperationsPageLoading.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "1b5538a2d1c750b1b89d68ca208f857377dac21acaedee4a0b61da519f0a27e8" + }, + { + "path": "frontend/src/pages/account/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "acb5e60d2da1d85cf7518a15778a710a1aa17e31859f0e4b6313121e2e711222" + }, + { + "path": "frontend/src/pages/account/ui/AccountPage.module.css", + "kind": "file", + "mode": "100644", + "sha256": "27e3c2323c6f8e344493cd8fcc63648856f248246477dd55516674cfb1f57e16" + }, + { + "path": "frontend/src/pages/account/ui/AccountPage.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "6968b77ad19954a7b1a12165f05f89c41f0df83c70097ca1bfd84ffdcbc14a2c" + }, + { + "path": "frontend/src/pages/account/ui/AccountPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "889a4ccc68936d880336524f419d959bac4360f4d34bcbae340a9bd6f28e746b" + }, + { + "path": "frontend/src/pages/account/ui/AccountPage.vm.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b1db7a7bb3c6aa9e07f97eae1e74d62ee7e29d878493b91533dc0ee4d9ba0df9" + }, + { + "path": "frontend/src/pages/account/ui/AccountPage.vm.ts", + "kind": "file", + "mode": "100644", + "sha256": "e90bb1f9993ded5071532ee34c8ee15c6b534fe112c503d2e6a212c3e63ad806" + }, + { + "path": "frontend/src/pages/account/ui/components/AccountHeading.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "e78ee3b110780be81ecbef6fdbf4931097c32434b5df82453f79cb0e291cfb8d" + }, + { + "path": "frontend/src/pages/account/ui/components/AccountPageEmpty.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "d22cb260448fca772c985d2a29f565e83fad672f2d9b4b42fb92fbc5980d9532" + }, + { + "path": "frontend/src/pages/account/ui/components/AccountPageError.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "258ef783c093ab2640bfe3c312c27e52d74b9acd0402996a44b7f4ebb7c05960" + }, + { + "path": "frontend/src/pages/account/ui/components/AccountPageLoaded.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "1a8f7b88c2a5cbcada4443095aad386a181bc57911d6b80ebc593a7759b371bf" + }, + { + "path": "frontend/src/pages/account/ui/components/AccountPageLoading.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b19f2db05a01ca43f4992efde81d47a6d536459918ca56917054dfea9452cdf7" + }, + { + "path": "frontend/src/pages/account/ui/components/AccountPageLoading.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2a45d2c9a4b41f9f1570fb879f28b0b4c012d0de8bb67afc1a00abdf038bc414" + }, + { + "path": "frontend/src/pages/account/ui/components/CashBalances.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "9c6480b81d4df06d111672a0cbe679bfe8dea5d8bdea7943850591034c6b46c9" + }, + { + "path": "frontend/src/pages/account/ui/components/IncomeSummary.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "0fa5e2693c91a826af7eee7dae7700321f4f4fb1668baa1f176b210855ab6da2" + }, + { + "path": "frontend/src/pages/account/ui/components/PortfolioRefreshState.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "8bfd285a1b34557402ba03f5b2d6678e96831b2eba65122f877456da483d2a44" + }, + { + "path": "frontend/src/pages/account/ui/components/PortfolioRefreshState.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "fa07c51edb7eb2d0180de2ecbe0522ea9621ee49b605dbf1e6517b6c5f7d5d8f" + }, + { + "path": "frontend/src/pages/account/ui/components/PortfolioTotals.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "129aed1b08b78dab623cc55c55e7c78ed4808ac8a37303921da4de8a8ed23b6f" + }, + { + "path": "frontend/src/pages/account/ui/components/PortfolioTotals.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "86402e06aa05ec1511ee032fc55f9082da4a351c7d691d9ba90d830ca3e7171b" + }, + { + "path": "frontend/src/pages/account/ui/components/PositionCard.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "19886c5bf31943776128441a9164a7cadbc59ed98906b00271195c982271620a" + }, + { + "path": "frontend/src/pages/account/ui/components/PositionCard.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "57c1259d226a8cffd751cb12014f5bd79cdf7b45216c14ec246457f14ce31eb8" + }, + { + "path": "frontend/src/pages/account/ui/components/PositionLogo.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "9a608c85f49c8a4231790308c79201efb526aca2251348532032cbf4ba1f70fe" + }, + { + "path": "frontend/src/pages/account/ui/components/PositionSection.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b947e40bb3d3306dc010446f342c75d5c7c2a55e081f65a23b4ad8b23fdff50e" + }, + { + "path": "frontend/src/pages/account/ui/components/RecentEvents.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "c81327808061e9d6180a682a52a132b3a9c944ea6c7ea7175d2e9e2c556bb6b1" + }, + { + "path": "frontend/src/pages/account/ui/components/RecentEvents.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "42f0b5bd6bb5d50ba156a8380c0b821e96c1cf57316d62e261eb6d2b0e793226" + }, + { + "path": "frontend/src/pages/account/ui/components/RecentOperations.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "11e3b1de6a35f484d2f17cf6c079e160c61dfaf6329355b21671a6cd0b937383" + }, + { + "path": "frontend/src/pages/accounts/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "d894b7b5d573339279d5b76fd67ee60fa4b3940883227f32e56e82f1b2a713b1" + }, + { + "path": "frontend/src/pages/accounts/ui/AccountsPage.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "f797ed0eb20092db09af055477d0d007818cf11e4266d429273222bd601830e5" + }, + { + "path": "frontend/src/pages/accounts/ui/AccountsPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "b40e07504262fa525acacddb49324a83639aa0cf2a39f7ed131f7d711c9014ce" + }, + { + "path": "frontend/src/pages/accounts/ui/AccountsPage.vm.ts", + "kind": "file", + "mode": "100644", + "sha256": "8e704043780f80d6a5ee7eb3d62ab7cb7b9b2dd47f1bcc9949f60a576bb4a7fb" + }, + { + "path": "frontend/src/pages/accounts/ui/components/AccountsPageEmpty.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "14c04cf71bff77de0bb1e11a938d1b1a1dafe362a2e1f8ce2f075c7952349e68" + }, + { + "path": "frontend/src/pages/accounts/ui/components/AccountsPageError.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "0c4b155c4955ce4a397c5b79f8fd2408cb5c6ba02fe1064f7c919197ccb32f35" + }, + { + "path": "frontend/src/pages/accounts/ui/components/AccountsPageLoaded.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "7912cf312e941676265f9fac7319ae0affcd8aaac14690186191f82e6680e015" + }, + { + "path": "frontend/src/pages/accounts/ui/components/AccountsPageLoading.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2386da6dc9fbe23b9a4379ad4ff8fd0cf539e5ea3b46b5b5c45c5cb74360bea2" + }, + { + "path": "frontend/src/pages/accounts/ui/components/AccountsRefreshState.view.tsx", + "kind": "file", + "mode": "100644", + "sha256": "74899aba17ff330f749232f50ba0e251549bd7e8546090898fd8d829f19ed7bb" + }, + { + "path": "frontend/src/pages/login/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "eecb1f89e2f1f7b6749585a6cd3adff86513a8bf5b2b53f3ead46de7ad3fc45b" + }, + { + "path": "frontend/src/pages/login/ui/LoginPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "da0abc69206621cddd71c4755edf7354a8f740df18807062e66e1e96e47d878e" + }, + { + "path": "frontend/src/pages/not-found/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "6962cb472751d79b33ef31a46d18e057842320a062f39dad64a08cf38df338c3" + }, + { + "path": "frontend/src/pages/not-found/ui/NotFoundPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "0621bd989fd15bb787e5bb8c07d95aab93a595a7aff2307b24bbe9c3cf82060c" + }, + { + "path": "frontend/src/pages/register/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "97c0a1f58ca3592e9c4b0440b8ba6fe0c710eb53abd8b425cfdb806cfca14feb" + }, + { + "path": "frontend/src/pages/register/ui/RegisterPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "94c558dc9d772afee6c9070ab74506a916308b4e333b0bc307285e295bf1cbd1" + }, + { + "path": "frontend/src/pages/settings/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "6081571ece8bfbb6fe1a497f8e8f9517c5a208f2cc3872dbbb4a8013fef78d1d" + }, + { + "path": "frontend/src/pages/settings/ui/SettingsPage.tsx", + "kind": "file", + "mode": "100644", + "sha256": "943f183ea10396202a624eee5eac68d505dc258d0303c2cdcc18261bbd406d01" + }, + { + "path": "frontend/src/shared/api/authenticated-query.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "059834d468b56472f3cb9a84e3c6ee53da3fd7d14d286ab03cf12ef66a159fb0" + }, + { + "path": "frontend/src/shared/api/authenticated-query.ts", + "kind": "file", + "mode": "100644", + "sha256": "2054ffb0279b1e72cfec24973fd212e25eef3d8e75a80f2cebaa8f496b0d02a2" + }, + { + "path": "frontend/src/shared/api/client.test.ts", + "kind": "file", + "mode": "100644", + "sha256": "21f632568273b6b192e1b9ebd4f63b7aeba65120b4efe75698e2fc0ec3c3988e" + }, + { + "path": "frontend/src/shared/api/client.ts", + "kind": "file", + "mode": "100644", + "sha256": "2454f54bf2d430feb765456aaf5ffb468fc068fb75bc13c6c257eb525683ba98" + }, + { + "path": "frontend/src/shared/api/generated/schema.d.ts", + "kind": "file", + "mode": "100644", + "sha256": "c4aae54b591122701bc751f30feb57212f1f2df44adbcbfd77100afcef23a57c" + }, + { + "path": "frontend/src/shared/api/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "c9b8bc978df49c35aa01a5997e2d79bcaa89f5ab363005e2019933a34ed88f53" + }, + { + "path": "frontend/src/shared/api/problem-details.ts", + "kind": "file", + "mode": "100644", + "sha256": "b33daae32b1a4b78b9f1c0535ac9f4bc91b277de718eca78385691b426e7e157" + }, + { + "path": "frontend/src/shared/api/spec/openapi.json", + "kind": "file", + "mode": "100644", + "sha256": "281f9aee4f254e85252f7688de7de1d0414ea2ee547a82d28fa4a1b7482b477f" + }, + { + "path": "frontend/src/shared/i18n/i18n.ts", + "kind": "file", + "mode": "100644", + "sha256": "c7b5bbc71bdbecc74dc8d71694fa766fafdd81effb5a4fa1206ef6e400cbf177" + }, + { + "path": "frontend/src/shared/i18n/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "bb3f6e68be414f50b1804a3a64e063ef7ad54f6d0fc2f0b330cd0eeaf25a0e02" + }, + { + "path": "frontend/src/shared/i18n/locales/ru.ts", + "kind": "file", + "mode": "100644", + "sha256": "e32415dce05c78df7b064fd2522530dbf69f31d65c8930d9e765c52fa787607c" + }, + { + "path": "frontend/src/shared/i18n/zod.ts", + "kind": "file", + "mode": "100644", + "sha256": "2ca092b2dcd83bca8c55d34c08c12c065721b7bd7382a8c87ff9fd9cac35a234" + }, + { + "path": "frontend/src/shared/lib/display.test.ts", + "kind": "file", + "mode": "100644", + "sha256": "be879cdc1edc49f9356ac4358b5c4ed3c64f148a7d8c62049e477a36e81b289f" + }, + { + "path": "frontend/src/shared/lib/display.ts", + "kind": "file", + "mode": "100644", + "sha256": "c1d74a8df74fdbc81b658685a026a4607ef7f2c60ff923dfec7a47bb65dbf2f5" + }, + { + "path": "frontend/src/shared/lib/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "7c4c2c7732f3b4e46bdd66c6c5e19b2e1f623786256d8050575f1efb75f2a4f3" + }, + { + "path": "frontend/src/shared/theme/Foundations.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "e8609df757214d122d06d170d764745a02ba92fa2d64410d111176d88e4695ca" + }, + { + "path": "frontend/src/shared/theme/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "49f7368720c929acf09541dee9405d90f4ba41caf15aaee078d1527305d722a4" + }, + { + "path": "frontend/src/shared/theme/styles.css", + "kind": "file", + "mode": "100644", + "sha256": "540661168457fdcf2fceaf201f741415cdf0b0d49b5a46de9c58719a2f2a5491" + }, + { + "path": "frontend/src/shared/theme/theme.test.ts", + "kind": "file", + "mode": "100644", + "sha256": "1ea0ca1aa2ed78a23a51cb22971b469672f3f560027824776e8110a4229703ce" + }, + { + "path": "frontend/src/shared/theme/theme.ts", + "kind": "file", + "mode": "100644", + "sha256": "5cce79e8fa932ab1f7130ff318a34515fb11c28e7c3c998aca4f603741e8bfdf" + }, + { + "path": "frontend/src/shared/theme/tokens.json", + "kind": "file", + "mode": "100644", + "sha256": "aa8648a568a935f59bd06e1c1e2aa7bc1a22d9d58db4edbbf89728cc55065f18" + }, + { + "path": "frontend/src/shared/ui/AppShell.module.css", + "kind": "file", + "mode": "100644", + "sha256": "0ceb0e7f9658577e39056d8c69e235dcf5e84004d9208a06f8117d471e26ea04" + }, + { + "path": "frontend/src/shared/ui/AppShell.tsx", + "kind": "file", + "mode": "100644", + "sha256": "68be717ac98fc04a3c9407c9eb3ce2cf8f62c975260d61d73e02fcbda1efbd55" + }, + { + "path": "frontend/src/shared/ui/Button.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "cb97cbcf25dcd624bcd714d76b43f5972729a1426ee5cbe16ac32a761313390d" + }, + { + "path": "frontend/src/shared/ui/LoadingSkeleton.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "55a3a27849c7f0856c49179ef5542e842064dc30a4753180e91aa83ab8fd8214" + }, + { + "path": "frontend/src/shared/ui/LoadingSkeleton.tsx", + "kind": "file", + "mode": "100644", + "sha256": "2d1c5012c2fb93c83c5e7b8921485d392dbc5acbf0896703b32821329f9cbaed" + }, + { + "path": "frontend/src/shared/ui/StateView.stories.tsx", + "kind": "file", + "mode": "100644", + "sha256": "f77300fa254afadeb65895adec96148f9e5b0943e2ed4ea81de258cf99b04048" + }, + { + "path": "frontend/src/shared/ui/StateView.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "de9d44409a715ce9c103e870edaf5b323127053844dcd8bef49c7854c6ccc0c2" + }, + { + "path": "frontend/src/shared/ui/StateView.tsx", + "kind": "file", + "mode": "100644", + "sha256": "7414fa3de07b487c2fbcbf56f67925b418e64b586f9175add1576053fecfd0aa" + }, + { + "path": "frontend/src/shared/ui/index.ts", + "kind": "file", + "mode": "100644", + "sha256": "3322a7129d6fca07f8d3b459d35508d8d7d1cbab22e8a2d49280c75c1813ac3f" + }, + { + "path": "frontend/src/test/handlers.ts", + "kind": "file", + "mode": "100644", + "sha256": "5440d1cee5598f9bdcc78ac203af6426b52ce8932bc6bd99366416a4de14a33d" + }, + { + "path": "frontend/src/test/query.tsx", + "kind": "file", + "mode": "100644", + "sha256": "dd06c186d0d0a5ca218a296edd1f01a58c50f1433a16539c24692aa48eb15d20" + }, + { + "path": "frontend/src/test/server.ts", + "kind": "file", + "mode": "100644", + "sha256": "85c107a2f5429cd35c3a0b7ea7c9678934cf63038a66f42a0804d2e3465086cb" + }, + { + "path": "frontend/src/test/setup.ts", + "kind": "file", + "mode": "100644", + "sha256": "6eb1bb94d573810cda4ea65da15957907d9c05d32880cb7217330e30a1b73c66" + }, + { + "path": "frontend/src/test/storybook.test.tsx", + "kind": "file", + "mode": "100644", + "sha256": "6c887d8e2a3faf286443ec37d2cf6cef3582beb03339040ceff0412505e70ef6" + }, + { + "path": "frontend/tsconfig.app.json", + "kind": "file", + "mode": "100644", + "sha256": "301c6165f2e9297f499870b4c6cf55e4f48aa15bf03a8fc98ea658c6eaa6c21d" + }, + { + "path": "frontend/tsconfig.json", + "kind": "file", + "mode": "100644", + "sha256": "975b855a3e1084cbd91c17718bf2099a00afbdad44dcc19b0b1d682f8cea5a10" + }, + { + "path": "frontend/tsconfig.node.json", + "kind": "file", + "mode": "100644", + "sha256": "6cab0685be664373524de5ce6b2244b7d6cfdde28902ad3e3aa357f978b72299" + }, + { + "path": "frontend/vite.config.ts", + "kind": "file", + "mode": "100644", + "sha256": "5c781c6de11dd929a9142b07467b51ea39f4886546804595d4075f430b59468a" + }, + { + "path": "frontend/vitest.config.ts", + "kind": "file", + "mode": "100644", + "sha256": "7de4e28baa97782333946aa2f0a9ea7ddd4434498089079aad3fa79dbe615b03" + }, + { + "path": "specs/.openspec-store/store.yaml", + "kind": "file", + "mode": "100644", + "sha256": "5d292a91da91eb595db3423ba009b1bdf1f703b3abd776587c6ccf9439e0977d" + }, + { + "path": "specs/AGENTS.md", + "kind": "file", + "mode": "100644", + "sha256": "39eb6f04b3a2e630f40985e5e4a64663bcf91b9422433dbcf093b6b3df94db81" + }, + { + "path": "specs/README.md", + "kind": "file", + "mode": "100644", + "sha256": "463be52ce470b96d1905816fe39dc9745fefce0714d35fcfdf841d7e448bdb51" + }, + { + "path": "specs/openspec/.cli-version", + "kind": "file", + "mode": "100644", + "sha256": "4f5ba6a3e380bf810cc968b58d30a8d7163eafe9e2fb1ad19bdc6d9d64a1e549" + }, + { + "path": "specs/openspec/changes/archive/.gitkeep", + "kind": "file", + "mode": "100644", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-add-tbank-connection/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "ce09aa8a7e84963f39e89c29067fa37eebde711c5ce3426da3c8f0976ee178cf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-add-tbank-connection/design.md", + "kind": "file", + "mode": "100644", + "sha256": "a0ef93d1edfff920d1c039d46e70f933cd622a97e3b05cd834426db9a8dcb6ae" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-add-tbank-connection/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "2277406fd00b622424ae9cc89f755cd854195148c0ccea6aff1ac17a1ed7d23c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-add-tbank-connection/specs/tbank-connection/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "83f50c065ab6d4524615761c1c44d9b9fc3774645efe912cedf97b9f442aa0bd" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-add-tbank-connection/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "e163c6e366ddff9b04c3a00e66eb2fe0971af3dd978cd19daca308eafabd3cee" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "ce09aa8a7e84963f39e89c29067fa37eebde711c5ce3426da3c8f0976ee178cf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/design.md", + "kind": "file", + "mode": "100644", + "sha256": "d8a5c40de3236dd0512a80db7de547312a0ee1859657052a8a3c5e9c1f87b6a8" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "4777158efb8c93bbe62f224ae94318199d95a3744ad4f2f2f053bc28d13819ce" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/specs/api-contract-generation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "8345f473e73ad4f320e327baf498795944cf7439535b402193bac1d33f8a01a7" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "423f24bdd7769cd1538887774071e959637faf46c1af925139e50610f1e0264a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "87965095b5b812fcc0b23a69b71da76381bd414732bb5b23fd21ce9a3ebf17c3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-12-baseline/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "19d397a9b6c5a545e47c056c3ef9ce302c363307c0eee30941305af780683017" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-authentication/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "ce09aa8a7e84963f39e89c29067fa37eebde711c5ce3426da3c8f0976ee178cf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-authentication/design.md", + "kind": "file", + "mode": "100644", + "sha256": "898342768884d4694d48be5ebde0467f630cffb8705be5334611c4fd7cb261ff" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-authentication/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "353a296c80d2d6859ecd130ea5e1ce117de76c5bf86cbe38fc25f9142d54844d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-authentication/specs/user-authentication/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "0d06350448e00fa66ecd8f97004de34a9f65f7b67ff594502834a5f6ee9d8cad" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-authentication/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "6ca0aa1adfdf3443ae9dd7fbc208ab8a9c323f2f061065f8170a3db57b35dddd" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-brokerage-accounts/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "ce09aa8a7e84963f39e89c29067fa37eebde711c5ce3426da3c8f0976ee178cf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-brokerage-accounts/design.md", + "kind": "file", + "mode": "100644", + "sha256": "1d5e29ac0283bf6db4ac3bbd37934f2f8d16d15e25f1f6a0d88314a073ed3a97" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-brokerage-accounts/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "1226909337bcf3de866e5f55ef74753ba5f126c3e4ced71c6b806a7faac7ed85" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-brokerage-accounts/specs/brokerage-accounts/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "39108c065b57c23593ebaa34954e11ecea0731a053341a1381b4f3999b5ebdd9" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-brokerage-accounts/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "c00da16a36e6068002dfc1fac08b00b1befc58e7e32a89020d06ca00713fdae2" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-portfolio-view/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "ce09aa8a7e84963f39e89c29067fa37eebde711c5ce3426da3c8f0976ee178cf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-portfolio-view/design.md", + "kind": "file", + "mode": "100644", + "sha256": "75e59d6ce4bc037fda7e39c7d9ca790b92d1b56a1137759c5bd6137b833a1de1" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-portfolio-view/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "a5b21f54c3ab6845a51aed505c08b954a694e419b78c2083faff1513adddc946" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-portfolio-view/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "d438a21b6e5e09ef3a8c82c7d4f6c64a33fbb536b2d512c28b8eb41eb3fe61d4" + }, + { + "path": "specs/openspec/changes/archive/2026-08-13-add-portfolio-view/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "1885e266550259909cfaf9d1f5a27eca479b207c1c18e092feb09dd4948e9526" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-app-breadcrumbs/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cfa0dd24ffbc3529beee2a707cfd385b458247b1b5cca61fbcc99f934e83600e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-app-breadcrumbs/design.md", + "kind": "file", + "mode": "100644", + "sha256": "76791cd9acc984f75f8c7b2e1a6301b93f55db96d1eb7c7a66758717fdfd00f3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-app-breadcrumbs/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "b422ff0e038d508f54fdb646194ee202623dbd923195b835a3004e44a96b7a24" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-app-breadcrumbs/specs/app-breadcrumb-navigation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "ba8d13f67d8b9c978f18993d27f91f4b55560839eaa6df91fde8784d918bf4e8" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-app-breadcrumbs/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "14b753c8a5f36d8ebf3eab071511f843a0f24b8aef122caef312627db9e3191c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-backend-structured-logging/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cfa0dd24ffbc3529beee2a707cfd385b458247b1b5cca61fbcc99f934e83600e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-backend-structured-logging/design.md", + "kind": "file", + "mode": "100644", + "sha256": "1f75bb57e5fbf19e5c2d590686e8e04599fa7b792e57f281e5066d6114443601" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-backend-structured-logging/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "582921b80f74596d974e6fdabaf6f0c4ad451a1261614731be686f38c82d8585" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-backend-structured-logging/specs/backend-structured-logging/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "0649160a168a2e8dce4cd211fd66f9c1ac82f1fdebcc5f046f667bdba08fcc36" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-backend-structured-logging/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "daefa5e36994c26e858b360d6178a717f330a89b89661324cf36fbf1d4e59634" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-ledger/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cfa0dd24ffbc3529beee2a707cfd385b458247b1b5cca61fbcc99f934e83600e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-ledger/design.md", + "kind": "file", + "mode": "100644", + "sha256": "66960fbc61e918555451df9d23172193401a412fc58a9f28df59ceee8387b365" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-ledger/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "51c6c7a8b59123cfc88727ff430af21ee86edd0a3403b4eba406852767797711" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-ledger/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "31e668e3940eea6e78999b019a9a6a307af81e0a3c398acd7bd305888130d446" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-ledger/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "dc8c76d77b6fa547b52ac3026313b4f2b824e5d99a508490cf7afc6c37feef97" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-upcoming-events/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cfa0dd24ffbc3529beee2a707cfd385b458247b1b5cca61fbcc99f934e83600e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-upcoming-events/design.md", + "kind": "file", + "mode": "100644", + "sha256": "9f9198e216ab11ff60277bf579dea9cb60425089f48fccc23313b8b9686d0017" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-upcoming-events/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "e200aed4f9cf270cf3d1a88253f8be1cfb9a3953e824c85ab94ef502bb15bfdc" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-upcoming-events/specs/brokerage-account-upcoming-events/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "1093ea4b6d26f614de554c5c07822c965925e07b4a699203e099e43390ebfd35" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-add-brokerage-account-upcoming-events/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "84f026b2a89df817aa97faecc5410f9c074d7b1faa9d78fe0e4b572e87fcde0d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-foundation/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cfa0dd24ffbc3529beee2a707cfd385b458247b1b5cca61fbcc99f934e83600e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-foundation/design.md", + "kind": "file", + "mode": "100644", + "sha256": "3cacb79868a4e9ffc748991d9a554a165f607c964c49c3732530eb48a14a8d18" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-foundation/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "61c61583caae066b9a54f857ca76283e47fb2cdb8f39a6c8f96cf32ed4fd73c6" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-foundation/specs/api-contract-generation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "6ff1e3ab39c64e69aa24eae62c8537a6505a5aa62563f1d3fddd31dec665201d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-foundation/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "159d01aea184b6edcfb406f059ce402a62d94ef8f69710a3e1fe1e483e4ef909" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-ui-patterns/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cfa0dd24ffbc3529beee2a707cfd385b458247b1b5cca61fbcc99f934e83600e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-ui-patterns/design.md", + "kind": "file", + "mode": "100644", + "sha256": "b9c0d697e48716d723950f101de339aeee80764e4d9cc1b4b059b7d2304ef67f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-ui-patterns/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "5faaaa2ab8cf27da3d5565517038dabb68ab1cd6974289cd5a37f26ed8f6d8ec" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-ui-patterns/specs/frontend-ui-resilience/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "86a3cce7c467e9fd1c21cc8fe4e92a76c159c19434d03c758b445447402c82dc" + }, + { + "path": "specs/openspec/changes/archive/2026-08-14-align-frontend-ui-patterns/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "01ef58d4c29d121ac0a5cc4a1da69f5cff5ba4da05c937ac936468e43222dd96" + }, + { + "path": "specs/openspec/changes/archive/2026-08-17-redesign-position-cards/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "41db595b409c9e6bc00babeabb32990290577eb40245a5bb769e8ec98a1f8d3e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-17-redesign-position-cards/design.md", + "kind": "file", + "mode": "100644", + "sha256": "e2a5d40df8775695254be27bb995771ea9cc2ef680e60792fdb0ab8044a20057" + }, + { + "path": "specs/openspec/changes/archive/2026-08-17-redesign-position-cards/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "6db67c273417f68ebfedce0ac3249adf9ab3d60d48360b1b10b30a6afd3a321f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-17-redesign-position-cards/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "0ad8cde46e389c1dd7a7ec7d973f415215fee13bdc185b391445f1e3ca86ab57" + }, + { + "path": "specs/openspec/changes/archive/2026-08-17-redesign-position-cards/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "319c62ac11a4ecae13b8f1d53d8f7ad93cee7ed698161c845f01f1b7bc9e26f5" + }, + { + "path": "specs/openspec/changes/archive/2026-08-19-source-share-dividends-from-tbank/design.md", + "kind": "file", + "mode": "100644", + "sha256": "e041d603df713a8ce5276b6452c408c507b8057c5205ca269826b1150d5a5665" + }, + { + "path": "specs/openspec/changes/archive/2026-08-19-source-share-dividends-from-tbank/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "d6593dbcf822cad5182c9120f816c4143271613ceac92023a6df60c683520846" + }, + { + "path": "specs/openspec/changes/archive/2026-08-19-source-share-dividends-from-tbank/specs/brokerage-account-upcoming-events/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "7bf7cd150cafe458690e22198cdff2ab5619e45a829128d7878871f95088961c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-19-source-share-dividends-from-tbank/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "33df20deec0f182f46e645ccb61f53c184859bb913f1afec381232a5de0bff05" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cef97c66dca8a4822d16808d0c827486f612c60b5fa247f48cdf6eb25f768e94" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/design.md", + "kind": "file", + "mode": "100644", + "sha256": "c7e365a6fd2e8d7ffb172b60997d6338a526eae885c5e320f1cdaa7af69db342" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "7c281b3e2ca755303f12ebaba36d6bd1b0edb839ed00e3e7ce3af6ef0a74b129" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/specs/audit-remediation-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "45d9418e0fcc0c5c2739724fb22031dc81320730beea7e885b2da7175fbd9de7" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "2059efc23b7bea763b91417ad87d4bc3e4c3adcc5b292dfcf9d9e2e4bc9c9666" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "0fda3598241dde1d74a3d2aff746b45ede5b1c16580dd0652a46f4637c601f2b" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-establish-audit-remediation-workflow/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "79b3819d20cdfe347e57d2142da82e75036f4ace844419568bfedc95e23dae66" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cef97c66dca8a4822d16808d0c827486f612c60b5fa247f48cdf6eb25f768e94" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/design.md", + "kind": "file", + "mode": "100644", + "sha256": "cf35160e4cc3c86e130d3ec34b2520824b7a406e9a2036f8b38624f7d33de26f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "29ed2ad6672bc63d0469de121af8992c2c4ebf628ffe169e9974f08034dbd8b2" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "a82870563504e77c66e51c93c3dbcd6640f4be0a390bf0eaad78840baa7aac6d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/specs/user-authentication/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "f358a49005b830259716998238b9891d12b04667a3cd558799d4a5b494a0c817" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "326f63990b46ee363bafe6babcec8dfa72b9c57d194f8e52398df25d8c9a07fd" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cef97c66dca8a4822d16808d0c827486f612c60b5fa247f48cdf6eb25f768e94" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/design.md", + "kind": "file", + "mode": "100644", + "sha256": "51fcf84aa06a0f23acb4d42617cf33040a42f6b41cd51f7d674df9f50ea7e73c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "1b5b8e043b6ab863fc3b67ebbc4619992725bd03fa80acce55d330d3ec676793" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/specs/audit-remediation-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "86cdd2e9194f031126f20a8be53448cc03dfb5230becbabc21b5e0a9d5508f28" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "b1ab914961293a1041a8741399340697b26412c7309add2cb3fb50d4f1af8ead" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "6fcf28da14d8ec89a866d90d39a69bd6b8de31669da6372e44c1acb80b7f2eaf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "4977c1c0aecabcff86b8ef64c1b5a0f17d027a742444f434cf699e64cba12fb5" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "cf42e8a995e0c9be8ff3d089ccb6fecc3a12816fcfb8ec05e78f8d28ca99aa4d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-harden-openspec-authority-and-lifecycle/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "dd95bb6087ac050be64c63ac2e6c773fa86ad3e0df5c94b383986d180581ad98" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "4d27248ab62bdb52127165b492367514dfd4887943e4e229c2fd615ee5e709ff" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/README.md", + "kind": "file", + "mode": "100644", + "sha256": "5156c859de6e4aad0f6fc374d7c9d79508de44ddef4b7c79581d1495f9bae864" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/design.md", + "kind": "file", + "mode": "100644", + "sha256": "f1f97091afde9f3dc651b7aff9e38ffb3ed42f1b62a131d227180affb544a1a0" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "37a9c0d70e4682053d2774aef62f0db757fd9fb42cdfc9bb141cfcfb710f17bf" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/specs/api-contract-generation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "917167bb359d10b0f2e0878275852767d712bbac6d1286f31d1d618b652e8622" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "40bf63255081660184c1425cd0462e2f2e1b7dcff4ede43b3d4c429106653c40" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "b2bb6630e8acb37b594f1e6ce4e467952d0a881c753ca98245e7e1787994007e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-stabilize-frontend-query-and-strict-contracts/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cef97c66dca8a4822d16808d0c827486f612c60b5fa247f48cdf6eb25f768e94" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-stabilize-frontend-query-and-strict-contracts/design.md", + "kind": "file", + "mode": "100644", + "sha256": "04a326d4e37071cbe51a4a25c265d6d0bbbd810c605400e5130dc6e4e45067ef" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-stabilize-frontend-query-and-strict-contracts/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "f5d7c0544443bbeb002ee721280b4a5105d9bf936878e6189800755dca08ee4c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-stabilize-frontend-query-and-strict-contracts/specs/frontend-query-coherence/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "460083b463e4362c3e834b2ff86ca55b2f6888c26435c831577b89ce9e9c191a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-stabilize-frontend-query-and-strict-contracts/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "7e6e01d418e92790555a9ba2cb88d80bf906f127150707edebc6568fa9f4872d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-23-stabilize-frontend-query-and-strict-contracts/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "e1adae2e71cdb66b196ec833ca69bce6af0cf85827246959835582cbe4ecc738" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-add-instrument-logos/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "c664e17d82f0eaf89e13ddbc2ec021086c91a159035f1e272827ed3c7c274907" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-add-instrument-logos/design.md", + "kind": "file", + "mode": "100644", + "sha256": "f1034d81000099f7bb6c2b59697cc01ae91b29b47648632c084d7629efa75707" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-add-instrument-logos/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "d919bfa940ec963fd2e672cf2726003f536a76fc273e54905f661c938a1aaec4" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-add-instrument-logos/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "85d077cacf5411837226b223bc481fff7dd32d4f9d04d148f6cbfd475b7476aa" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-add-instrument-logos/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "2185b4d155db3a655af801929fa4691bd6c71b53a1406477e638a5d250c39048" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-address-dependency-advisories-and-repo-hygiene/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "5f408ebe6a8c4d9c4c5e85f9e84c9ac47aa1192c4424a5f5f2224781c6f85fd7" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-address-dependency-advisories-and-repo-hygiene/design.md", + "kind": "file", + "mode": "100644", + "sha256": "5d9eccc97e4b9e8af3be4c7ad9cb0562ee1daa9309d36ef0318bc6b22cb12246" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-address-dependency-advisories-and-repo-hygiene/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "67f4e67b1757eeb34a410743e4225278ab097343ae0bb5d03b5019a17a112f48" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-address-dependency-advisories-and-repo-hygiene/specs/workspace-artifact-hygiene/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "a509b18363d14f1c957bca391d9c7ba6c2e79e4f979715362be1d0371a60f789" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-address-dependency-advisories-and-repo-hygiene/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "34ec41eee288327051467f7cf05f39501376e4af18287842775e3f6cf81bb424" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "cef97c66dca8a4822d16808d0c827486f612c60b5fa247f48cdf6eb25f768e94" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/design.md", + "kind": "file", + "mode": "100644", + "sha256": "32a3f47dc1995d3b68b840af99ec249fcd5ec71cdf7048cb4f38687ac3a3882a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "b3dce7a837a38a3f075a8fa5fbeb5624bf778b2895266b1e2ab74757b3e142cc" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/specs/frontend-data-resilience/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "cf0ba7561a0ccea119f95bf9db1049b83ef01b13b4ef16f380343a04e597ab7a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/specs/user-authentication/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "7712d4f46dd44fa1ee57010271266b07fff7091f2e462d44e2f0bac985d2c4e3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "77f4eb3af8320bfb9fe0e6f36f5b2307945ec753802e2ce87d5bdc44f10b0f9b" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "891362f72073a1327ed6be51e54d31ed2a5e5399dc29c2e782a10ac19d050c90" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/design.md", + "kind": "file", + "mode": "100644", + "sha256": "fabae5ed874e245784565a5a5d9b949c033e9f5efc38f25ea63e51f1a34f390b" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "66e8f9571c9e96a545be66d7dc8c7d9688a63209d9452929469b1bc11c1eca8a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/specs/audit-remediation-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "eac748fcdd235d604bbcc335c08e7235fc3fe81b8524bc133a31473e98e8bbff" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/specs/engineering-change-governance/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "1e8946a1b78943687891a7a95336a48e6d12e0677a4baa116d0b0fe5dc6b944d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/specs/multi-repository-delivery/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "13ecc84423f9eefb8caa3285bdc4745ccdd4f71d0421f0bf31482bc4e0d1f21a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "b3a9776fafe8286ce21498e83efecbb57e410478b4e6832defb11ad2dbc1d93d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "3a9e3acaa6e73fd27dab0f9461e735750449fcf62741e7bfa20000e543e1049b" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "1027d5a9bb2e601934a5c0bcfd4dbeb26c13e1a4bbfc5274813a2fd1ff4737aa" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-harden-agent-sdd-governance/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "dd036f3ce848dedcf148274dead6d8691acd8da214ddfec096a03cf81197ae8f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-refresh-project-documentation-and-agent-entrypoints/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "5f408ebe6a8c4d9c4c5e85f9e84c9ac47aa1192c4424a5f5f2224781c6f85fd7" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-refresh-project-documentation-and-agent-entrypoints/design.md", + "kind": "file", + "mode": "100644", + "sha256": "8ccc33ecaa8a1ba7edb97da735ade1130948722046179af7cacae6fc473ea659" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-refresh-project-documentation-and-agent-entrypoints/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "b06e785f1891da3c0e0c1937d4ea6ec91b4d5dd252a26f407fe88fd4d59ee628" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-refresh-project-documentation-and-agent-entrypoints/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "1fb96acac506d553824c09f259206979032106dbfb931d90ec1f2cdc13d7f530" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-refresh-project-documentation-and-agent-entrypoints/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "6b8790890506f4a0e8d1ac49ba6f5baf71b32df7681288cd25ff77a5c2d5f9a6" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-refresh-project-documentation-and-agent-entrypoints/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "0b088c4e764c7fbc84c66042d94490138cb0029b02251686fb24ffb53fe54659" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-tighten-frontend-quality-guardrails/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "941abb4536c8f6b2fc50009729078a4cfb284993da406ce09a79f5c42eb76182" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-tighten-frontend-quality-guardrails/README.md", + "kind": "file", + "mode": "100644", + "sha256": "509a72dcf1186fce7d61533f1fa7b215950b4107d67b875832986be977efeb96" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-tighten-frontend-quality-guardrails/design.md", + "kind": "file", + "mode": "100644", + "sha256": "f33a33cf6a31a5a88fa544747adaf03997196c50c0b6a27a19dcfebcbd294a83" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-tighten-frontend-quality-guardrails/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "a944d47c8fab7567b159fa2723300d2577712019270599233c8ee330393fa4e9" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-tighten-frontend-quality-guardrails/specs/frontend-quality-guardrails/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "cf54b7865c4c537475e66875fbd1f0128ed646ce1aecb4b7d21c39db7b3c1a9f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-24-tighten-frontend-quality-guardrails/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "749177580be4a44ef42bf464d8bb8bbb3acc3004b2f923b9476ceb604d69fd50" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "673cf98ec1bcf1da9810fdd3a083506dcfc4d7de4e0179e9e9830e38bd57ed2f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/design.md", + "kind": "file", + "mode": "100644", + "sha256": "a2e771fb3d4133e17e949fd19aeade1c9ef33ffa3b88a5eb1fa5f08896c93d7a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/implementation-summary.md", + "kind": "file", + "mode": "100644", + "sha256": "05a47f0c60f213ba9bc4757ad7597589cbe633ab89c8cd601d9d3f7eff799a0b" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "850ea55bbea1fe1591e2c9f5ae0c909a4b558ecc4300445675c9cbb2b7c495fa" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/specs/brokerage-account-upcoming-events/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "002397b425cf71af0d89fbd4fde0055fe22d1e59deb9f892cf86c83eaa32eeda" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/specs/brokerage-accounts/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "8eaa75559bd57bb5f1f2ee0b4cf5fa348da917ebb41330e72703ccea064f9539" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "0fd22680efc37c416c3ac33ab25fb9b4911628c1e540bd0f759bea79c1922744" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "5bcb1134e40919698e7ec3640f704296e9d12f6ed8f41f407072007a30569fe9" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "da45876b5bfe9edbd0991ade90d35c1ac54c7a1f0e96abe10ca6bf01a8b264c1" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "e1cbd50d87cd669c3752e2b9be346e6d9c73358927dabc7358acc1e51c4a1fc3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style/design.md", + "kind": "file", + "mode": "100644", + "sha256": "13b06b3b137bee21240acedf48bbdaf9cdb013bc0fae260b46eda8e84d183765" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style/implementation-summary.md", + "kind": "file", + "mode": "100644", + "sha256": "cbf0b87331a6bb62baee12b3250fd9fe6947c5e876792135e8479e9258a13669" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "bf8611307fa2a177f5822e74faa828938a5b44a36c955a175df352e2037cec66" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style/specs/frontend-quality-guardrails/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "04344df024d0d8da2ada24ad94fccb1bab4765ba0fb1f06147c2b6ee4b4a3112" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "6694093c0f7ceb615a368d277f44dae4f64646705fd95c1df7a3c537c469ed5b" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-view-model-boundary/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "368966af092b39099035f5487bf8553bd6fe6d798066f7c7b5bab2c62dd091af" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-view-model-boundary/design.md", + "kind": "file", + "mode": "100644", + "sha256": "279f4d2f44eeb5bb89eedea1bd14c03107cc6412e446ec1e300cb7e9f75f4bea" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-view-model-boundary/implementation-summary.md", + "kind": "file", + "mode": "100644", + "sha256": "543a12ba1d1d76e474515b8f1a927e6fde755b7d637370dec47351a557f5c11c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-view-model-boundary/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "06582b32e7f4c40e5e024381dda01a3b24f2aac34cf9d3509fe2452fabc62034" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-codify-frontend-view-model-boundary/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "3b1f3129f685eda3c0e7df4eb93def071988128edabe669b3ef290d89bbb9040" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-consolidate-tbank-connection-resolution/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "036d1ec2df389374a2846c665f0f552dc191b2e95f1540cb8c9a06dbf32c5516" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-consolidate-tbank-connection-resolution/design.md", + "kind": "file", + "mode": "100644", + "sha256": "dd59ce7b02609a25b90c50f58035bdc76890fada7409c65206572f251920f926" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-consolidate-tbank-connection-resolution/implementation-summary.md", + "kind": "file", + "mode": "100644", + "sha256": "3ef29c72475089385c0ada9466a78bc9f3fb9912e8cc9822a365bca67f3f05ff" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-consolidate-tbank-connection-resolution/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "41541f9f4432e4f22d4dffdf080d6368b3c4d4a1a3375f140e17abc4479996ac" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-consolidate-tbank-connection-resolution/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "f6d428218377ab200cf52e91d5ef04c093bf09bbfb3e8e0fde925207b87c5326" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-extend-instrument-logo-to-bonds/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "b4eaacafff6261133d3b396cb495039d37d36448426f22b7af650e8362037e8a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-extend-instrument-logo-to-bonds/design.md", + "kind": "file", + "mode": "100644", + "sha256": "2050c0263fdcb01a8d9415b2a8080beca9171914be31881229a4f3cacf3b9662" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-extend-instrument-logo-to-bonds/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c52c2386080e9cc67338a3b830774d92d3c0c3a58be1a7365c0ba4c995421b40" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-extend-instrument-logo-to-bonds/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "5ecdeb71fa6c525642a259730638875b8366148bbca1208648431f1a0678c9d4" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-extend-instrument-logo-to-bonds/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "e199ca8a2816a8a65cf37748d75a64da1f09d2caa527054cbbc7ee69b8e742cb" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-remove-frontend-hook-token-params/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "bfe2de82a0090c3517eb472cd775df87a5b8c3ad36b5ea30938d03591b57556e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-remove-frontend-hook-token-params/design.md", + "kind": "file", + "mode": "100644", + "sha256": "f8bb0c51869a0407d2c3a02a9e0b4f01794aa34ab051933bfd7f5378ef71f171" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-remove-frontend-hook-token-params/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "9a4763a395a455d32e70298845ed09c80ba6058ee1af06404d34e7ce1f800b4f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-25-remove-frontend-hook-token-params/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "bff31ae145eada59caec158738bfd9954305186c15b76587513763b8ef49464a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-enhance-brokerage-account-list/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "6e572e90022e2163f26d66abbc7ead15106d124e0ef7a83a58419c5d02c8f185" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-enhance-brokerage-account-list/design.md", + "kind": "file", + "mode": "100644", + "sha256": "3b0eba92633249f2aa9adb345f3266ee86832c69db77a07c39021913aa2a297c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-enhance-brokerage-account-list/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "ad3276018db2e641c8710c892600fd202ef25db77e8aef9ac784865acf46eb33" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-enhance-brokerage-account-list/specs/brokerage-accounts/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "be0760b7d04b15b6e0cb0f133660ccddfc613b03d32c78e8d9bcf7d2e752edb1" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-enhance-brokerage-account-list/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "37325a93577f3c2210fce3a6c08cdcc4a3e0608c8515f2bf3586d8578adc91c3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "9b1ae00c6b0dfc0f3da853e2004ce86aa8c57eeb776c2b589b006f521661ea51" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience/design.md", + "kind": "file", + "mode": "100644", + "sha256": "89302f3876d2a326e49a992d271c77e896175936c575604e6c2bac12f6eca485" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "9c1df64be9c12c48c6fbee204d9ea4b452f0517d3dcba2fcc5c80a7a54f33a6a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience/specs/multi-repository-delivery/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "6694df2c7f507786260122d056af846a9de1ee660e3130096e85794772e46acb" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "4fd17d7a2ee07e544eabd98b55d331ba6f8b2bf7d94a0bad01ae0d775d1f296e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "3b359ccb7822499dd7e9b9d0836fbb5ff1b97896b12dce91b73d591ea7f60876" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "4ad96a26ec824d9742a5d2dd44e779c25ca2c6a0c497582f5c7cb0f6a3be8fc3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/design.md", + "kind": "file", + "mode": "100644", + "sha256": "371b776e3280b3b7e1da9da135edc5ffaae6632ac2cac44342e29a9a0db4ac52" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "0e7ef2e39eb3eb0e63448deac4011fe6ab3fb2241bc0de55a3dcdb078d331b37" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/specs/audit-remediation-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "647f0e38617baf566d252acc4fc72f63bd16570566f9f7be1fc3ee0fa5afe1aa" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/specs/engineering-change-governance/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "5961b1b5097efe84743eb64e79d85b78b5e3e54bce977221e3f6180aab30f038" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/specs/multi-repository-delivery/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "19894b52342936575a499a17148ba7890490b5b876597c616760efcbe7d18696" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "b1fd2222bb5bd00137f0dca808891412ac7ed7e3c9bd8662ef24aca5755bdde2" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "8fc564f2dbeb423e8c7fe40f73cd5bfef456113668360e6eb3d9e8b09024c86d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-improve-ledger-event-rows/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "fc43c7e240da40b29730c652aecd680a4ee624cd2ee275a5b57f4f3fb6bbdbc3" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-improve-ledger-event-rows/design.md", + "kind": "file", + "mode": "100644", + "sha256": "ec119509d87514c579085af2e35ec033a9891ea05ea49b8152e5da067e330c1f" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-improve-ledger-event-rows/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "dfd655871319f4dfbd5f3a25712525624eb4850946e971fc780c564e53414825" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-improve-ledger-event-rows/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "77ed1fe6ce078b43737140f2d9e5b4c6c910f14c4735ea23d5cffaa8b57f6026" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-improve-ledger-event-rows/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "a1e62afc20cbd3c524fa0f7a1a614433a3909a20636a899e77d34eb802738a53" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-polish-stock-position-cards/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "c662b9852061ffa0d8cdf89b25c2330bcb1729ee24cbdc3eb54ba0636b7cdf38" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-polish-stock-position-cards/README.md", + "kind": "file", + "mode": "100644", + "sha256": "c556e8291600d3d04efd6a65f3983765d41a6768f3310a740be119006c741e9d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-polish-stock-position-cards/design.md", + "kind": "file", + "mode": "100644", + "sha256": "cb05e121e1a91416d8ec347055852ee8eacf251043dd6b556f32212faba79921" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-polish-stock-position-cards/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "4908708510ad06aab9d3f237f1ff29271abb27e21e62ca5a9e1c78544d097e16" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-polish-stock-position-cards/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "570c1857b664ff34ebfa60b5c1b98ed0cfd910faac2cf507d6d39f1d7c299b88" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-simplify-verification-infrastructure/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "c9a7e2f5a7135db422c8ad1d1aa41b9c204e2286f8d30f10b3ffd724e2675a79" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-simplify-verification-infrastructure/design.md", + "kind": "file", + "mode": "100644", + "sha256": "802debba97049ad8f73c209480ab89b589bc493e86ca39db2e28a1ddefcf3ce6" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-simplify-verification-infrastructure/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "6a71e5015ecc5e2f97ec816d17e2a63c6c0b8dc67abfaaa44cf98087f829fca8" + }, + { + "path": "specs/openspec/changes/archive/2026-08-26-simplify-verification-infrastructure/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "05dfb44c3fe27d71a288d15c72a23471b768a9ec029d6d9c347eddc5a4090499" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-account-ledger-explicit-filters/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "a82eb89f419219e5bf2d81635786fa92a305869f3656cdc22f2a0bf3e24aa507" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-account-ledger-explicit-filters/design.md", + "kind": "file", + "mode": "100644", + "sha256": "cf0d8836a07c5b7ae7ded0632f0289cedfdf2a1d110f32f71e42d33f3b74e3cd" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-account-ledger-explicit-filters/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "5767ae4456a1180b968a91bbd7eb1bc0738a629655b6795bd5c3c86bd38e00db" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-account-ledger-explicit-filters/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "e233dfe62f42cd09d0309ab531dad573f79e21490a6f9328e09d697ed29fd4ab" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-account-ledger-explicit-filters/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "5735ea52b633ce373b7e064f176d59a2152f2de9a6e3599a65c66ac55cca7104" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-add-session-oriented-sdd-skills/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "a82eb89f419219e5bf2d81635786fa92a305869f3656cdc22f2a0bf3e24aa507" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-add-session-oriented-sdd-skills/design.md", + "kind": "file", + "mode": "100644", + "sha256": "785db1b3f8ae06d75a3b9f84b792a9f5930b3adc858fbdf04d97dac828622e9d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-add-session-oriented-sdd-skills/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c1425134745d2a4b16361afef43f5e70afd36c6fa37c2d7e02f37bd04d2bb5fb" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-add-session-oriented-sdd-skills/specs/agent-sdd-session-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "43fbc4afb96fa0db342bc69341df806d373f21aa4239a1821114e48f9177d5b8" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-add-session-oriented-sdd-skills/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "178aaef67d5f979e6d719d2c3613a8e0191565209d599fe41471d1c90be89001" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-consume-mantine-components/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "44188fb0a7617de4d5c2193b6084bdae2142f193df578c1fa17f003e08f88fa2" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-consume-mantine-components/design.md", + "kind": "file", + "mode": "100644", + "sha256": "587cd9db022ff434dfa5492e8aeee77a8c26e5b14a317e1a59656b2f3f28702e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-consume-mantine-components/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c77d3844213be2d18f2e1036bc90af51ba908f61126c5d866549e6b2a71b9e83" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-consume-mantine-components/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "a260c01a0892ea968b2b51b1404b9235041529aea3c09dbdf87b474b9ff118f9" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-ledger-entry-type-label/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "a82eb89f419219e5bf2d81635786fa92a305869f3656cdc22f2a0bf3e24aa507" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-ledger-entry-type-label/design.md", + "kind": "file", + "mode": "100644", + "sha256": "9ae6c90a420fcd603ef38cf1df1fa80c7662b1f080cf3954cd94415182ce5519" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-ledger-entry-type-label/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "fd4b1a32abcb5328bdfa0aa9093a98cd600d4c2b445bed9bfc53c68b5b4d1f5a" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-ledger-entry-type-label/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "fccd3d238c704c4b1ad3cdde61458c40a3d8153e086d68e8573b31949810adc7" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-ledger-entry-type-label/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "804b9fd1e8b484ea5cdf4d716178401fa2e3261345a347b022050175f4a53855" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-optimize-agent-token-workflow/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "93b3eca27403c43ebc8559b0fd061a171328e8829a334000312f5ad8ed06a928" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-optimize-agent-token-workflow/design.md", + "kind": "file", + "mode": "100644", + "sha256": "81cb5850c86b5bcfc357862c1908518d7498a9c70114d27d7c19da53095b2e3d" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-optimize-agent-token-workflow/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "000c51a274c7dccaa4f14d85231921f1355c3818024766f16f1528ce38a019a6" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-optimize-agent-token-workflow/specs/engineering-change-governance/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "482311dc010a1f66381339eab444531f920eb6adcc44d72bf1015c2914f121ed" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-optimize-agent-token-workflow/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "616a819a3c28f773d1b6a172c6cbff905da29f43c1ee482b98ceeef5cf957057" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-optimize-agent-token-workflow/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "d13af84c40dab6a4272cc03030f28c6549a7e6f325359bc281394860c16e3b26" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-replace-loading-spinners-with-skeletons/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "a82eb89f419219e5bf2d81635786fa92a305869f3656cdc22f2a0bf3e24aa507" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-replace-loading-spinners-with-skeletons/design.md", + "kind": "file", + "mode": "100644", + "sha256": "767b200aafbad3a6a14a28a3bec62f26d27f9ee0c77335756d04b11285104342" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-replace-loading-spinners-with-skeletons/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "061db09547e7594d23a7a57705c21588fb590c4dd43d84facb9181a44d9f6f48" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-replace-loading-spinners-with-skeletons/specs/frontend-loading-presentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "59b2ce788bcf4111f18fde955f0117e289e715778003ce2be9feace068c2b862" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-replace-loading-spinners-with-skeletons/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "eab55a7f0cfd435b680160d3deffb808776424892cade76d65caa0b5265e3f95" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-show-stock-tickers-on-position-cards/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "a82eb89f419219e5bf2d81635786fa92a305869f3656cdc22f2a0bf3e24aa507" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-show-stock-tickers-on-position-cards/design.md", + "kind": "file", + "mode": "100644", + "sha256": "76d342bddcd0872b99ff2ff61d6edd28d9057ca43927b5d456978876bb41167c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-show-stock-tickers-on-position-cards/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "ecd1fcb81c723be112e83a3f807bf02b43507b83b79ed3d5816e3dac4d167ba4" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-show-stock-tickers-on-position-cards/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "5b1520db066bb059213801fdbae8dc94a1b91909b3808de11478768c6a45669c" + }, + { + "path": "specs/openspec/changes/archive/2026-08-27-show-stock-tickers-on-position-cards/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "b045c99eb42022ad10c23e48136a3170f557c2d46e07f40b2ad5ffd3bc4e8e6e" + }, + { + "path": "specs/openspec/changes/archive/2026-08-28-portfolio-income-analytics/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "a82eb89f419219e5bf2d81635786fa92a305869f3656cdc22f2a0bf3e24aa507" + }, + { + "path": "specs/openspec/changes/archive/2026-08-28-portfolio-income-analytics/design.md", + "kind": "file", + "mode": "100644", + "sha256": "9833a17838f9c5759ef429fe6a836d607a2ffb4e898dda94575a4d41236f0de0" + }, + { + "path": "specs/openspec/changes/archive/2026-08-28-portfolio-income-analytics/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "4c6996d6bc011610419acdd531f3d3c63565316f4d4c936c44e6e024167b19fa" + }, + { + "path": "specs/openspec/changes/archive/2026-08-28-portfolio-income-analytics/specs/brokerage-account-income-analytics/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "c49b5c21bc7be667a1a611c69f2445964ba8e077d4b3a6388d9282d3414720dc" + }, + { + "path": "specs/openspec/changes/archive/2026-08-28-portfolio-income-analytics/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "db1111d603f8875f2563e8eace84278888e697ad8035c59ccd1ecd044af4cbcf" + }, + { + "path": "specs/openspec/changes/archive/2026-09-01-harden-tbank-connection-cache-boundary/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "32d1bd30a23a9d140399725dc26636553d66e378d81bb0bd82ad0b3e1e92bae5" + }, + { + "path": "specs/openspec/changes/archive/2026-09-01-harden-tbank-connection-cache-boundary/design.md", + "kind": "file", + "mode": "100644", + "sha256": "e2d7c7733d444b2405270fa5e66c306cff7c761a7c245c3075676a0655dc75dc" + }, + { + "path": "specs/openspec/changes/archive/2026-09-01-harden-tbank-connection-cache-boundary/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "7e67802e26a9791fff272251f099f440812153136d8fe68d683eff5707cbc1c5" + }, + { + "path": "specs/openspec/changes/archive/2026-09-01-harden-tbank-connection-cache-boundary/specs/frontend-query-coherence/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "e23d2feb5b388c7745c0ec3d6c674851dd4ad438b0d0b4c5621b5639d00a2afd" + }, + { + "path": "specs/openspec/changes/archive/2026-09-01-harden-tbank-connection-cache-boundary/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "293fcc80ef9349bb0989e3175751b3d6afb7c2cd289188db03c9e0be6e345d97" + }, + { + "path": "specs/openspec/changes/archive/2026-09-06-complete-frontend-audit-remediation/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "c6674348278b5014c60b4d20d566181baa38565ba2e2001eea417e3f9fcfcf4c" + }, + { + "path": "specs/openspec/changes/archive/2026-09-06-complete-frontend-audit-remediation/design.md", + "kind": "file", + "mode": "100644", + "sha256": "d08e824a1bc458e7867a6d02aeaa560bad976fd2fe7d7876bb6525fc85b4ea8a" + }, + { + "path": "specs/openspec/changes/archive/2026-09-06-complete-frontend-audit-remediation/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "d973f54ea85e0f0f8c23de2d94c658c99d392ff967384c6cd8c7e7f246c11943" + }, + { + "path": "specs/openspec/changes/archive/2026-09-06-complete-frontend-audit-remediation/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "fda95ffeaa159f293352b7a488f794eb22d8183b0e22ef18be93fd17734868a9" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "24ca212b48c41c2de1d9fb7906b9be9f3bcef9db6268fa64db98ce9e9669aa86" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/completion-evidence.md", + "kind": "file", + "mode": "100644", + "sha256": "f8c4e6c8c8f5cc222ead03257c68ca39b411c0b0878fa12e7b6fea489fcf4da8" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/design.md", + "kind": "file", + "mode": "100644", + "sha256": "c8dd90259b16d05e28ad008b2cb2024b889ad9106db8b14495b4c0e68db0ae5b" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c55cc32fbef3bf5e2782fa3fdcfecc3cd4348791398c160d604bf2ab49e4b57b" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/specs/agent-sdd-session-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "b156035696902c1d25501b4776dcd2caf3bdeeeae63d24f281809437a9706a22" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/specs/frontend-ui-catalog/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "fdc6f196a2b0c37e2804f52fd63d224f2d474a3b4c997ff2bde217bbc50e76e8" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "4dcf20eb0a704e04f56a2471c1ad56353e326eb5eef945317177ebf91653087a" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-integrate-ui-ux-design-workflow/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "bae172b34ad1a46137d1a5f386122563a6b26ccf92bc5651965d26503a80e9f0" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "41adee516621a5f5ea5e33311f76d271147762cd32f88e86877243010db0e3aa" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/completion-evidence.md", + "kind": "file", + "mode": "100644", + "sha256": "b0fab33ffbaa0b73c313c98094811ba9f41f47394d3d32e859abed51cb5d3361" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/design.md", + "kind": "file", + "mode": "100644", + "sha256": "7c69406aeadf4dc33682ac98bb010ebc31787479a693751e44df7e80a94eb2d0" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c6b9c33b3e97eb592f5fe25b69cfb60737025374248531d7b9ca1cf340d7eb23" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/specs/agent-sdd-session-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "340c1358374aa3c57a82eab6f0457417a6e66ba3ed934b896d1bf57393ca4b88" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "4e85d82fd051697bb66dac9366f723088eb17ab1c443e7cc338008ac4cd605d7" + }, + { + "path": "specs/openspec/changes/archive/2026-09-07-optimize-session-oriented-sdd-v2/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "8a774808320781c13efc22bdb142d6a6f421281fa0ce8e1052af61e04dacd16f" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "8f71edf411818fb21b413c2172c63cc785cb6cd3716d7eaab9660daa9243c982" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/completion-evidence.md", + "kind": "file", + "mode": "100644", + "sha256": "d280871f6613b6c127dafc92373b4bfcf0813bfff435165e69e29ce4b872d28f" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/design.md", + "kind": "file", + "mode": "100644", + "sha256": "b1f0f269667e9ade94aafb4600141b9817d95e4e053dd9fb08aa2d6c77466071" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "298bec9a2357c7cbb4708b96d0314f6bb10cf460afc191a772ed81c6b0712a07" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/specs/frontend-design-system/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "4f0b1c41520c763458ddacbbe72a2c5f7ce7a48418fe67811938638563c87a80" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/specs/frontend-ui-catalog/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "93ad7922f962247f845c179d1dc9a266c2cbfec354ba438f2d64dc23f780ea8a" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-complete-shared-design-system/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "091baf057e30ddcf96c8847404ed99b614b4169d049c30a65aa68e6ac988751c" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-make-design-tokens-portable/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "8f71edf411818fb21b413c2172c63cc785cb6cd3716d7eaab9660daa9243c982" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-make-design-tokens-portable/completion-evidence.md", + "kind": "file", + "mode": "100644", + "sha256": "a3d294aea570371da718e8edb4b0a041d56574b893d040bd5171fff1c92656b1" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-make-design-tokens-portable/design.md", + "kind": "file", + "mode": "100644", + "sha256": "bacf8c6ac18fdde1cea37325806bd95f86de717fa918e296796c1040ee0f31e6" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-make-design-tokens-portable/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "86955ac083aeabf49ce71b9c80b9b851b98894516a96d76f6d3d3e5de171139c" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-make-design-tokens-portable/specs/frontend-design-system/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "24dc2d634d9a313d8215ef21c58c84fcabbaa838e4530c647f28a62a3997c294" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-make-design-tokens-portable/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "922d59f190dc91469ab14bc4f2b336ca5bb24c9e8beff0a4d769acc6b78dfc8e" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-simplify-local-design-tokens/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "8f71edf411818fb21b413c2172c63cc785cb6cd3716d7eaab9660daa9243c982" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-simplify-local-design-tokens/completion-evidence.md", + "kind": "file", + "mode": "100644", + "sha256": "9c1dd183a37318a942076a857f7f8bc3b0c808b2b75d285d1c951aff22fd66d6" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-simplify-local-design-tokens/design.md", + "kind": "file", + "mode": "100644", + "sha256": "f9688ad20a5a8b85f5ce6b1df49e807efc8a554e8aae35ab67549b35699a05fe" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-simplify-local-design-tokens/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "deeccba5dbc3187111ab80c806f94580c4bc9c4b2f80d64c06d14c621756824b" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-simplify-local-design-tokens/specs/frontend-design-system/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "911b9a4e900f37868a9959ff65f3f38ffa81473df974bba36d3313035829c8f6" + }, + { + "path": "specs/openspec/changes/archive/2026-09-08-simplify-local-design-tokens/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "5aa52960b34d3ff8058d9da396ddc7c78f17f72b8692d795e14147add89d9819" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/.openspec.yaml", + "kind": "file", + "mode": "100644", + "sha256": "83fe0dbbd1cc0663de914b41a49b068c9d78013260d8358da20d3260db638954" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/design.md", + "kind": "file", + "mode": "100644", + "sha256": "39fc7651a290c9380ab4e12bb76309082c4f2ebe5c5b8bdf7dbd3b48fcd1f7b0" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c0fe9ced94e036462642154fa7a16dd5df92ea465f6332b46de0afce7f9bd564" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "c2ac78e160d85485d02cee24fd28abb45a947813b0266f3535d49ec6fd58b0bb" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "2ee7368d69cbe427e3ea11ef2c9586ab69d2597c351b4e3e0b7180d1534ac346" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "c63c8a30cc932582f591422dd4871c6663cb55567218cee988d7119d77d4a4e3" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "138b000b334f54294f6cd8e88d607619608b05620231267fc1dc0477e1f87f46" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png", + "kind": "file", + "mode": "100644", + "sha256": "48d62eaa497819e6312f5ae56afa393f92c7bb0970543cd9b3abdd5960480534" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "ecccaee124c72b0f4f22bd92b31ef97e260c830782761ed9e7aab4c33a7e0af0" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "8ee71bb406abaa980e08f57c45e007fb66183786dfd251c9280a6ff62205d922" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "e453606105a96290a2d2358e039935c89187a90127ffe4228374ae6e16c9e252" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "6f163dd4a4ba461df5e715bab5757f4698986aade56ae38f02585d9c8d366b28" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "b406552e01098a5b95183d6a54bd59b3bf827387d33d73a6a453d83140b8da10" + }, + { + "path": "specs/openspec/config.yaml", + "kind": "file", + "mode": "100644", + "sha256": "c5a7c8728824abcf525c4f26d3e7089c54396513d80d2ba4edba15c7a9ba5771" + }, + { + "path": "specs/openspec/schemas/wealth-ledger-sdd/schema.yaml", + "kind": "file", + "mode": "100644", + "sha256": "d4775e71e157bd144256ab62e40294a7f3d76173456c928b223a6b631d8ee629" + }, + { + "path": "specs/openspec/schemas/wealth-ledger-sdd/templates/design.md", + "kind": "file", + "mode": "100644", + "sha256": "8d7749fe5bc32ef4acf70bcc4af22b95c615539fe866bc1de36571f3563b74d4" + }, + { + "path": "specs/openspec/schemas/wealth-ledger-sdd/templates/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "d0aa6958b1e7abc3bae5516d3662e81caf9a46c6b34ee98045fb2b863a710a15" + }, + { + "path": "specs/openspec/schemas/wealth-ledger-sdd/templates/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "8c01eb2f297af110cff4a12b998443684645fa54127d898a78b7765985ccb3a3" + }, + { + "path": "specs/openspec/schemas/wealth-ledger-sdd/templates/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "8722869157106bae35438834d4c05703dc3b3799df7377ec74ee905b8cdf477a" + }, + { + "path": "specs/openspec/specs/.gitkeep", + "kind": "file", + "mode": "100644", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "specs/openspec/specs/agent-sdd-session-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "073d4e19163c6344a67c6cac99f11f60378d3ac6f5783c27ec88d2c92a67d713" + }, + { + "path": "specs/openspec/specs/api-contract-generation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "084ff97d258ab7c1e0eb6af27b36f054a8e16770813a3af5ac823f7385dbe53b" + }, + { + "path": "specs/openspec/specs/app-breadcrumb-navigation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "d7ef01f72a89454a47e096b5f8666794d0d00d25f5a954aedb9ea2c3773f4d09" + }, + { + "path": "specs/openspec/specs/audit-remediation-workflow/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "a609567be6e205bd47d520acb67c9c6dbf382df541a91cfb1e52e831a9006b4b" + }, + { + "path": "specs/openspec/specs/backend-structured-logging/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "25ea8975444c21aacfd78da0652c75c40906a68ba13b704cbe627ac5c8d9e3d8" + }, + { + "path": "specs/openspec/specs/brokerage-account-income-analytics/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "a5bbdc430022a3261383fb34430a1abe67e3811b40c36356ada24a250323faf8" + }, + { + "path": "specs/openspec/specs/brokerage-account-ledger/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "597db4690932fe06b735d94f690fe97ec95ad8ebfefb242a7e195b3a579f12bf" + }, + { + "path": "specs/openspec/specs/brokerage-account-upcoming-events/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "e04642cf3abdc694a879d036d28484289e31dc284843b47164af498eb5c8db7b" + }, + { + "path": "specs/openspec/specs/brokerage-accounts/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "8e7d826685c6e980efcf24356f5ae7800da349775d78be2c6c76183a31eba664" + }, + { + "path": "specs/openspec/specs/engineering-change-governance/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "ca75600c855a3bdbe46231279ce4bbfaacd9167ced1715c195797933f115b00b" + }, + { + "path": "specs/openspec/specs/frontend-data-resilience/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "4a63906e7dd2b83cc2fc7905444703c6eba0d4a0faa6d206362e70eb6e6798c9" + }, + { + "path": "specs/openspec/specs/frontend-design-system/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "7802410ea5217c961ad5acc36a863d8edaee61571270363351aea4274a18ae4e" + }, + { + "path": "specs/openspec/specs/frontend-loading-presentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "820f2cfdb583284cc6dad23d782ca8c720baa523800042a92b4daac6760e0f0f" + }, + { + "path": "specs/openspec/specs/frontend-quality-guardrails/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "07ce2f3cf0b128d9cb41b387c18977ca7e965b0cbbef9ea53b9354bc0337d35e" + }, + { + "path": "specs/openspec/specs/frontend-query-coherence/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "e87e41adeaa0fa3859e29735009da5e8a6c13a3da26aab74c8fa3be2a33892e2" + }, + { + "path": "specs/openspec/specs/frontend-ui-catalog/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "39f5543e5356755bc3512a99da866944eeb11def73c1cf05789e8b902aa6096f" + }, + { + "path": "specs/openspec/specs/frontend-ui-resilience/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "3b249d74194004fde105ff6e80669b1f0df2365dda4f0b17b50ed2e4ec1f0297" + }, + { + "path": "specs/openspec/specs/multi-repository-delivery/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "3a335f4d109e7944d6fd0ddb05a84e8690547bdec151aeabcd7ac736a2a0f06c" + }, + { + "path": "specs/openspec/specs/openspec-authority-and-lifecycle/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "de7a7853fd159c6a57487a9ea4e16f1f3dba8d7632d12daab0bdf8116c498342" + }, + { + "path": "specs/openspec/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "89bb963fba1f0b98d6be0f06b13f25d0cb138f8631e5e050a5ecf5ca749bdfd6" + }, + { + "path": "specs/openspec/specs/project-documentation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "8d370df3819339d9207220afbb953ca58a4ff5b0fe80c069a0348bf024ffe12e" + }, + { + "path": "specs/openspec/specs/project-foundation/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "3694bb6bc69ec1926a545aa70f799a2581589ddce4519953c09ebe9fd71544d7" + }, + { + "path": "specs/openspec/specs/tbank-connection/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "225cceba45eef078a39f93264575c633570ab3004fee989d81f02b0852693b2c" + }, + { + "path": "specs/openspec/specs/user-authentication/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "f4bf3fa2706da03a348fbde7219b8246a06f52405b91fd977bdb065b4d81ecf9" + }, + { + "path": "specs/openspec/specs/workspace-artifact-hygiene/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "cbca6e5a6ac49a5cd70fcf560f2e52c2e5bd0f7df1f2ce5a5c75c42dfb9551b1" + } + ] +} +``` + +## Approval observations +```json +{ + "proposal": { + "fingerprint": "sha256:ee68cbe232cbac748ac0a3174e875f6c841f298c4010f09ab9a905f0d7ee4463", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/proposal.md", + "kind": "file", + "mode": "100644", + "sha256": "c0fe9ced94e036462642154fa7a16dd5df92ea465f6332b46de0afce7f9bd564" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "proposal", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/proposal.md" + ] + }, + "decision_source": { + "thread": "01a084a2-276b-77a0-b875-2b3e8e1b03e0", + "message": "01a084a5-dff2-7fd3-97d2-138876580d13", + "quote": "все ок, давай дальше" + } + }, + "specs": { + "fingerprint": "sha256:d62a508d1dcf3b63fcf4b698ba057adc332dc411cd9fa0c25ddb9fcae14d777d", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md", + "kind": "file", + "mode": "100644", + "sha256": "c2ac78e160d85485d02cee24fd28abb45a947813b0266f3535d49ec6fd58b0bb" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "specs", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md" + ] + }, + "decision_source": { + "thread": "01a084a2-276b-77a0-b875-2b3e8e1b03e0", + "message": "01a084ab-709c-70f2-8833-066583e6692e", + "quote": "ок, идем дальше" + } + }, + "design": { + "fingerprint": "sha256:ea69a333dabc0e82280a5a78ee6dd724935cdbc2b3ea0b656f2759ee901a97a3", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/design.md", + "kind": "file", + "mode": "100644", + "sha256": "39fc7651a290c9380ab4e12bb76309082c4f2ebe5c5b8bdf7dbd3b48fcd1f7b0" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "c63c8a30cc932582f591422dd4871c6663cb55567218cee988d7119d77d4a4e3" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "138b000b334f54294f6cd8e88d607619608b05620231267fc1dc0477e1f87f46" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png", + "kind": "file", + "mode": "100644", + "sha256": "48d62eaa497819e6312f5ae56afa393f92c7bb0970543cd9b3abdd5960480534" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "ecccaee124c72b0f4f22bd92b31ef97e260c830782761ed9e7aab4c33a7e0af0" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "8ee71bb406abaa980e08f57c45e007fb66183786dfd251c9280a6ff62205d922" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png", + "kind": "file", + "mode": "100644", + "sha256": "e453606105a96290a2d2358e039935c89187a90127ffe4228374ae6e16c9e252" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "6f163dd4a4ba461df5e715bab5757f4698986aade56ae38f02585d9c8d366b28" + }, + { + "path": "specs/openspec/changes/compact-portfolio-totals/visuals/a1-wide.png", + "kind": "file", + "mode": "100644", + "sha256": "b406552e01098a5b95183d6a54bd59b3bf827387d33d73a6a453d83140b8da10" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "design", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/design.md", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png", + "specs/openspec/changes/compact-portfolio-totals/visuals/a1-wide.png" + ] + }, + "decision_source": { + "thread": "01a084ad-40c8-78e3-9a70-654d4b62f390", + "message": "01a084b3-622f-7a31-98f7-b82aa1749371", + "quote": "окей, давай дальше" + } + }, + "tasks": { + "fingerprint": "sha256:d1ef7906b9f5cd27e93fdf1f42cb48f9da8f970cec5554e2edbc2e9f97ab2354", + "inventory": [ + { + "path": "specs/openspec/changes/compact-portfolio-totals/tasks.md", + "kind": "file", + "mode": "100644", + "sha256": "abcd9e150f392b4c10093f72168c6bc3cb7dae6a3991927ca41919cd490c0f6a" + } + ], + "status": "approved", + "artifact": { + "store": "wealth-ledger-specs", + "change": "compact-portfolio-totals", + "name": "tasks", + "paths": [ + "specs/openspec/changes/compact-portfolio-totals/tasks.md" + ] + }, + "decision_source": { + "thread": "01a084ad-40c8-78e3-9a70-654d4b62f390", + "message": "01a084b6-68f1-7591-9a5c-d48fef8cb3bf", + "quote": "все ок, напиши промпт, чтобы продолжить дальше" + } + } +} +``` + diff --git a/openspec/changes/compact-portfolio-totals/design.md b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/design.md similarity index 100% rename from openspec/changes/compact-portfolio-totals/design.md rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/design.md diff --git a/openspec/changes/compact-portfolio-totals/proposal.md b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/proposal.md similarity index 100% rename from openspec/changes/compact-portfolio-totals/proposal.md rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/proposal.md diff --git a/openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/specs/portfolio-view/spec.md similarity index 100% rename from openspec/changes/compact-portfolio-totals/specs/portfolio-view/spec.md rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/specs/portfolio-view/spec.md diff --git a/openspec/changes/compact-portfolio-totals/tasks.md b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/tasks.md similarity index 100% rename from openspec/changes/compact-portfolio-totals/tasks.md rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/tasks.md diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-error-stale-narrow.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-error-stale-narrow.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-error-stale-narrow.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-loading-narrow.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-loading-narrow.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-loading-narrow.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-long-320.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-long-320.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-long-320.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-long-wide.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-long-wide.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-long-wide.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-narrow.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-narrow.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-narrow.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-refresh-narrow.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-refresh-narrow.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-refresh-narrow.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-single-wide.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-single-wide.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-single-wide.png diff --git a/openspec/changes/compact-portfolio-totals/visuals/a1-wide.png b/openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-wide.png similarity index 100% rename from openspec/changes/compact-portfolio-totals/visuals/a1-wide.png rename to openspec/changes/archive/2026-09-09-compact-portfolio-totals/visuals/a1-wide.png diff --git a/openspec/specs/portfolio-view/spec.md b/openspec/specs/portfolio-view/spec.md index 849a9a2..a234991 100644 --- a/openspec/specs/portfolio-view/spec.md +++ b/openspec/specs/portfolio-view/spec.md @@ -115,17 +115,107 @@ Portfolio Snapshot является результатом наблюдения - **THEN** система не возвращает fallback Snapshot и отвечает `400` Problem Details с code `INVALID_TBANK_TOKEN` ### Requirement: Состояния и ошибки Portfolio на клиенте -Клиент SHALL загружать Portfolio при открытии защищённого маршрута `/accounts/:accountId`. Он MUST использовать успешный ответ в течение 30 секунд, без automatic retry, polling или refetch при возврате фокуса. После истечения срока клиент MUST скрыть предыдущий ответ и показать loading-состояние до нового результата. -Клиент MUST показать штатное empty-состояние только при пустых `positions` и `cashBalances`. При `isStale: true` клиент MUST показывать Snapshot, `lastSuccessfulAt` и нейтральное предупреждение о временной недоступности T-Bank. При `404` клиент MUST показать состояние недоступного счёта с действием возврата к списку счетов. При отсутствии Snapshot и `TBANK_NOT_CONNECTED`, `INVALID_TBANK_TOKEN`, `TBANK_UNAVAILABLE` или иной ошибке клиент MUST показать безопасное error-состояние с доступными для ошибки действиями; действие повтора разрешено только для временной и неизвестной ошибки. +Клиент SHALL загружать Portfolio при открытии защищённого маршрута +`/accounts/:accountId`. Он MUST использовать успешный ответ в течение +30 секунд, без automatic retry, polling или refetch при возврате фокуса. +При загрузке без ранее полученного успешного ответа для этого же Brokerage +Account клиент MUST показывать структурное skeleton-состояние ожидаемого +содержимого, включая сводку, без вымышленных сумм. Область загрузки MUST +иметь доступное обозначение занятости; skeleton MUST NOT быть интерактивным +или получать клавиатурный фокус. + +Истечение срока свежести MUST NOT само по себе скрывать уже доступный +Client Cached Snapshot. Во время фонового обновления и после его ошибки +клиент MUST сохранять ранее полученные данные того же Portfolio, включая +валютные итоги и исходное `lastSuccessfulAt`. При обновлении клиент MUST +показывать компактную неблокирующую индикацию без замены данных skeleton. +При ошибке обновления он MUST показывать локализованное неблокирующее +предупреждение о последних полученных данных и предоставлять действие +повторной попытки. Сохранённые данные MUST NOT считаться новым успешным +снимком или подтверждением текущей доступности Brokerage Account. + +Клиент MUST показать штатное empty-состояние только при пустых `positions` +и `cashBalances`, без нулевых валютных карточек. Для показываемого состава +Portfolio клиент MUST сохранять время успешного получения снимка +`lastSuccessfulAt`, форматируемое в UTC. При `isStale: true` клиент MUST +показывать Snapshot, его исходное время и нейтральное предупреждение +о временной недоступности T-Bank. Это предупреждение само по себе MUST NOT +добавлять действие ручного обновления. Server-side stale и ошибка фонового +обновления Client Cached Snapshot MUST оставаться раздельными состояниями: +ошибка клиента MUST NOT менять или подменять `isStale`, а оба предупреждения +и действие повтора клиентского обновления MUST оставаться доступными при +одновременном наличии этих состояний. + +При отсутствии ранее успешно полученного Client Cached Snapshot этого же +Portfolio и ответе `404` клиент MUST показать состояние недоступного счёта +с действием возврата к списку счетов без действия повтора. При отсутствии +Snapshot и `TBANK_NOT_CONNECTED`, `INVALID_TBANK_TOKEN`, `TBANK_UNAVAILABLE` +или иной ошибке клиент MUST показать безопасное error-состояние с доступными +для ошибки действиями; действие повтора разрешено только для временной +и неизвестной ошибки. #### Scenario: Показ устаревшего Portfolio + - **WHEN** клиент получает успешный ответ с `isStale: true` -- **THEN** клиент показывает позиции и остатки, время последнего успешного снимка и предупреждение без действия ручного обновления +- **THEN** клиент показывает позиции, остатки, валютные итоги, время + последнего успешного снимка и нейтральное предупреждение; само это + предупреждение не добавляет действие ручного обновления #### Scenario: Недоступный счёт на клиенте -- **WHEN** клиент получает `404` для Portfolio -- **THEN** клиент не показывает Portfolio и предлагает вернуться к списку Brokerage Account без действия повтора + +- **WHEN** для текущего Portfolio отсутствует ранее успешно полученный + Client Cached Snapshot и клиент получает `404` +- **THEN** клиент не показывает Portfolio и предлагает вернуться к списку + Brokerage Account без действия повтора + +#### Scenario: Первичная загрузка Portfolio + +- **WHEN** клиент ожидает Portfolio этого Brokerage Account без ранее + полученного успешного ответа +- **THEN** он показывает структурный skeleton, включая место сводки, + с доступным обозначением загрузки, без вымышленных или нулевых сумм + и без фокусируемых placeholders + +#### Scenario: Обновление после истечения срока свежести + +- **WHEN** срок свежести показанного Portfolio истёк и началось фоновое + обновление данных того же Brokerage Account +- **THEN** клиент сохраняет прежние валютные итоги и время их успешного + получения, показывает неблокирующую индикацию обновления и не заменяет + доступный состав и сводку skeleton-состоянием + +#### Scenario: Ошибка обновления после успешного ответа + +- **WHEN** клиент уже показывает Client Cached Snapshot Portfolio, + а обновление этих же данных завершается ошибкой +- **THEN** клиент сохраняет данные, суммы и время прежнего снимка, + показывает неблокирующее предупреждение и действие повтора; + ошибка не делает сохранённый снимок свежим и не изменяет `isStale` + +#### Scenario: Ошибка клиентского обновления при server-side stale + +- **WHEN** клиент показывает Portfolio с `isStale: true`, а фоновое + обновление этого же Portfolio завершается ошибкой +- **THEN** прежние суммы и время остаются видимыми одновременно + с нейтральным server-side предупреждением, отдельным предупреждением + об ошибке клиентского обновления и его действием повтора + +#### Scenario: Повторное обновление успешно + +- **WHEN** после ошибки фонового обновления User запускает повторную + попытку и получает успешный Portfolio Snapshot +- **THEN** до ответа прежние суммы и время остаются видимыми, затем + клиент показывает значения и `lastSuccessfulAt` успешного ответа, + убирает предупреждение об ошибке клиентского обновления и показывает + server-side предупреждение только в соответствии с новым `isStale` + +#### Scenario: Штатный пустой Portfolio на клиенте + +- **WHEN** успешно полученный Portfolio содержит пустые `positions` + и `cashBalances` +- **THEN** клиент показывает существующее empty-состояние без валютных + карточек с вымышленными нулевыми итогами ### Requirement: Представление карточек позиций на клиенте Клиент MUST отображать `STOCK` и `BOND` отдельными секциями. Внутри каждой секции MUST сохраняться upstream-порядок позиций. Позиции иных типов MUST оставаться доступными в отдельной общей секции. @@ -193,3 +283,148 @@ Portfolio Snapshot является результатом наблюдения #### Scenario: Секция иных типов сохраняет прежний вид - **WHEN** User открывает загруженный Portfolio с позициями иных типов (не `STOCK` и не `BOND`) - **THEN** клиент отображает их компактными плитками в адаптивном grid с текстовой подписью доходности и без визуального логотипа + +### Requirement: Компактная сводка валютных итогов Portfolio + +На странице Brokerage Account клиент SHALL показывать каждый полученный +валютный итог Portfolio отдельной компактной карточкой. При достаточной +ширине карточки валютная метка и сумма MUST располагаться в одной строке; +сумма MUST оставаться основной читаемой величиной. Обычная сводка с одной +или тремя валютами MUST занимать меньше высоты, чем прежнее представление +с меткой над суммой при тех же значениях и ширине экрана. + +На широком экране несколько карточек SHALL располагаться рядом при наличии +места; на узком экране MUST сохраняться одна карточка в ряду. Если полное +значение не помещается рядом с меткой, клиент MUST предоставлять ему полную +доступную ширину карточки и переносить содержимое с увеличением высоты. +Сводка MUST NOT обрезать суммы, заменять их многоточием или требовать +горизонтальной прокрутки для чтения карточек и значений. + +#### Scenario: Обычная сводка на широком экране + +- **WHEN** User открывает Portfolio с итогами `125000.50` RUB, `320.00` USD + и `9876.54321` EUR на широком экране с местом для трёх карточек +- **THEN** клиент показывает три отдельные карточки рядом, метку и полную + сумму в одной строке каждой карточки, с меньшей высотой сводки, чем при + прежнем размещении метки над суммой в тех же условиях + +#### Scenario: Обычная сводка на узком экране + +- **WHEN** User открывает тот же Portfolio с тремя валютными итогами + на узком экране +- **THEN** клиент показывает три карточки по одной в ряду, сохраняя полные + читаемые суммы и меньшую общую высоту сводки, чем при прежнем размещении + метки над суммой в тех же условиях + +#### Scenario: Portfolio с одной валютой + +- **WHEN** Portfolio содержит один валютный итог +- **THEN** клиент показывает одну компактную карточку без пустых карточек + для других валют; обычная сумма и метка помещаются в одну строку при + достаточной ширине на широком и узком экране + +#### Scenario: Длинная сумма на узком экране + +- **WHEN** User просматривает итог `123456789012.345678901` RUB при ширине + экрана 320 пикселей и значение не помещается рядом с валютной меткой +- **THEN** сумма получает полную доступную ширину карточки и при необходимости + переносится; все цифры и знак валюты читаемы без обрезания, многоточия + и горизонтальной прокрутки + +### Requirement: Обозначение и доступная идентичность валюты в сводке + +В валютных метках и суффиксах сумм сводки клиент MUST обозначать RUB знаком +`₽`, USD знаком `$`, EUR знаком `€` вместо видимых ISO-кодов этих валют. +Каждая сумма MUST оставаться однозначно связанной со своей исходной валютой, +включая чтение вспомогательными технологиями. Для RUB, USD и EUR MUST быть +доступны названия «Российский рубль», «Доллар США» и «Евро» соответственно. +Символ или цвет сами по себе MUST NOT быть единственным доступным способом +определения валюты. + +Другие полученные валюты MUST оставаться в сводке с понятным обозначением +и доступной идентичностью. Если знак отсутствует или неоднозначен, клиент +MUST сохранять возможность различить исходную валюту по её названию или +ISO-коду, в том числе визуально; неизвестное полное название MUST NOT +подменяться вымышленным. Совпадающие знаки разных валют MUST NOT приводить +к объединению карточек или неразличимому представлению их валют. + +#### Scenario: Рубль, доллар США и евро показаны знаками + +- **WHEN** сводка содержит RUB, USD и EUR +- **THEN** метки показывают `₽`, `$` и `€`, а суммы заканчиваются теми же + знаками; видимые RUB, USD и EUR не подменяют выбранные знаки + +#### Scenario: Валютная сумма читается вспомогательной технологией + +- **WHEN** User читает валютный итог сводки вспомогательной технологией +- **THEN** ему доступны полное значение и однозначная валютная идентичность, + включая «Российский рубль», «Доллар США» или «Евро» для соответствующих валют + +#### Scenario: Получена другая валюта + +- **WHEN** сводка содержит валюту помимо RUB, USD и EUR +- **THEN** её отдельный итог остаётся доступным с понятным обозначением + и доступным названием либо исходным ISO-кодом при неизвестном названии + +#### Scenario: У разных валют совпадает знак + +- **WHEN** Portfolio содержит итоги двух исходных валют с одинаковым знаком +- **THEN** сводка показывает два отдельных итога, и User может различить + их валюты визуально и вспомогательной технологией без догадки по сумме + +### Requirement: Полные точные значения и смысл валютной сводки + +Сводка MUST показывать полученные валютные итоги без изменения их знака, +цифр и дробной точности. Для русской локали клиент SHALL сохранять группировку +разрядов пробелами и десятичную запятую, не округляя значение, не отбрасывая +дробные позиции и не сокращая сумму до тысяч, миллионов или экспоненциальной +записи. Требование MUST сохраняться для длинных, отрицательных значений +и отрицательных дробей с нулевой целой частью. + +Каждая карточка MUST представлять только полученный итог позиций и Cash +Balance своей исходной валюты. Сводка MUST NOT конвертировать или складывать +разные валюты, показывать рублёвый итог как общую стоимость Portfolio, +повторно добавлять Cash Balance либо обещать полную оценку при наличии +позиций без вычислимой стоимости. Для отсутствующего валютного итога клиент +MUST NOT создавать нулевую карточку. Отсутствие итогов само по себе MUST NOT +обозначать пустой Portfolio, если позиции или Cash Balance присутствуют. + +#### Scenario: Обычные суммы сохраняют дробные позиции + +- **WHEN** в сводку поступают значения `125000.50` RUB, `320.00` USD + и `9876.54321` EUR +- **THEN** клиент показывает `125 000,50 ₽`, `320,00 $` и `9 876,54321 €` + с сохранением каждой исходной цифры и дробной позиции + +#### Scenario: Длинные и отрицательные значения не теряют точность + +- **WHEN** в сводку поступают `123456789012.345678901` RUB, + `-1234567.890123` USD и `987654321.000001` EUR +- **THEN** пользователь видит полные `123 456 789 012,345678901 ₽`, + `-1 234 567,890123 $` и `987 654 321,000001 €` без округления, + сокращений и потери отрицательного знака на широком и узком экране + +#### Scenario: Отрицательная сумма меньше единицы + +- **WHEN** полученный валютный итог равен `-0.5` USD +- **THEN** сводка показывает `-0,5 $`, сохраняя знак и дробную величину + +#### Scenario: Несколько валют и денежные остатки + +- **WHEN** полученные итоги RUB и USD уже включают позиции и Cash Balance + соответствующих валют +- **THEN** клиент показывает эти два итога без повторного добавления денег, + межвалютного итога или представления RUB как общей стоимости Portfolio + +#### Scenario: Стоимость части позиций неизвестна + +- **WHEN** Portfolio содержит позиции без вычислимой стоимости и доступные + валютные итоги, сформированные без этих позиций +- **THEN** сводка показывает только полученные итоги, не добавляет нули + за отсутствующие стоимости и не называет результат полной оценкой Portfolio + +#### Scenario: Итоги отсутствуют при непустом Portfolio + +- **WHEN** `totalsByCurrency` пуст, но `positions` или `cashBalances` непусты +- **THEN** клиент не создаёт валютные карточки и не заменяет доступный + состав Portfolio состоянием пустого портфеля