|
22 | 22 | # replaces the directional-calls table, bullish-only-by-construction handling |
23 | 23 | # (bullish-share/z-score commentary forbidden), one pool-size number |
24 | 24 | # (total_signals) only, no internal field/table names echoed into prose. |
25 | | -PROMPT_VERSION = "report_v3_descriptive" |
| 25 | +# v4 (2026-07-07, TF-05) = TL;DR-first structure: a new 3-bullet "TL;DR" |
| 26 | +# section leads, "Pool Snapshot" moves to second position, prose sections |
| 27 | +# demoted below — reorder + summarize only, no new data surface. |
| 28 | +PROMPT_VERSION = "report_v4_tldr_first" |
26 | 29 |
|
27 | 30 | # Independent version label for the per-signal SEO call (writes seoMetadata onto |
28 | 31 | # the public /signals/{ticker} pages). Deliberately ISOLATED from PROMPT_VERSION: |
@@ -597,8 +600,28 @@ def generate_report_content(payload, report_date: str | None = None): |
597 | 600 | - "headline": 2-3 sentence summary leading with the curated pool size |
598 | 601 | (total_signals) + the dominant theme, then the macro/regime context. No |
599 | 602 | bull/bear splits, no z-scores, no trade calls. |
600 | | -- "content": full markdown body. REQUIRED sections in this order: |
| 603 | +- "content": full markdown body. STRUCTURE PRINCIPLE: a reader — human |
| 604 | + or agent — must get the day's takeaway in the first screen. Lead with the |
| 605 | + TL;DR and the pool table; the prose sections are supporting depth below. |
| 606 | + REQUIRED sections in this order: |
601 | 607 | # {{title}} — Overnight Edge, {{report_date}} |
| 608 | + ## TL;DR |
| 609 | + EXACTLY three bullets, one line each, no hedging: |
| 610 | + 1. The curated pool size (total_signals) + the dominant catalyst theme. |
| 611 | + 2. The regime read: risk_state + the single most load-bearing macro |
| 612 | + datum behind it (VIX level/trend or term structure). |
| 613 | + 3. The one thing a returning reader most needs to know today: the most |
| 614 | + significant change_vs_yesterday, divergence, or sector rotation |
| 615 | + flag — whichever the data says matters most. |
| 616 | + No trade calls, no bullish-share stats, no new claims that the body |
| 617 | + does not also cover. |
| 618 | + ## Pool Snapshot |
| 619 | + Render the per_candidate_calls list as a markdown table with columns |
| 620 | + Ticker | Flow Read | Basis. The Flow Read is a descriptive |
| 621 | + classification of what the flow shows (BULLISH / BEARISH / UNCLEAR), |
| 622 | + NOT a trade call; the Basis cites the load-bearing datum. Rows must |
| 623 | + match what you also output in the structured `per_candidate_calls` |
| 624 | + field. |
602 | 625 | ## Market Pulse |
603 | 626 | The curated pool size (total_signals — cite this number and NO other |
604 | 627 | count) + the dominant catalyst themes + one line of macro context. No |
@@ -641,13 +664,6 @@ def generate_report_content(payload, report_date: str | None = None): |
641 | 664 | Same structure for top_bearish. If top_bearish is empty, write a single |
642 | 665 | line: "No bearish names — the curated pool is bullish-only by |
643 | 666 | construction." |
644 | | - ## Pool Snapshot |
645 | | - Render the per_candidate_calls list as a markdown table with columns |
646 | | - Ticker | Flow Read | Basis. The Flow Read is a descriptive |
647 | | - classification of what the flow shows (BULLISH / BEARISH / UNCLEAR), |
648 | | - NOT a trade call; the Basis cites the load-bearing datum. Rows must |
649 | | - match what you also output in the structured `per_candidate_calls` |
650 | | - field. |
651 | 667 | ## Divergence Watch |
652 | 668 | For each entry in `divergences`: ticker + flag list + 1-line |
653 | 669 | interpretation. If `divergences` is empty, write a single line saying so. |
|
0 commit comments