All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Initialized Valiant project structure.
- Backend (Go):
- Implemented Orphan Event Detection: Execution events (e.g., GitOps, manual) without a corresponding intent event (e.g., CI) within a configurable correlation window are now marked as
IsOrphaned. - Intent-Execution Linking: Implemented backend logic to link CI (Intent) and GitOps/manual (Execution) events using
git_shaorimage_tagwithin a configurableintent_execution_correlation_window. This replaces the previousIsOrphanedcheck based solely on services. - Extended
PostgresStorage.GetChangeEventsto support filtering by metadata content (git_shaorimage_tag). - Renamed
OrphanCorrelationWindowtoIntentExecutionCorrelationWindowin configuration for clarity. - Extended
PostgresStorage.GetChangeEventsto support filtering by trigger type, time range, and affected services. - Added
IsOrphanedfield todomain.ImpactAnalysisfor API response. - Added
OrphanCorrelationWindowconfiguration toconfig.yaml. - Project initialization with Go modules.
- Core domain models for
ChangeEvent,MetricValues, andImpactAnalysis. - Defined interfaces for
Storage,MetricsProvider, andCollector. - Skeleton implementations for PostgreSQL storage, Prometheus metrics, and Kubernetes, Git, and CI/CD collectors.
- Core impact correlation engine logic with configurable weights and thresholds.
- Custom weights of metrics (built-in and custom) applicable in config.yaml
- Timestamp Guardrail for ChangeEvent Ingestion: Implemented a defensive mechanism to prevent
ChangeEvents with future timestamps from entering the analysis workflow.- Defined a
max_future_skewof 2 minutes (hardcoded). Events withTimestamporEndTimebeyond this future limit are marked as invalid. - Invalid events are persisted with
status='invalid_time',invalid_reason(e.g.,timestamp_in_future), andskew_secondsfor auditability. - Structured warning logs are emitted for invalid events.
- Analysis workers (
GetEventsPendingAnalysis) now explicitly filter and skip events withstatus != 'ready', preventing them from entering the analysis queue.
- Defined a
- Configurable Worker Polling Interval: Made the analysis worker's polling frequency configurable via
config.yaml.- Added a
worker.polling_intervalfield toconfig.yaml(default "5m"), allowing users to adjust how often the worker checks for new events to process. - The backend worker now uses this configurable interval.
- Added a
- HTTP API server with health check, event submission, event listing, and impact analysis endpoints.
- Initial database migration for the
change_eventstable. - Environment-based configuration management.
- Implemented
PostgresStoragewith actual SQL queries for saving and retrieving change events. - Added automatic execution of
001_initial_schema.sqlon backend startup. - Implemented CORS middleware to allow cross-origin requests from the frontend.
- Updated
main.goto connect to PostgreSQL usinglib/pqand configuration. - Implemented
PrometheusClientwith actual PromQL queries for error rate, latency, RPS, and saturation metrics. - Basic homepage component.
- API client layer for interacting with the backend.
- Implemented Orphan Event Detection: Execution events (e.g., GitOps, manual) without a corresponding intent event (e.g., CI) within a configurable correlation window are now marked as
- Deep Linking Utility:
- Implemented dynamic generation of contextual links within the backend's event retrieval (specifically
PostgresStorage.GetEventsPendingAnalysis) based on configurableLinkTemplates. - Enhanced
PostgresStorageto gracefully handle invalid URL templates and missing metadata keys, skipping link generation when<no value>is produced. - Expanded deep linking test suite (
tests/deep-linking) with comprehensive edge cases, including emptyMetadataHas, static URLs, special characters in metadata, and cases with partial or missing metadata. - Updated example seed scripts (
example/scripts/seed_data.ps1,example/scripts/seed_data.sh) to generate events with varied metadata for deep linking, including valid, partially valid, and invalid scenarios, enabling thorough testing and demonstration.
- Implemented dynamic generation of contextual links within the backend's event retrieval (specifically
- Documentation:
- Added
HOW_TO_USE.mdwith "Quick Start", "Core Concepts", and "For Dummies" guide on connecting apps. - Fixed missing Tailwind CSS configuration (
tailwind.config.ts,postcss.config.js) and dependencies. - Moved styling dependencies to
dependenciesand updated Dockerfile to ensurenpm installruns on startup, fixing volume sync issues. - Added
--legacy-peer-depsto npm install commands to resolve React 19 peer dependency conflicts. - Implemented
GitCollectorto parse git tags and commits from a local repository. - Implemented immutable
ImpactAnalysissnapshots. Analysis results are now stored in the database and reused to prevent historical drift. - Added support for
config.yamlto configure analysis windows (baseline/impact durations), and now customizable Prometheus query templates with variable substitution ({{ .Services }},{{ .Duration }}). - Implemented Automatic Background Analysis: A worker now periodically checks for events with expired impact windows and calculates/snapshots their impact without user intervention.
- Fixed
fetchEventsreference error in frontend by renaming handler tofetchData. - Improved data models in the frontend API layer.
- BREAKING: Changed monitoring model to focus on execution boundaries (Trigger Type: CI, GitOps). Manual events are now deprecated.
- Added
trigger_type,execution_id, andend_timeto ChangeEvent model and database schema. - Polished UI with new icons for triggers:
GitBranchfor GitOps,Botfor CI. - Updated seed scripts to exclude manual actions, reflecting the execution-only model.
- Disabled
GitCollectordefault behavior to align with the new model. - Updated seed scripts (
.shand.ps1) to generate 12 diverse events with varying timestamps and distinct affected services (fixing filtering issues). - Fully implemented
KubernetesCollectorusingclient-gowith strict auditor logic. It now only emits events for completed rollouts (Available=True) that prove intent viavaliant.io/sourceannotation. - Added support for
allowed_sourcesconfiguration to trust only specific deployment systems (ArgoCD, Helm, CI/CD). - Refined K8s detection to capture precise
rollout_startandrollout_endtimestamps for impact anchoring. - Refactored
Collectorinterface to be streaming/push-based (Start(ctx, chan)).
- Added
- Frontend (Next.js):
- Next.js 16 project skeleton with TypeScript and React 19.
- Root layout with Inter font and global CSS.
- Implemented
TimelineandTimelineEventcomponents. - Added on-demand impact analysis triggering from the UI.
- Added detailed metric deltas breakdown in the analysis view with improved visual design (cards, colors).
- Added "Show More" pagination logic to the timeline view.
- Polished UI with
lucide-reacticons and improved layout for events and metrics. - Implemented dedicated Service Dashboard pages (
/services/[name]) for deep-linking and focused analysis. - Enhanced Service Filter UI with focus links.
- Added "Pending Analysis" badge for events where the impact window (35m) has not yet closed.
- Fixed filtering logic in Service Pages to handle URL encoding correctly.
- Refined Service Filter pills on homepage to embed the focus link inside the pill.
- Enforced impact window validation in the backend:
AnalyzeImpactnow returns a specific error and "PENDING" status if called too early, preventing premature analysis. - Added tooltips to metric cards to explain what each metric represents.
- Added "time ago" badge (e.g., "5m ago") next to event timestamps.
- Added safe handling of null API responses in
fetchChangeEvents. - Modal with PromQL queries and their weights for overall score.
- Infrastructure:
- Dockerfiles for Backend and Frontend.
- docker-compose.yml for full stack local development (Postgres, Backend, Frontend).
- Added bash and PowerShell scripts for seeding mock data.