Fund Detail: NAV Management
See Core Concepts for the NAV timing model this page assumes: NAV is set per transaction at Fulfill in Vault, not carried over from the fund's most recently recorded value.
Planned — wallet authorization required to Record, Edit, or Delete NAV
None of the three NAV Records actions below currently require wallet authorization. Planned: each one should require the manager to authorize with their wallet (a 2FA code, per Core Concepts) before it takes effect. The point isn't just authentication — it's making the action feel deliberate enough that the manager double-checks the value before it goes through. Not yet built.
Operations By Screen Group
NAV Records
| Button name | Underlying operation | Explanation |
|---|---|---|
| Record NAV | POST /auth/funds/{slug}/nav | Opens the NAV sheet and records a positive USD value per share. The manager may also provide a recorded date. The identity of the recorder is marked automatically for audit purposes, this is not an input. Saving requires wallet authorization (see the Planned note above). |
| Edit NAV record | PATCH /auth/funds/{slug}/nav/{nav_id} | Opens the same sheet with the stored record. The backend updates the existing row instead of creating a correction row. A note is made of the user that edited the NAV record. Finalized or referenced legacy records cannot be edited. Saving requires wallet authorization (see the Planned note above). |
| Delete NAV record | DELETE /auth/funds/{slug}/nav/{nav_id} | Attempts to delete the selected row immediately. Finalized or referenced legacy records cannot be deleted. Tahoe currently provides no confirmation dialog, dependency preview, or undo operation — but it should. Deleting requires wallet authorization (see the Planned note above). |
Reporting
| Button name | Underlying operation | Explanation |
|---|---|---|
| Export NAV | GET /auth/funds/{slug}/nav/export | Downloads the fund's NAV history as CSV. The export contains the record id, fund id, NAV, change, percentage change, recorded time, and recorder. |
Display Controls
| Control | Underlying operation | Explanation |
|---|---|---|
| 30D, 90D, or ALL | Local chart-period selection | Filters the already loaded NAV history for the chart. It does not change a NAV record or call a pricing service. |
| Search NAV history | Local table filtering, with the search value also passed on reload | Filters the visible history table. The current NAV list endpoint returns the full fund history and does not apply the search parameter server-side. |
| Number of records shown | 25 | Nearly an entire month of NAV updates should be visible in the table. |
Record NAV Sheet
| Field | Required | Behavior |
|---|---|---|
| NAV | Yes | Positive USD value per share with at most six decimal places. JSON numbers are rejected because the contract requires an exact decimal string. The last recorded NAV is shown as small reference text next to this field — read-only, never a default or pre-filled value. |
| Recorded date | No | Prefilled with today. On a new record, leaving that default unchanged omits recordedAt so the backend stores the actual submission time. Selecting another date stores that date at midnight. |
| Recorded by | Yes | Prefilled with the signed-in manager. |
The sheet remains open when saving fails so the manager can correct the values. A successful create or edit reloads NAV history and Fund Detail because the newest record affects displayed fund metrics. Saving requires wallet authorization — see the Planned note at the top of this page.
Information Shown
NAV History Chart
The chart displays manager-visible NAV records in chronological order. A single record is duplicated as a flat segment so it remains visible. The 30-day and 90-day controls use the browser's current date and compare calendar days.
NAV History Table
| Column | Meaning |
|---|---|
| Date | Stored recordedAt timestamp. Same-day records use record identity as a sorting tiebreaker. |
| NAV | Manager-visible USD value per share. |
| Change % | Percentage change from the preceding chronological NAV record. |
| Recorded By | Stored recorder name or System when none is available. |
| Source | webdevelop-api for live records or mock for simulated development data. This should be removed once live. |
The backend recalculates absolute and percentage changes across the full chronological history whenever it returns the list. Editing or deleting an older row can therefore change the displayed comparison for later rows.
Recorded NAV And Finalized Dealing NAV
These values must not be treated as interchangeable.
| Value | Writer | Use |
|---|---|---|
| Recorded or display NAV | Fund manager on this page | Historical presentation and fund metrics. Shown as read-only reference text in the Fulfill in Vault pricing popup — never a default or suggested value. |
| Fulfillment price | Fund manager in Investment Management | Prices one subscription and determines its exact share quantity, set only during Fulfill in Vault — see Core Concepts → How NAV Pricing Works. |
| Finalized dealing NAV | Investment finalization service outside Tahoe | Historical immutable valuation retained for legacy-priced requests. |
This page records reporting NAV. Manager dealing prices are accepted separately during fulfillment. Finalized or referenced legacy NAV records are immutable: edit and delete commands return a conflict. Unreferenced reporting records retain their ordinary edit and delete behavior. Legacy priced requests keep their original NAV metadata; new redemptions use an explicit manager price.
Actors And Permissions
| Actor | Read history and export | Record, edit, or delete NAV |
|---|---|---|
| Owner | funds.read | nav.write |
| Admin | funds.read | nav.write |
| Ops | funds.read | nav.write |
| Auditor | funds.read | Not permitted |
The backend is the authorization boundary. The current page does not hide Record, Edit, or Delete controls from an auditor, so an unauthorized click reaches the API and receives 403. That missing client-side presentation gate is a product gap.
Controls, Failures, And Recovery
| Condition | Required response |
|---|---|
| NAV is empty, zero, negative, over-precise, or not a canonical decimal string | Correct the value before saving. |
| Save fails | Keep the sheet open, review the mutation error, and retry only after correcting the input or authorization problem. |
| Export fails | Review the page error. No NAV state changes. |
| History is empty | Record the first NAV only when the manager has an approved valuation source. |
| Correcting an older record | Recheck all later percentage changes because the backend recomputes them. |
| Changing a finalized record's NAV value | Treat finalization as cleared and coordinate re-finalization outside Tahoe. |
| Deleting a record | Confirm downstream valuation and redemption dependencies first. Referenced records can fail at the database constraint; a successful delete has no in-product undo. |
| Development mock data is visible | Do not use it as evidence of a recorded or finalized valuation. |
Capability Status
| Capability | Maturity | Execution owner or location | Current boundary |
|---|---|---|---|
| Read NAV history and chart | Live | This page | Requires funds.read; live data comes from fund_nav_records. |
| Record NAV | Live | This page | Requires nav.write; records a manual display value. |
| Edit NAV in place | Live | This page | Requires nav.write; changing the value clears finalization on that row. |
| Delete unreferenced NAV | Live | This page | Requires nav.write; referenced records can be blocked by database constraints, and no confirmation or undo is provided. |
| Export NAV CSV | Live | This page | Requires funds.read. |
| Finalize a dealing NAV | Unsupported | External investment finalization service | No Tahoe page action or fund-manager route performs finalization. |
| Price only at Fulfill in Vault, not at Accept | Planned | Investment Management | The approved target — see Core Concepts. This is a planned contract change. |
| Show last recorded NAV as reference during entry and fulfillment | Planned | This page and Investment Management | Read-only reference text only — never a default or pre-filled value. |
| Require wallet authorization to Record, Edit, or Delete NAV | Planned | This page | New requirement, not yet built. Intended to add deliberate friction so the manager double-checks the value, not just to authenticate the action. |
Owner Operating Checklist
Before recording NAV
- Confirm the fund, valuation date, calculation source, and responsible recorder.
- Confirm the value represents one share in USD and uses no more than six decimals.
- Determine whether this is a display record or part of an external finalization process.
Before correcting NAV
- Confirm that an in-place edit is acceptable for the audit trail.
- Check whether the record is finalized and whether changing it requires external re-finalization.
- Recheck later change percentages after the correction.
Before deleting NAV
- Confirm the record is not required by a redemption, subscription, report, or finalized valuation trail.
- Record the reason outside this page because the delete command captures no manager note.
- Reload NAV Management and verify which record is now the latest display NAV.
Known Product And Documentation Risks
- Record, Edit, and Delete controls are not hidden for auditors even though the backend rejects them.
- Delete has no confirmation, dependency preview, soft-delete state, or undo; dependency conflicts surface only after submission.
- Editing a NAV value clears finalization without a dedicated warning in the sheet.
- In-place correction removes the prior value from the business table; the audit log records that an update occurred but not a complete before-and-after valuation history on this page.
- Repository behavior was verified, but deployed revision and provider configuration were not checked.
Technical Traceability
Frontend
- View: src/views/AdminFundDetailView.vue
- ViewModel: src/features/admin/view-models/useTahoeAdminViewModels.ts
- Store: src/features/admin/stores/adminStore.ts
- API adapter: src/features/fund-manager/data/tahoeApi.ts
- NAV ordering helpers: src/utils/navRecords.ts
Fund-Manager API
| Contract | Permission | Purpose |
|---|---|---|
GET /auth/funds/{slug}/nav | funds.read | Return normalized NAV history. |
POST /auth/funds/{slug}/nav | nav.write | Create a manager-entered NAV record. |
PATCH /auth/funds/{slug}/nav/{nav_id} | nav.write | Update an existing record and clear finalization when NAV changes. |
DELETE /auth/funds/{slug}/nav/{nav_id} | nav.write | Permanently delete an existing record. |
GET /auth/funds/{slug}/nav/export | funds.read | Download normalized NAV history as CSV. |
Backend evidence:
../fund-manager-api/app/routes.py../fund-manager-api/app/views/fund_manager_admin/funds.py../fund-manager-api/app/views/fund_manager_admin/common.py../fund-manager-api/app/schemas/fund_manager.py../fund-manager-api/utils/consts/group.py
Focused Tests
- src/tests/adminFundDetailOverview.test.ts
- src/tests/adminStore.test.ts
- src/features/fund-manager/data/tests/tahoeApi.characterization.test.ts
../fund-manager-api/tests/e2e/test_fund_manager_funds.py../fund-manager-api/tests/e2e/test_fund_manager_exports.py
Revision History
| Version | Date | Change |
|---|---|---|
| 1.0 | 2026-08-21 | Initial source-backed project-owner description of NAV Management. |
| 1.1 | 2026-09-14 | Removed "current product prices from the latest NAV" framing (moved to Product Bugs Found for tracking, not stated in the page itself). Added Core Concepts linkage, NAV-reference-display note on the Record NAV sheet, and split the Capability Status Planned row into pricing-timing and reference-display items. Corrected "proposed default" language for display NAV in the Fulfill in Vault popup — it is read-only reference, never a default. Underlying operations unchanged. |
| 1.2 | 2026-09-14 | Jay's edits: recorder identity is automatic (not an input), edit action logs the editing user, delete should get a confirmation dialog, added record-count display control, Recorded By reordered to a required prefilled field, NAV history table column order changed, Source noted for removal once live. Added new Planned requirement: Record, Edit, and Delete NAV all require wallet authorization before taking effect, intended to add deliberate friction rather than just authenticate. |