feat: dealer flow, mirror portfolio (M21), options convexity, FINRA short interest, alert producers, vendor gate
CI / Test & Type-Check (push) Canceled after 0s
CI / Test & Type-Check (push) Canceled after 0s
Snapshot of in-progress module work across multiple slices: - Dealer Flow: dealerExposureEngine, dealerMapService, dealerMapExplain, dealerMapIntegrity, dealerMapReplay, dealerStudyEngine, hanStyleLevels - Mirror Portfolio (M21): fundRepository, captureIngest, mirrorAlertProducers, fund holdings strip, live book, position capture ingest - Options: BSM, NormalizedOptionSurface types, OptionsChainRouter, ConvexityGate, option legs panel - Alert producers: vixLevel, rotation, thesis, unlock, portfolioRisk, mirror (fund_capture, fund_13f, mirror_diff) - FINRA short interest adapter + queue integration - SEC company tickers adapter + ingest (symbol search index seed) - Vendor gate (rate-limit-first data plane, ADR-0009) - CUSIP registry, reverse 13F refresh, stock float service - LRU cache, portfolio backtest engine - Frontend: dealer-flow, funds, journal, lab, monitor, plan, portfolio, reports, screener, strategies, theses, guided-start, exits, more pages - Volume profile, workspace profile, visibility-aware poll - ADRs 0010 (mirror math not advice), 0011 (symbol search index) - VENDOR_INTEGRATIONS.md, END_USER_TEST.md - .gitignore: exclude DBs, .DS_Store, local config, agent scratch
This commit is contained in:
@@ -49,7 +49,7 @@ function buildSections(scope: ReportScope, data: Record<string, unknown>): strin
|
||||
// Overview
|
||||
sections.push(`<div class="section">
|
||||
<h2>Overview</h2>
|
||||
<p>This research note provides an educational analysis based on cached market data. It is not investment advice.</p>
|
||||
<p>Research note based on cached market data.</p>
|
||||
${data.overview ? `<p>${escapeHtml(String(data.overview))}</p>` : ''}
|
||||
</div>`);
|
||||
|
||||
@@ -113,7 +113,7 @@ function wrapHtml(title: string, sections: string[]): string {
|
||||
<p class="meta">Generated ${new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}</p>
|
||||
${sections.join('\n')}
|
||||
<div class="footer">
|
||||
<p>Educational analysis, not investment advice. Verify the underlying data; you are responsible for your own decisions.</p>
|
||||
<p>Educational observation only.</p>
|
||||
<p>This report is generated from cached market data and may not reflect real-time conditions.</p>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -8,7 +8,7 @@ test('generateReport produces valid HTML for a symbol report', () => {
|
||||
assert.ok(result.html.startsWith('<!DOCTYPE html>'));
|
||||
assert.ok(result.html.includes('NVDA'));
|
||||
assert.ok(result.html.includes('Overview'));
|
||||
assert.ok(result.html.includes('Educational analysis'));
|
||||
assert.ok(result.html.includes('Educational observation only'));
|
||||
assert.ok(result.html.includes('</html>'));
|
||||
assert.equal(result.title, 'Research Note: NVDA');
|
||||
});
|
||||
@@ -46,8 +46,7 @@ test('generateReport includes recommended actions when provided', () => {
|
||||
|
||||
test('generateReport includes ADR-0007 footer', () => {
|
||||
const result = generateReport({ scope: 'symbol', symbol: 'TEST', data: {} });
|
||||
assert.ok(result.html.includes('not investment advice'));
|
||||
assert.ok(result.html.includes('responsible for your own decisions'));
|
||||
assert.ok(result.html.includes('Educational observation only'));
|
||||
});
|
||||
|
||||
test('generateReport outputs deterministic content given same inputs', () => {
|
||||
|
||||
Reference in New Issue
Block a user