diff --git a/scripts/generate_reports.py b/scripts/generate_reports.py
index 265da2d..a45e4eb 100644
--- a/scripts/generate_reports.py
+++ b/scripts/generate_reports.py
@@ -15,6 +15,7 @@ DB_PATH = Path("database/ngxstat.db")
OUTPUT_DIR = Path("output")
TEMPLATE_DIR = Path("templates")
REPORT_CONFIG = Path("reports.yml")
+GENERATED_MARKER = OUTPUT_DIR / "generated.txt"
# Mapping of interval names to SQLite strftime formats. These strings are
# substituted into report queries whenever the special ``{bucket}`` token is
@@ -30,6 +31,18 @@ INTERVAL_FORMATS = {
app = typer.Typer(help="Generate aggregated log reports")
+@app.callback()
+def _cli_callback(ctx: typer.Context) -> None:
+ """Register post-command hook to note generation time."""
+
+ def _write_marker() -> None:
+ OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
+ timestamp = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
+ GENERATED_MARKER.write_text(f"{timestamp}\n")
+
+ ctx.call_on_close(_write_marker)
+
+
def _get_domains() -> List[str]:
"""Return a sorted list of unique domains from the logs table."""
conn = sqlite3.connect(DB_PATH)
diff --git a/tests/test_reports.py b/tests/test_reports.py
index f9399df..fa8f0a0 100644
--- a/tests/test_reports.py
+++ b/tests/test_reports.py
@@ -2,8 +2,10 @@ import sqlite3
from pathlib import Path
import json
import sys
+from datetime import datetime
import pytest
+from typer.testing import CliRunner
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.append(str(REPO_ROOT))
@@ -199,9 +201,23 @@ def test_generate_root_index(tmp_path, sample_reports, monkeypatch):
assert '