# Phase 0 Baseline and Regression Snapshot Date captured: 2026-04-20 (Australia/Sydney) ## Baseline metrics (local `db.sqlite3` + `reports/`) | Area | Metric | Baseline | | --- | --- | --- | | Hourly capture | `snapshot_registry` hourly entries | `930` | | Hourly capture | Hourly compatibility tables (`inventory_hourly_%`) | `930` | | Hourly capture | Canonical cache rows (`vm_hourly_stats`) | `489865` | | Hourly capture | Latest hourly snapshot row count (`snapshot_count`) | `52` | | Hourly capture | Latest hourly snapshot table | `inventory_hourly_1776635926` | | Daily aggregation | `snapshot_registry` daily entries | `39` | | Daily aggregation | Daily summary tables (`inventory_daily_summary_%`) | `40` | | Daily aggregation | Canonical daily rollup rows (`vm_daily_rollup`) | `1779` | | Daily aggregation | Latest daily summary table | `inventory_daily_summary_20260419` | | Daily aggregation | Latest daily snapshot row count (`snapshot_count`) | `52` | | Monthly aggregation | `snapshot_registry` monthly entries | `1` | | Monthly aggregation | Latest monthly summary table | `inventory_monthly_summary_202601` | | Monthly aggregation | Latest monthly snapshot row count (`snapshot_count`) | `62` | | Report generation | Files present in `reports/` | `10339` | | Report generation | Most recent files | `inventory_hourly_1776635926.xlsx`, `inventory_daily_summary_20260419.xlsx`, `inventory_hourly_1776635626.xlsx` | Notes: - `snapshot_runs` rows: `10254`, success distribution: `TRUE=10254`, attempts min/max/avg: `1/2/1.0001`. - Runtime histograms/counters for long-running jobs are emitted on `/metrics` and are not persisted in SQLite. - Hourly per-vCenter duration: `vctp_vcenter_snapshot_duration_seconds` - Daily duration: `vctp_daily_aggregation_duration_seconds` - Monthly duration: `vctp_monthly_aggregation_duration_seconds` - Reports available gauge: `vctp_reports_available` ## API/endpoint contract regression snapshot Source of truth: `server/router/router.go`. Unauthenticated/public routes: - `/` - `/vm/trace` - `/vcenters` - `/vcenters/totals` - `/vcenters/totals/daily` - `/vcenters/totals/hourly` - `/snapshots/hourly` - `/snapshots/daily` - `/snapshots/monthly` - `/metrics` - `/api/auth/login` - `/assets/*`, `/favicon*`, `/reports/*`, `/swagger*` Viewer routes (Bearer auth, viewer/admin role): - `/api/report/inventory` - `/api/report/updates` - `/api/report/snapshot` - `/api/diagnostics/daily-creation` Admin routes (Bearer auth, admin role): - `/api/event/vm/create` - `/api/event/vm/modify` - `/api/event/vm/move` - `/api/event/vm/delete` - `/api/import/vm` - `/api/inventory/vm/delete` - `/api/inventory/vm/update` - `/api/cleanup/updates` - `/api/snapshots/aggregate` - `/api/snapshots/hourly/force` - `/api/snapshots/migrate` - `/api/snapshots/repair` - `/api/snapshots/repair/all` - `/api/snapshots/regenerate-hourly-reports` - `/api/vcenters/cache/rebuild` - `/api/encrypt` - `/debug/pprof/*` (only when enabled) `/api/auth/me` route: - Protected by auth middleware (`withAuth`) but no explicit role gate. ## Report filename behavior regression snapshot Source of truth: `server/handler/reportDownload.go`, `server/handler/snapshots.go`, `internal/report/snapshots.go`. HTTP download endpoints: - `GET /api/report/inventory` -> `Content-Disposition: attachment; filename="inventory_report.xlsx"` - `GET /api/report/updates` -> `Content-Disposition: attachment; filename="updates_report.xlsx"` - `GET /api/report/snapshot?table=` -> `Content-Disposition: attachment; filename=".xlsx"` On-disk generated report filename: - `SaveTableReport(...)` writes `/.xlsx` - Snapshot list pages link to `/reports/.xlsx` ## Migration guardrails confirmation - No auth-model changes: route auth wrappers remain unchanged (`withAuth`, `withAuthRole` usage in router). - SQLite support retained: - settings default driver remains sqlite (`src/vctp.yml`, `README.md`). - hourly canonical write path still has SQLite transactional upsert path (`insertHourlyCache`, `insertHourlyBatch`). - Compatibility mode enabled by default: - `settings.snapshot_table_compat_mode` default is `true` in settings defaults. - runtime check falls back to enabled when unset (`snapshotTableCompatModeEnabled()`).