Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
0fafaab
Bump @tailwindcss/vite from 4.3.0 to 4.3.3 in /frontend
dependabot[bot] Aug 15, 2026
16628c3
Sync main into dev
parthdongre Aug 19, 2026
ecfee2d
Merge pull request #31 from parthdongre/dependabot/npm_and_yarn/front…
parthdongre Aug 19, 2026
09a326a
feat: add configurable execution resource policies
parthdongre Aug 26, 2026
18f3c02
feat: add deterministic environment config overrides
parthdongre Aug 26, 2026
ebe146b
feat: add versioned execution planner contract
parthdongre Aug 26, 2026
4a3b250
feat: add reusable analysis execution context
parthdongre Aug 26, 2026
bbb3f95
feat: make planner dependency aware
parthdongre Aug 26, 2026
4240cfd
docs: align 0.3 roadmap and execution docs
parthdongre Aug 26, 2026
a7e4a1c
feat: expose explicit resource caps in Python APIs
parthdongre Aug 26, 2026
89f9d3b
fix: enforce sample caps in quality diagnostics
parthdongre Aug 26, 2026
50950d4
fix: preserve analysis mode compatibility aliases
parthdongre Aug 27, 2026
129f0b5
fix: remove report generator import side effect
parthdongre Aug 27, 2026
1f84d1d
chore: remove unused report tab placeholder
parthdongre Aug 27, 2026
f6c4ba8
fix: enforce hard sample caps in streaming quality
parthdongre Aug 27, 2026
297618d
test: cover streaming resource hard caps
parthdongre Aug 27, 2026
08c3c48
fix: preserve config object precedence over environment
parthdongre Aug 27, 2026
f0dbef5
test: cover resolved config precedence
parthdongre Aug 27, 2026
5d3fea3
fix: harden runtime configuration validation
parthdongre Aug 27, 2026
f10daff
test: harden direct config validation
parthdongre Aug 27, 2026
779b750
refactor: harden RAG runtime configuration
parthdongre Aug 27, 2026
e73114a
test: cover RAG runtime compatibility settings
parthdongre Aug 27, 2026
2bbd0e7
refactor: harden and unify Flask execution
parthdongre Aug 27, 2026
cbaff60
test: cover Flask execution hardening
parthdongre Aug 27, 2026
a60e9b7
fix: make safe pandas evaluation side-effect free
parthdongre Aug 27, 2026
8a94f23
test: cover read-only pandas sandbox
parthdongre Aug 27, 2026
7aac933
fix: preserve safe upload extensions
parthdongre Aug 27, 2026
335331a
test: cover upload and CSV safety edge cases
parthdongre Aug 27, 2026
dc18da6
fix: preserve filename sanitizer compatibility
parthdongre Aug 27, 2026
9061977
fix: proxy dataset download routes correctly
parthdongre Aug 27, 2026
7503451
fix: harden frontend API response handling
parthdongre Aug 27, 2026
8bc9ea8
fix: validate execution controls at runtime boundary
parthdongre Aug 27, 2026
b4fa458
test: cover execution boundary validation
parthdongre Aug 27, 2026
345d003
fix: preserve AI fallback diagnostics
parthdongre Aug 27, 2026
52d2b1e
test: preserve AI fallback diagnostics
parthdongre Aug 27, 2026
6414ba5
fix: validate snapshot integrity
parthdongre Aug 27, 2026
12e0738
test: cover snapshot integrity validation
parthdongre Aug 27, 2026
c486606
fix: honor sub-ten quality sample caps
parthdongre Sep 5, 2026
18e4a61
test: execute quality diagnostics below ten-row cap
parthdongre Sep 5, 2026
df538e5
test: compare valid changed snapshots
parthdongre Sep 5, 2026
71cffce
fix: keep upload paths server-controlled
parthdongre Sep 5, 2026
44b99f7
fix: close web security findings before release
parthdongre Sep 5, 2026
84669a4
fix: avoid logging managed upload paths
parthdongre Sep 5, 2026
21a4349
release: promote FrameVitals 0.3.0 stabilization to dev
parthdongre Sep 5, 2026
f1a27c2
chore: add one-shot 0.3.0 lockfile sync
parthdongre Sep 5, 2026
700f39d
release: bump Rust core to 0.3.0
parthdongre Sep 5, 2026
29ac51e
release: bump Python package to 0.3.0
parthdongre Sep 5, 2026
990d49d
release: expose FrameVitals 0.3.0 version
parthdongre Sep 5, 2026
4f10c9d
release: finalize 0.3.0 changelog
parthdongre Sep 5, 2026
53b022d
docs: point examples at v0.3.0
parthdongre Sep 5, 2026
5d8389f
release: bump Rust bridge to 0.3.0
parthdongre Sep 5, 2026
c04446f
chore: sync Cargo.lock for 0.3.0
github-actions[bot] Sep 5, 2026
3e11c9f
chore: remove one-shot release lockfile sync
parthdongre Sep 5, 2026
62351a9
chore: open protected-main 0.3.0 release PR
parthdongre Sep 5, 2026
28e29a9
chore: remove temporary protected-main PR workflow
parthdongre Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 57 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,63 @@ FrameVitals follows semantic versioning while the public API matures. The 0.x se

## Unreleased

No user-facing changes are currently queued beyond 0.2.0.
No user-facing changes are currently queued beyond 0.3.0.

## 0.3.0 - 2026-09-05

FrameVitals 0.3.0 focuses on predictable execution, reusable planning state, monitoring integrity, and safer web/API behavior while retaining the source-aware Arrow/Rust execution architecture introduced in 0.2.0.

### Highlights

- Added enforceable per-run resource caps for sampled rows, relationship-pair work, memory-heavy parallelism, and ultra-wide streaming profile width.
- Added a versioned, dependency-aware execution planner with explicit module decisions, resource classes, dependency blocking, runnable order, and topological execution stages.
- Added a reusable per-run `AnalysisContext` for exactly-once planning intermediates, facts, bounded samples, deterministic seeds, and metadata-only provenance.
- Added deterministic `FRAMEVITALS_*` environment overrides with documented precedence and explicit Python API overrides.
- Added snapshot integrity verification so monitoring comparisons reject tampered or internally inconsistent snapshots instead of treating modified metadata as trustworthy state.
- Hardened the Flask/web layer against path traversal, user-derived filesystem paths, exception-detail disclosure, and sensitive path logging.

### Configuration and execution policy

- Added `max_sample_rows`, `max_relationship_pairs`, `max_memory_heavy_parallelism`, and `max_streaming_profile_columns` to `AnalysisConfig` and the public `analyze()`/`plan()` Python APIs.
- Resource caps are hard upper bounds: they can only tighten adaptive work and never silently expand work above mode defaults.
- Added deterministic environment overrides for preset, mode, target, artifacts, workers, disabled modules, and all four resource caps.
- Configuration precedence is now deterministic: defaults < preset < environment < config mapping/TOML/`AnalysisConfig` < explicit Python arguments.
- Added the `exhaustive` preset as the forward-looking alias for the deepest built-in policy while retaining `research` compatibility throughout the 0.x series.
- Added per-run `ExecutionPolicy` scoping using context-local state so concurrent analyses can apply different limits without mutating process-global policy.
- Fixed low sample caps so values below ten remain valid hard limits; diagnostics that need more observations now skip individually rather than rejecting the configured budget.

### Planning and reusable execution state

- Added planner schema version `1` and structured per-module decisions including status, reason, resource class, dependencies, and blocking information.
- Centralized built-in mode-to-module policy in the planner and made public analysis configuration consume the same source of truth.
- Added dependency propagation so disabling or invalidating an upstream module marks dependent work non-applicable instead of falsely advertising it as runnable.
- Added topologically ordered execution stages plus a flattened runnable-module order for scheduler integration.
- Added `AnalysisContext`, a per-run thread-safe container for resolved config, execution policy, source metadata, authoritative facts, exactly-once cached intermediates, reusable samples, deterministic seed, and provenance metadata.
- Updated `framevitals.plan()` to reuse one context for column roles, dataset signals, execution-budget derivation, and execution-plan construction.
- Preserved compatibility aliases for pre-0.3 internal analysis-mode policy imports while keeping the planner as the authoritative implementation.

### Monitoring and snapshot integrity

- Snapshot loading/comparison now validates integrity instead of accepting modified fingerprints or inconsistent serialized state.
- CLI monitoring tests now compare two independently generated valid snapshots rather than mutating snapshot internals.
- Snapshot integrity failures are surfaced as validation errors before drift/monitoring logic runs.

### Web and API hardening

- Uploaded filenames no longer determine server filesystem paths; validated extensions are mapped through server-owned suffixes and generated dataset identifiers.
- Upload paths are retained in bounded server-side state instead of being stored in client-side Flask session data.
- Report, cleaned-dataset, and temporary-upload paths are resolved and constrained to managed directories before filesystem operations.
- Server-rendered and JSON endpoints now keep exception details in server logs and return stable generic error messages externally.
- Removed logging of managed upload paths after CodeQL identified them as potentially sensitive data.
- PDF and AI fallback failures no longer expose raw exception text to clients.
- `/api/health` now reports the installed FrameVitals package version instead of a hard-coded web API version string.
- Web analysis uses the same canonical mode policy as the Python API.

### Compatibility and release quality

- Python 3.11, 3.12, and 3.13 core lanes, lower-bound dependencies, optional features, Arrow fallback, Arrow/DuckDB and Polars interoperability, native Rust/Python bridge checks, frontend builds, package quality, and CodeQL were exercised during the release-candidate gate.
- The release keeps `research` mode accepted while exposing `exhaustive` as an alias; no public 0.2 API was intentionally removed.
- The package remains an alpha (`0.x`) release: planner stages are now an explicit scheduling contract, while deeper planner control of every materialized/streaming runtime scheduling branch can continue incrementally without changing the 0.3 public planner schema.

## 0.2.0 - 2026-08-17

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ fv.analyze(data, mode="deep")
fv.analyze(data, mode="research")
```

Use `quick` for fast checks and the deeper modes when you want broader statistical or modelling diagnostics.
Use `quick` for fast checks and the deeper modes when you want broader statistical or modelling diagnostics. For preset-driven configuration, `exhaustive` is available as an alias for the deepest built-in preset while `research` remains supported.

## Source-Aware Execution

Expand Down Expand Up @@ -255,7 +255,7 @@ Training / Analytics / Production
The repository includes a reusable GitHub Action:

```yaml
- uses: parthdongre/FrameVitals@v0.2.0
- uses: parthdongre/FrameVitals@v0.3.0
id: framevitals
with:
current: data/production.parquet
Expand Down
Loading