Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,12 @@
"id": "governance-endpoints",
"category": "Governance Operations",
"label": "Workstation endpoints expose governance break queue and calibration routes",
"paths": ["src/Meridian.Ui.Shared/Endpoints/WorkstationEndpoints.cs"],
"paths": [
"src/Meridian.Ui.Shared/Endpoints/WorkstationEndpoints.cs",
# Route literals moved into UiApiRoutes constants; scan both so
# constant-backed routes still count as endpoint evidence.
"src/Meridian.Contracts/Api/UiApiRoutes.cs",
],
"terms": ["break-queue", "calibration-summary", "sign-off"],
"weight": 3,
"remediation": "Keep governance readiness tied to workstation endpoints and documented route evidence.",
Expand Down
42 changes: 37 additions & 5 deletions docs/generated/repository-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -999,6 +999,8 @@ Meridian-main
├── build
│ ├── ci
│ │ └── lane-manifest.json
│ ├── config
│ │ └── file-size-baseline.json
│ ├── dotnet
│ │ ├── DocGenerator
│ │ │ ├── DocGenerator.csproj
Expand Down Expand Up @@ -1056,6 +1058,7 @@ Meridian-main
│ │ ├── promptfoo-adapter.py
│ │ └── promptfoo_adapter.py
│ ├── ci
│ │ ├── check-file-size.py
│ │ ├── check-lane-manifest.py
│ │ ├── check-warning-suppressions.py
│ │ ├── check-workflow-hygiene.py
Expand Down Expand Up @@ -1314,6 +1317,7 @@ Meridian-main
│ │ ├── meridian-development-intelligence-framework.md
│ │ ├── meridian-domain-model.md
│ │ ├── meridian-vision.md
│ │ ├── module-conventions.md
│ │ ├── module-map.md
│ │ ├── mvvm-guidelines.md
│ │ ├── operator-observability-dashboard.md
Expand Down Expand Up @@ -3177,8 +3181,6 @@ Meridian-main
│ │ │ │ ├── OrderReplace.cs
│ │ │ │ ├── SessionStats.cs
│ │ │ │ └── Trade.cs
│ │ │ ├── Reconciliation
│ │ │ │ └── ReconciliationDomainModels.cs
│ │ │ ├── CanonicalSymbol.cs
│ │ │ ├── IPositionSnapshotStore.cs
│ │ │ ├── MarketDataModels.cs
Expand Down Expand Up @@ -3735,8 +3737,6 @@ Meridian-main
│ │ │ ├── FileStatementReconciliationCheckpointStore.cs
│ │ │ ├── ReconciliationContextContracts.cs
│ │ │ ├── ReconciliationContractCatalog.cs
│ │ │ ├── ReconciliationContracts.cs
│ │ │ ├── ReconciliationEngine.cs
│ │ │ ├── ReconciliationEngineService.cs
│ │ │ ├── ReconciliationOrchestrationResilience.cs
│ │ │ ├── ReconciliationServiceRegistration.cs
Expand Down Expand Up @@ -4517,11 +4517,13 @@ Meridian-main
│ │ │ │ ├── V_ledger_019__fund_profile_tenancy.sql
│ │ │ │ ├── V_ledger_020__fund_scope_tenant_columns.sql
│ │ │ │ ├── V_ledger_021__operations_continuity_tenant_column.sql
│ │ │ │ └── V_ledger_022__tenant_lower_indexes.sql
│ │ │ │ ├── V_ledger_022__tenant_lower_indexes.sql
│ │ │ │ └── V_ledger_023__journal_as_of_indexes.sql
│ │ │ ├── AccountingPostingCommandValidator.cs
│ │ │ ├── DurableAutomatedJournalPoster.cs
│ │ │ ├── ILedgerJournalStore.cs
│ │ │ ├── LedgerBookServiceException.cs
│ │ │ ├── LedgerJournalStoreHydrationExtensions.cs
│ │ │ ├── LedgerJournalStoreOptions.cs
│ │ │ ├── LedgerMigrationRunner.cs
│ │ │ ├── LedgerPeriodPostingGuard.cs
Expand Down Expand Up @@ -5548,6 +5550,7 @@ Meridian-main
│ │ │ ├── IngestionJobEndpoints.cs
│ │ │ ├── LeanEndpoints.cs
│ │ │ ├── LedgerEndpoints.cs
│ │ │ ├── LedgerEndpoints.JournalAutomation.cs
│ │ │ ├── LiveDataEndpoints.cs
│ │ │ ├── LoginSessionMiddleware.cs
│ │ │ ├── MaintenanceScheduleEndpoints.cs
Expand Down Expand Up @@ -6495,6 +6498,21 @@ Meridian-main
│ └── README.md
├── tests
│ ├── fixtures
│ │ ├── corporate-actions
│ │ │ └── golden
│ │ │ ├── aapl-split-4to1-2020.json
│ │ │ ├── alias-normalization-mixed.json
│ │ │ ├── bond-call-101-5.json
│ │ │ ├── cash-stock-merger-2018.json
│ │ │ ├── dividend-amended-supersede.json
│ │ │ ├── dividend-cancelled-after-announce.json
│ │ │ ├── dividend-missing-prior-bar.json
│ │ │ ├── dividend-no-position-context.json
│ │ │ ├── ge-reverse-split-1for8-2021.json
│ │ │ ├── KNOWN-DEFECTS.md
│ │ │ ├── mbs-factor-paydown.json
│ │ │ ├── special-dividend-25pct-synthetic.json
│ │ │ └── t-wbd-spinoff-2022.json
│ │ ├── portfolio
│ │ │ ├── source-payloads
│ │ │ │ ├── bank-statement-2026-06-04.csv
Expand All @@ -6517,7 +6535,11 @@ Meridian-main
│ │ ├── BatchBacktestServiceTests.cs
│ │ ├── BracketOrderTests.cs
│ │ ├── CanonicalBacktestResultNormalizerTests.cs
│ │ ├── CorporateActionAdjustmentPropertyTests.cs
│ │ ├── CorporateActionAdjustmentServiceTests.cs
│ │ ├── CorporateActionGoldenAdjustmentTests.cs
│ │ ├── CorporateActionKnownDefectTests.cs
│ │ ├── CorporateActionSeriesInvariants.cs
│ │ ├── FillModelExpansionTests.cs
│ │ ├── FillModelTests.cs
│ │ ├── GlobalUsings.cs
Expand Down Expand Up @@ -7180,6 +7202,7 @@ Meridian-main
│ │ │ └── SecurityMaster
│ │ │ └── SecurityKindMappingTests.cs
│ │ ├── Reporting
│ │ │ ├── NavAttributionServiceTests.cs
│ │ │ ├── ReportGenerationServiceTests.cs
│ │ │ ├── ReportingOrchestrationServiceTests.cs
│ │ │ ├── ReportSnapshotDiffEngineTests.cs
Expand All @@ -7205,8 +7228,12 @@ Meridian-main
│ │ │ ├── CanonicalRegistryCoverageSourceTests.cs
│ │ │ ├── CorporateActionCommandServiceTests.cs
│ │ │ ├── CorporateActionEffectiveStateProjectorTests.cs
│ │ │ ├── CorporateActionGoldenLedgerTests.cs
│ │ │ ├── CorporateActionInboxStateTests.cs
│ │ │ ├── CorporateActionIngestOrchestratorTests.cs
│ │ │ ├── CorporateActionLedgerInvariants.cs
│ │ │ ├── CorporateActionLedgerKnownDefectTests.cs
│ │ │ ├── CorporateActionTaxonomyPropertyTests.cs
│ │ │ ├── CorporateActionTypeDescriptorCatalogTests.cs
│ │ │ ├── DataVendorEntitlementServiceTests.cs
│ │ │ ├── SecurityAssetClassCatalogTests.cs
Expand Down Expand Up @@ -7275,6 +7302,7 @@ Meridian-main
│ │ │ ├── JsonlReplayerTests.cs
│ │ │ ├── LedgerBookServiceTests.cs
│ │ │ ├── LedgerDatabaseFactAttribute.cs
│ │ │ ├── LedgerJournalStoreHydrationTests.cs
│ │ │ ├── LedgerJournalStoreTests.cs
│ │ │ ├── LedgerPostgresTestDatabase.cs
│ │ │ ├── LifecyclePolicyEngineTests.cs
Expand Down Expand Up @@ -7817,6 +7845,10 @@ Meridian-main
│ │ ├── test_windows_desktop_build_workflow.py
│ │ ├── test_wpf_msix_install_guidance.py
│ │ └── test_wpf_msix_manifest.py
│ ├── Shared
│ │ └── CorporateActions
│ │ ├── GoldenCorporateActionScenario.cs
│ │ └── GoldenCorporateActionScenarioLoader.cs
│ ├── coverlet.runsettings
│ ├── Directory.Build.props
│ ├── setup-script-tests.md
Expand Down
3 changes: 3 additions & 0 deletions docs/product/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ It routes non-technical audiences to verified evidence and prevents duplicate cl
- [High-Value Code Brainstorm (2026-07)](high-value-code-brainstorm-2026-07.md) — market-researched
prioritization of the next highest-value implementable features, sequenced against the W6/W7
roadmap lanes
- [Data Provider & Accounting Code Brainstorm (2026-07)](data-provider-accounting-brainstorm-2026-07.md) —
code-grounded improvement lanes for the provider and accounting subsystems with a dated status
table tracking which lanes have since shipped
- [Portfolio Cash Ladder Blueprint (2026-07)](portfolio-cash-ladder-blueprint-2026-07.md) —
code-ready design for the wave-8 portfolio cash-flow forecasting and liquidity ladder engine,
aggregating per-security projection runs into scenario-aware, per-currency cash ladders
Expand Down
12 changes: 9 additions & 3 deletions docs/product/data-provider-accounting-brainstorm-2026-07.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ analysis of 2026-07-05, with dated update notes where the premise has changed. C
| 3 | Unified data quality + browser dashboard | Partially done | The Data workspace now renders `DataQualityRegion` over `/api/quality/dashboard`. Remaining: unifying the three scoring subsystems behind one composite health model, and contextual gap actions (one-click backfill). |
| 4 | Backfill feedback loop | Done | `OnProgressUpdate` is raised with subscriber-failure guards; SLA metadata is typed (`BackfillRemediationSlaDecision`/`Metadata`/`Status`); the remediation provider is an options default rather than hard-coded. |
| 5 | Failure & rate-limit hardening | Partially done | `DataSourceRegistry` now records activation/registration failures via `RecordFailure`. Remaining: typed rate-limit detection (string matching on `"429"`/`"rate limit"` still present in the composite), streaming-side rate-limit tracking, and confirming registration failures surface in the provider catalog UI. |
| 6 | Mark-to-market wiring | Largely done | `DailyMarkToMarketService` runs `DailyPortfolioPricingProjector` into governed drafts, with tests. Remaining: `NavAttributionService` still computes `totalNav` as a sum of all component balances rather than assets − liabilities, and NAV consumption of the marked book needs end-to-end verification. |
| 7 | Automated journal drafts | Partially done | Corporate-action/dividend event producers and draft intake shipped (`AutomatedJournalEventKind`, `DurableAutomatedJournalPoster`, `AutomatedJournalDraftIntakeService`). Remaining: management/performance-fee and withholding-tax accrual producers on a schedule. |
| 8 | Closing entries + retained-earnings roll | Projector built, unwired | `PeriodCloseProjector`/`PeriodCloseDraftBuilder` now exist in `Meridian.Ledger` but have no callers outside the library — the hard-close sequence in close management does not yet invoke them. |
| 6 | Mark-to-market wiring | Done (2026-07-06) | `DailyMarkToMarketService` runs `DailyPortfolioPricingProjector` into governed drafts, with tests. `NavAttributionService` now computes NAV as assets − liabilities (with `ByAssetClass` decomposing that total), covered by `NavAttributionServiceTests`. |
| 7 | Automated journal drafts | Done (2026-07-06) | Corporate-action/dividend producers, management/performance-fee accrual (`FeeScheduleAccrualEventProducer` + `RunFeeAccrualIntakeAsync` + endpoint), and dividend withholding-tax accrual (`WithholdingTaxRate` on the dividend intake lane) all land governed drafts in the workbench queue. Operator/cockpit-triggered; recurring scheduling remains optional follow-on. |
| 8 | Closing entries + retained-earnings roll | Done (2026-07-06) | `AutomatedJournalIntakeRunner.RunPeriodCloseIntakeAsync` projects closing entries from a closed period's trial balance and lands the governed draft in the workbench queue via `/api/ledger/journal-automation/period-close-intake`; open periods are rejected loudly. |
| 9 | One ledger spine | Open | `DurableAutomatedJournalPoster` is the emerging draft-posting seam, but hydration of read surfaces from `ILedgerJournalStore`, as-of indexing, and the F#/C# enum-ordinal guard test have not started. |
| 10 | Fill-to-ledger durability | Done | `LedgerPostingConsumer.Publish` now blocks on channel capacity (`WaitToWriteAsync` loop) instead of dropping fills, with a regression test covering the full-channel case. |

Expand Down Expand Up @@ -218,6 +218,12 @@ through the existing event-pipeline policy channels, drop-oldest). The SLA metad
touches persisted execution logs — route through the WAL/`AtomicFileWriter` patterns and keep the
parser as fallback for old records.

> **Update (2026-07-06):** implemented — `CompositeHistoricalDataProvider` raises progress through
> `RaiseProgress`, `AutoGapRemediationService` stores typed `BackfillRemediationSlaMetadata`
> records, and the remediation provider comes from `AutoGapRemediationPolicy.DefaultProvider`
> rather than a hard-coded call-site. This lane is done; the narrative above is the point-in-time
> analysis, not a work list.

### 5. Provider Failure & Rate-Limit Hardening

Three small findings that share a theme — failures that vanish. `DataSourceRegistry.cs` swallows
Expand Down
16 changes: 8 additions & 8 deletions docs/status/TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,14 @@ Total items: **212**
| `src/Meridian.Ui/dashboard/src/screens/accounting-screen.view-model.ts` | 6070 | `NOTE` | ❌ | note: event.sourceReason ?? (event.isCurrentProjection ? "Current schedule projection." : null) |
| `src/Meridian.Ui/dashboard/src/screens/covered-call-screen.view-model.ts` | 287 | `NOTE` | ❌ | note: string; |
| `src/Meridian.Ui/dashboard/src/screens/covered-call-screen.view-model.ts` | 990 | `NOTE` | ❌ | note: "Covered-call net curve requires the underlying cost basis which is not yet threaded through the API. The chart shows the short-call leg only." |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 127 | `NOTE` | ❌ | note: string; |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 140 | `NOTE` | ❌ | note: string; |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 436 | `NOTE` | ❌ | note: "Matches issuer relations and SEC 8-K references. Amount amended from $2.75 at board confirmation.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 458 | `NOTE` | ❌ | note: "Awaiting final packet annotation from treasury.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 479 | `NOTE` | ❌ | note: "Retained for longitudinal identifier reconciliation.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 500 | `NOTE` | ❌ | note: "Issuer withdrew the distribution before record date; retained for audit evidence.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 712 | `NOTE` | ❌ | note: "Matches paying agent notice and treasury schedule.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 735 | `NOTE` | ❌ | note: "Historical programme amendment retained for evidence.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 128 | `NOTE` | ❌ | note: string; |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 141 | `NOTE` | ❌ | note: string; |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 437 | `NOTE` | ❌ | note: "Matches issuer relations and SEC 8-K references. Amount amended from $2.75 at board confirmation.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 459 | `NOTE` | ❌ | note: "Awaiting final packet annotation from treasury.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 480 | `NOTE` | ❌ | note: "Retained for longitudinal identifier reconciliation.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 501 | `NOTE` | ❌ | note: "Issuer withdrew the distribution before record date; retained for audit evidence.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 713 | `NOTE` | ❌ | note: "Matches paying agent notice and treasury schedule.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 736 | `NOTE` | ❌ | note: "Historical programme amendment retained for evidence.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.security-master.ts` | 883 | `NOTE` | ❌ | note: seed.note, |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.test.tsx` | 40 | `NOTE` | ❌ | note: "Realtime subscriptions are stable.", |
| `src/Meridian.Ui/dashboard/src/screens/data-screen.test.tsx` | 439 | `NOTE` | ❌ | note: "Backfill pressure is elevated.", |
Expand Down
38 changes: 22 additions & 16 deletions docs/status/api-contract-coverage-dashboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"endpoint_coverage_percent": 100.0,
"contract_coverage_percent": 100.0,
"summary": {
"endpoint_count": 595,
"documented_endpoint_count": 595,
"endpoint_count": 596,
"documented_endpoint_count": 596,
"undocumented_endpoint_count": 0,
"workstation_contract_count": 814,
"documented_workstation_contract_count": 814,
Expand Down Expand Up @@ -1838,6 +1838,24 @@
"source": "src/Meridian.Ui.Shared/Endpoints/LeanEndpoints.cs:549",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-automation/dividend-intake",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.JournalAutomation.cs:19",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-automation/fee-accrual-intake",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.JournalAutomation.cs:61",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-automation/period-close-intake",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.JournalAutomation.cs:103",
"documented": true
},
{
"method": "GET",
"path": "/api/ledger/books",
Expand Down Expand Up @@ -2132,28 +2150,16 @@
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:1975",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-automation/dividend-intake",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:2018",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-automation/fee-accrual-intake",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:2060",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-entry-workbench/evidence",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:2102",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:2020",
"documented": true
},
{
"method": "POST",
"path": "/api/ledger/journal-entry-workbench/lifecycle-action",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:2145",
"source": "src/Meridian.Ui.Shared/Endpoints/LedgerEndpoints.cs:2063",
"documented": true
},
{
Expand Down
Loading
Loading