diff --git a/.codex/skills/analyst/SKILL.md b/.codex/skills/analyst/SKILL.md index cc200c9..1343b1b 100644 --- a/.codex/skills/analyst/SKILL.md +++ b/.codex/skills/analyst/SKILL.md @@ -88,6 +88,7 @@ Generated prediction reports must remain stage-safe: - T0 reports use only prospectus-stage fields and T0 calibration. - T1 reports may add allotment demand fields and T1 calibration. - T2/D1 is the intended sell window; D5/D20/D60 returns are never shown as prediction inputs and are reserved for later review cards. +- Every report must include a concrete stage calendar for the ticker: T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date. ## Output Standards @@ -96,6 +97,7 @@ Every prediction card should include: - `ticker` - `stage` - `data_as_of` +- concrete T0/T1/T2/D1 dates for the ticker - `rule_version` - `decision` - `total_score` diff --git a/README.md b/README.md index 9c8f0d7..e372d0a 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ Use the analyst report generator after the archive and model dataset are current The generator writes `reports/{date}_{ticker}_{stage}_analysis.md` by default. It auto-selects `T1_allotment` when structured allotment-demand facts exist; otherwise it generates a `T0_prospectus` report. Use `--stdout` for a dry run or `--output` to choose a specific Markdown path. -Prediction reports are stage-safe: T0 reports use only prospectus-stage facts and T0 calibration, while T1 reports add allotment demand and T1 calibration. Reports should frame the trade as a T2/D1 exit. Post-listing D5/D20/D60 performance stays out of prediction reports and is reserved for review cards. +Prediction reports are stage-safe: T0 reports use only prospectus-stage facts and T0 calibration, while T1 reports add allotment demand and T1 calibration. Each report includes a concrete stage calendar for that ticker: T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date. Reports should frame the trade as a T2/D1 exit. Post-listing D5/D20/D60 performance stays out of prediction reports and is reserved for review cards. ## Incremental Archive Sync diff --git a/reports/2026-06-15_06106_T0_prospectus_analysis.md b/reports/2026-06-15_06106_T0_prospectus_analysis.md index 9341e89..8a65c63 100644 --- a/reports/2026-06-15_06106_T0_prospectus_analysis.md +++ b/reports/2026-06-15_06106_T0_prospectus_analysis.md @@ -16,6 +16,15 @@ - Score bucket: `t0_gte_8` - Calibrated D1 positive probability: 76.4% from 72 historical D1 labels +## Stage Calendar + +| Stage | Concrete Date For This IPO | Meaning | +| --- | --- | --- | +| `T0_prospectus` | 2026-06-15 to 2026-06-18 | Subscription window; use prospectus and offer terms only. | +| `T1_allotment` | 2026-06-23 | Allotment results day; use public demand, placing demand, and allocation facts. | +| `T2_grey_market` | 2026-06-23 after allotment results | Pre-listing grey-market sell window if a reliable executable source exists. | +| `D1` | 2026-06-24 | First official trading day; default sell window when T2 data is unavailable or unreliable. | + ## Facts | Field | Value | diff --git a/rules/rule_change_log.md b/rules/rule_change_log.md index 14f3908..4684b74 100644 --- a/rules/rule_change_log.md +++ b/rules/rule_change_log.md @@ -1,5 +1,27 @@ # Rule Change Log +## 2026-06-15 - Add concrete stage dates to reports + +Request: + +- Every analyst report should note the specific dates behind T0, T1, T2, and D1 for the covered IPO. + +Change: + +- Added a `Stage Calendar` section to the single-ticker report generator. +- Required analyst reports to show the ticker-specific T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date. +- Updated the 06106 T0 report to include its concrete stage dates. + +Rationale: + +- The T0/T1/T2/D1 labels are project analysis stages, so reports should always bind them to actual calendar dates for the IPO under review. + +Verification: + +- Generated a 06106 dry-run report and checked the stage calendar. +- Ran py_compile for the report generator. +- Ran git diff --check. + ## 2026-06-15 - Clarify short-exit IPO strategy horizon Request: diff --git a/scripts/generate_ipo_report.py b/scripts/generate_ipo_report.py index 02ec9d4..83a8d65 100644 --- a/scripts/generate_ipo_report.py +++ b/scripts/generate_ipo_report.py @@ -287,6 +287,46 @@ def facts_table(record: dict[str, str], stage: str) -> str: return "\n".join(lines) +def stage_calendar_table(record: dict[str, str]) -> str: + application_start = fmt_value(record["application_start_date"]) + application_end = fmt_value(record["application_end_date"]) + allotment_date = fmt_value(record["allotment_results_expected_date"]) + listing_date = fmt_value(record["listing_date"]) + if allotment_date != "n/a": + t2_date = f"{allotment_date} after allotment results" + elif listing_date != "n/a": + t2_date = "trading day before D1; exact date not archived" + else: + t2_date = "n/a" + + rows = [ + ( + "T0_prospectus", + f"{application_start} to {application_end}", + "Subscription window; use prospectus and offer terms only.", + ), + ( + "T1_allotment", + allotment_date, + "Allotment results day; use public demand, placing demand, and allocation facts.", + ), + ( + "T2_grey_market", + t2_date, + "Pre-listing grey-market sell window if a reliable executable source exists.", + ), + ( + "D1", + listing_date, + "First official trading day; default sell window when T2 data is unavailable or unreliable.", + ), + ] + lines = ["| Stage | Concrete Date For This IPO | Meaning |", "| --- | --- | --- |"] + for stage, date_text, meaning in rows: + lines.append(f"| `{stage}` | {date_text} | {meaning} |") + return "\n".join(lines) + + def source_paths(record: dict[str, str], stage: str) -> list[str]: paths = [] if record["prospectus_source_path"]: @@ -367,6 +407,10 @@ def build_report(record: dict[str, str], rows: list[dict[str, str]], stage: str, f"- Score bucket: `{bucket}`", f"- Calibrated D1 positive probability: {fmt_pct_rate(metric.d1_positive_rate)} from {metric.sample_size} historical D1 labels", "", + "## Stage Calendar", + "", + stage_calendar_table(record), + "", "## Facts", "", facts_table(record, stage),