starburst 0.3.9 (2026-07-22)
CRAN release: 2026-07-22
Cost & cleanup fixes (important)
-
The
max_hourly_costguard now works on the EC2 backend (the default). Previouslyestimate_cost()returnedper_hourfor Fargate buttotal_per_hourfor EC2, and the guard readper_hour— which isNULLon EC2 — so the cost ceiling was silently never enforced on the default backend.estimate_cost()now returns a normalizedhourly_ratefor every backend, and the guard, cost display, andstarburst_map()/starburst_cluster()all use it. -
cost_alert_thresholdis now enforced — it warns when a plan’s estimated hourly rate exceeds it (previously it was stored but never read). -
starburst_config(auto_cleanup_s3 = …)now actually controls S3 cleanup. The runtime read a different key (getOption("starburst.cleanup_s3")) and ignored the stored setting; cleanup now resolves option →auto_cleanup_s3config → default TRUE. -
starburst_map()/starburst_cluster()cost estimates match the backend used — they forwardlaunch_type/instance_type/use_spot, so an EC2 job no longer reports a Fargate price. - Cost estimates now use live AWS pricing (Pricing API for On-Demand, EC2 spot-price history for Spot), cached per session with a built-in static-rate fallback when offline. Reported costs are estimates (measured runtime × current rate), not AWS billing figures; docs reworded accordingly.
New features
-
starburst_setup()now provisions the default EC2 capacity provider (forc7g.xlarge) so the default EC2 backend works out of the box — previously the firststarburst_map()/plan(starburst)run failed because no capacity provider existed. It is created atDesiredCapacity = 0(no billable instances launch during setup). Passsetup_ec2 = FALSEto skip (Fargate-only users). (#37) -
Custom EC2 instance types are now provisioned automatically on first use. Selecting a non-default
instance_type(e.g.c8a.xlarge) previously failed with an opaque “AutoScalingGroup not found” because only the default was provisioned. Now the capacity provider/ASG is created on demand at first launch (a one-time ~1–2 min step; no instances launched by provisioning), or on failure you get the exactstarburst_setup_ec2(instance_types = "…")command to run.
Behavior changes
-
Detached
session$collect()now returns an entry for every terminal task, including failures. A failed task comes back as a structured failure (list(error = TRUE, message = …, task_id = …)) alongside successful results, instead of being silently omitted — matching the documented contract. - Clarified
session$cleanup(): by default it stops workers and marks the session terminated but preserves S3 objects; passforce = TRUEto also delete them. (Behavior unchanged; the docs were wrong and are now correct.)
Breaking changes
-
Removed the
platformargument fromstarburst_map()andstarburst_cluster(). It was ignored (architecture is inferred frominstance_type: Graviton*g.*→ ARM64, else x86_64), and its"X86_64"default even contradicted the ARM64c7g.xlargedefault. Drop it from calls; the backend picks the architecture frominstance_type. (platformremains onstarburst_estimate(), where it is functional.) -
Renamed
starburst_config(max_cost_per_job=)tomax_hourly_cost. The limit was always enforced as an hourly rate (USD/hour), not a total-job cap; the new name matches the behavior. Update anystarburst_config(max_cost_per_job = ...)calls tomax_hourly_cost = ....
Bug fixes
-
starburst_map()andstarburst_cluster()now acceptlaunch_type,instance_type, anduse_spotand forward them to the backend. Previously these functions had no backend arguments, so a call likestarburst_map(x, f, launch_type = "FARGATE")silently passedlaunch_typeto the mapped function.f(typically an “unused argument” error) instead of switching the backend — contradicting the 0.3.7 migration note. Backend selection now works uniformly acrossplan(starburst),starburst_map(),starburst_cluster(), andstarburst_session(). - Fixed broken/misleading examples: the README detached-session example used a nonexistent
detached = TRUEargument; S3-read examples used baseread.csv()/readRDS(url())which cannot reads3://; and the API rate-limit example aggregated to 10× its stated global limit across workers. -
Public base images are now built multi-arch (amd64 + arm64). They were published amd64-only, so
use_public_base = TRUEfailed the multi-arch environment build with “no match for platform in manifest” for arm64. Thebuild-base-imagesworkflow now builds both architectures (matching the env build), so the public base path works. (#39)
Documentation
- Consistency sweep addressing an external documentation review: EC2 is now consistently presented as the default/recommended backend with Fargate as the optional alternative; the README and example console output match the current engine (ASCII status markers, one task per input element — no chunking step); the Getting Started tutorial leads with
starburst_map(); a grouped reference index and an architecture diagram were added; andstarburst_config()keys are now catalogued. - Trimmed the Getting Started tutorial: the inline Monte Carlo / bootstrap / genomics snippets (which showed unbatched
future_map(1:10000, …)and hand-written speedup claims) now link to the canonical, measured example articles and the Workload Shapes / Performance guides. The doc-consistency guard (tools/check-docs.R) now also flags naivefuture_map()/future_lapply()big-count calls, not juststarburst_map(). - Removed the historical
ROADMAP.md(a pre-1.0, Fargate-first implementation plan that also carried a stale “MIT” license note); the README Roadmap section is the single source of truth.
starburst 0.3.8 (2026-03-06)
CRAN release: 2026-03-19
Reliability & CRAN readiness
Bug fixes
-
Worker script: Removed an invalid
timeoutparameter from the paws client configuration that could cause workers to fail on startup. -
Environment sync:
ensure_environment()now walks up the directory tree to find the package-rootrenv.lockwhen invoked from a subdirectory (e.g. during tests), and the environment image hash is computed consistently between build and lookup, so cached worker images are reused correctly. - Hardened
safe_system()usage and resolvedqs2serialization edge cases surfaced by integration tests.
Documentation & packaging
- All
\donttest{}examples are guarded withstarburst_is_configured()so they are safe to run without AWS credentials. - Pre-built vignettes shipped in
inst/doc/and assorted R CMD check / CRAN incoming-feasibility fixes. Package accepted on CRAN.
starburst 0.3.7 (2026-02-17)
Default backend is now EC2
-
BREAKING CHANGE: the default
launch_typechanged fromFARGATEtoEC2, with spot instances enabled by default (use_spot = TRUE,instance_type = "c7g.xlarge"). EC2 avoids Fargate cold starts, is 50–90% cheaper with spot, and supports warm pools and a wider range of instance types. Fargate remains fully supported — passlaunch_type = "FARGATE"toplan(starburst, ...),starburst_map(),starburst_cluster(), orstarburst_session()to keep the previous behavior. - Completed the EC2 backend implementation with working end-to-end execution (warm pools, capacity providers, spot support).
starburst 0.3.6 (2026-02-16)
AWS Integration Testing & Documentation
Major milestone: Complete AWS integration testing infrastructure and documentation site launch.
New Features
-
Comprehensive AWS Integration Testing (#4b36310)
- GitHub Actions workflow for automated AWS testing
- Local test runner script (
run-aws-tests.sh) - Multiple test suites: quick, detached-sessions, integration-examples, ec2, cleanup
- OIDC authentication for secure CI/CD
- Comprehensive TESTING.md documentation
- Weekly scheduled testing runs
-
Documentation Site (https://starburst.ing)
- Custom domain with HTTPS enabled
- Full pkgdown site with all 29+ exported functions
- 12 vignettes including security and troubleshooting guides
- Example scripts and runnable code
Bug Fixes
-
Test Suite
- Fixed missing
readLines()stubs in environment tests (#6514229) - Fixed missing
get_starburst_config()stub in Docker tests (#dad7124) - Fixed environment variable handling in integration tests (#78dbc2c)
- Improved AWS credential handling in test script (#0e916f2)
- Fixed missing
- CI/CD
starburst 0.3.5 (2026-02-15)
Bug Fixes & Improvements
Changes
-
Docker Image Versioning (#707ee78)
- Include package version in Docker image hash
- Ensures environment rebuilds when package version changes
- Prevents stale Docker images with old code
-
Serialization Update (#cbfad21)
- Changed worker scripts from
qstoqs2package - Improved compatibility and performance
- Consistent with main package dependencies
- Changed worker scripts from
starburst 0.3.4 (2026-02-14)
Code Quality Fix
Changes
-
Fixed vapply calls (#b96ace1)
- Added missing
FUN.VALUEparameters to allvapply()calls - Ensures type safety in vectorized operations
- Follows R best practices for safe functional programming
- Added missing
starburst 0.3.3 (2026-02-13)
Zero Lints - Idiomatic R Code Quality
Goal: Achieve zero linting warnings while maintaining idiomatic R code style.
Changes
-
Fixed trivial lint issues (#11)
- Fixed infix spacing:
collapse=→collapse = - Split long lines in R/ec2-pool.R and R/plan-starburst.R
- 3 quick wins for cleaner code
- Fixed infix spacing:
-
Configured lintr for R best practices
- Explicit
return()statements (clarity over implicit) - Descriptive variable names (clarity over brevity)
- Suppressed false positives for internal functions
- Accepted minor indentation variations (cosmetic only)
- Explicit
Quality Metrics
Lint Progression: - v0.3.0: 325 total lints - v0.3.1: 198 lints (-39%) - v0.3.2: 113 lints in R/ code (-65% from v0.3.1) - v0.3.3: 0 lints in R/ code ✅ (-100%)
Philosophy: This release establishes lintr configuration that prioritizes: 1. Code clarity over terseness 2. Explicit over implicit 3. Meaningful names over short names 4. R idioms over arbitrary style rules
Assessment
The package now has zero linting warnings while maintaining: - Explicit return statements (R best practice) - Descriptive variable names (self-documenting code) - Standard R indentation patterns - Internal function patterns recognized by R
Result: Clean, idiomatic R code with zero false-positive lint warnings.
starburst 0.3.2 (2026-02-13)
Idiomatic R Code - Go-Level Quality
Goal: Achieve Go-level code quality standards for R - clean, consistent, idiomatic.
Changes
-
Removed unused variables (#10)
- Cleaned up 5 truly unused assignments
- Fixed
cat_warning→cat_warntypo - Simplified code by removing unnecessary intermediate variables
-
Code style improvements
- Additional trailing whitespace cleanup
- Improved code readability
- More idiomatic R patterns
Quality Metrics
Lint Reduction Progress: - v0.3.0: 325 lints - v0.3.1: 198 lints (-39%) - v0.3.2: 195 lints (-40% total, -2% this release)
R/ Package Code Only (excluding examples/vignettes): - 113 lints (down from ~200+) - Breakdown: - 46 indentation (cosmetic, consistent style) - 34 object_usage (mostly false positives - internal functions) - 27 return (style preference - explicit vs implicit returns) - 3 object_length (descriptive variable names) - 2 line_length (complex expressions) - 1 infix_spaces (formatting)
Assessment
The remaining lints are: 1. Style preferences (indentation, returns) - subjective, not bugs 2. False positives (object_usage) - lintr doesn’t recognize internal functions 3. Descriptive names (object_length) - clarity over brevity
Code quality achieved: The package now meets high standards for production R code. Remaining lints are acceptable trade-offs for code clarity and maintainability.
starburst 0.3.1 (2026-02-12)
Code Quality Improvements
Complete: All 3 issues from v0.3.1 milestone (#18, #19, #20)
Changes
-
Replaced all emojis with ASCII equivalents (#19)
- ✓ → [OK] (success messages)
- ⚠ → [WARNING] (warning messages)
- 💡 → [TIP] (recommendations)
- 📖 → [INFO] (documentation links)
- 🚀 → [Starting] (initialization messages)
- 🧹 → [Cleaning] (cleanup messages)
- ✗ → [ERROR] (error messages)
- 14 files updated, better compatibility with older systems
- Applied goodpractice suggestions (#20)
-
Fixed lintr warnings (#18)
- Removed 127 trailing whitespace instances
- Down from 325 to 198 remaining lints (39% improvement)
- Remaining lints are cosmetic (indentation, style preferences)
starburst 0.3.0 (2026-02-12)
🎉 Production-Ready Release
staRburst is now enterprise-grade and ready for production deployment! This release focuses on security hardening, operational excellence, and comprehensive documentation.
Major Features
-
Complete resource cleanup -
session$cleanup()now fully implemented- Stops all running ECS tasks when session ends
- Deletes S3 session files with
force = TRUEoption - Tracks ECS task ARNs in session manifest for reliable cleanup
- Verification step ensures all resources are properly released
- Prevents orphaned workers and runaway costs
-
Detached session mode - Long-running jobs that persist after R session ends
- Create sessions with
starburst_session() - Submit tasks and disconnect:
session$submit(expr) - Reattach later with
starburst_session_attach(session_id) - Check progress anytime:
session$status() - Workers stay running until absolute timeout (default 24h)
- Create sessions with
-
Comprehensive troubleshooting guide - 15+ common issues documented
- Accessing CloudWatch Logs (console and CLI)
- Tasks stuck in pending (quota, IAM, network)
- Permission errors (ECS, S3, ECR)
- High costs and runaway workers
- Package installation failures
- Each issue includes symptoms, diagnosis, solutions, and prevention
-
Security best practices guide - Enterprise security documentation
- Credential management (IAM roles, profiles, STS)
- S3 bucket security (encryption, versioning, policies)
- Network isolation (VPCs, security groups, endpoints)
- Cost controls and budget alerts
- Audit logging (CloudTrail, CloudWatch)
- Compliance considerations (HIPAA, GDPR)
Security Improvements
-
Command injection prevention - Replaced unsafe
system()calls- New
safe_system()wrapper usingprocessx::run() - Command whitelist validation
- Automatic argument escaping (no shell expansion)
- Prevents code execution via Docker/AWS CLI parameters
- 25 new security regression tests
- New
-
Worker cost controls - Enforced maximum worker limits
- Hard limit of 500 workers per cluster (prevents accidental runaway costs)
- Validation at
plan()time with helpful error messages - Clear guidance on requesting quota increases if needed
- Estimated cost validation before worker launch
-
Secure ECR authentication - Fixed credential exposure vulnerability
- ECR password no longer exposed in process listings
- Uses stdin for Docker login (not command line arguments)
- Credentials never visible in
ps auxoutput - Temporary files cleaned up immediately after use
Reliability Improvements
-
Atomic S3 manifest updates - Prevents race conditions
- ETag-based optimistic locking for concurrent updates
- Automatic retry with exponential backoff on conflicts
- Ensures no manifest updates are lost when multiple workers update simultaneously
- Critical for detached sessions with many workers
-
Comprehensive retry logic - Handles transient AWS failures gracefully
- Exponential backoff with jitter for all AWS operations
- Retries throttling, timeouts, 5xx errors automatically
- Configurable retry limits (default 3 attempts)
- Specialized retry wrappers:
with_s3_retry(),with_ecs_retry(),with_ecr_retry() - Reduces job failures from temporary AWS service issues
-
Improved error messages - Context, solutions, and documentation links
- New
starburst_error()helper for rich error messages - Every error includes relevant context (quota limits, resources, regions)
- Actionable solutions provided (not just “something failed”)
- Links to troubleshooting guide for detailed help
- Specialized errors:
quota_error(),permission_error(),task_failure_error()
- New
New Functions & API
-
starburst_session()- Create detached session for long-running jobs -
starburst_session_attach()- Reattach to existing session -
starburst_session_list()- List all active sessions -
session$submit()- Submit tasks to detached session -
session$status()- Check session progress and task states -
session$collect()- Retrieve completed results -
session$cleanup()- Stop workers and clean up resources
Infrastructure
-
New R modules:
-
R/aws-retry.R- Centralized retry logic (167 lines) -
R/errors.R- Rich error message helpers (286 lines) -
R/session-api.R- Detached session API (600+ lines) -
R/session-backend.R- Session backend initialization (332 lines) -
R/session-state.R- S3 state management with atomic updates (487 lines)
-
-
New vignettes:
-
vignettes/troubleshooting.Rmd- 15+ common issues (~15KB) -
vignettes/security.Rmd- 10+ security topics (~17KB)
-
-
Development infrastructure:
-
CLAUDE.md- Comprehensive AI assistant development guide - GitHub issues/milestones for project tracking
- 30 standardized labels for issue classification
-
Testing
-
39 new tests - Comprehensive test coverage for production features
- 25 security tests (command injection prevention, validation)
- 14 cleanup tests (ECS task stopping, S3 deletion)
- All tests passing (179 total tests now)
- AWS integration tested against real infrastructure
-
Package quality improvements
- Documentation regenerated with no warnings
-
.Rbuildignoreupdated to exclude development files - Internal
.Rdfiles properly namespaced - Top-level directory cleaned up (internal docs moved to
docs/)
Bug Fixes
- Fixed: Worker error handling now catches and reports task failures (#2)
- Fixed: Manifest race condition causing concurrent update conflicts
- Fixed: S3 timeout errors now retried automatically
- Fixed: ECR password exposure in Docker login command
- Fixed: Missing cleanup implementation (was just printing message)
- Fixed: Documentation warnings for internal modules
Breaking Changes
-
session$cleanup()signature changed: now acceptsstop_workersandforceparameters - Default behavior: cleanup stops workers but preserves S3 files (use
force=TRUEto delete)
Performance
- No performance regressions
- Retry logic adds minimal overhead (only on failures)
- Atomic updates have negligible latency impact (<50ms)
Documentation
- 2 new comprehensive vignettes (~32KB of documentation)
- All errors now link to troubleshooting guide
- Security guide covers 10+ enterprise security topics
- Examples added for all new API functions
Production Readiness
✅ Command injection prevention ✅ Worker cost controls (max 500) ✅ Complete resource cleanup ✅ Race condition prevention ✅ Transient failure handling ✅ Comprehensive documentation ✅ Professional error messages ✅ 179 passing tests
This release makes staRburst suitable for enterprise production deployments.
Known Issues (to be addressed in 0.3.1)
-
Code style: 325 lintr warnings (mostly indentation, trailing whitespace)
- Does not affect functionality
- Will be cleaned up in 0.3.1
-
Non-ASCII characters: Emojis in user-facing messages (✓, ⚠, 💡, etc.)
- Modern R handles UTF-8 correctly
- May cause warnings on older systems
- Can be replaced with ASCII equivalents if needed
- Best practices: goodpractice suggests improvements
Static Analysis & Security
- Security scanning: Snyk enabled for dependency vulnerabilities
- Static analysis: lintr and goodpractice configured
- .lintr configuration: Ignores examples/, focuses on package code
- All critical security issues from audit resolved (command injection, credential exposure, etc.)
starburst 0.2.0 (2026-02-04)
Major Features
-
Multi-stage base image system for dramatically faster builds
- Base images contain system dependencies + core R packages
- Project images only install project-specific packages
- Reduces typical build times from 20 min to 3-5 min
- One-time base build per R version, reused across all projects
-
Complete Docker dependency support
- Added 15 system packages for comprehensive R package compilation
- Supports graphics packages (ragg, systemfonts, textshaping)
- Supports data packages (httpuv, readr, haven)
- All common CRAN packages now compile successfully
-
Fixed globals serialization (#1)
- Proper function closure capture for remote execution
- Converts plain lists to
globals::Globalsobjects - Ensures variables are correctly serialized to workers
Performance Improvements
-
ECR image caching validated with 40x speedup
- First run: ~42 min (one-time Docker build)
- Subsequent runs: ~1 min (cached image from ECR)
- No rebuild needed when renv.lock unchanged
-
Build time optimizations
- Dev environment (112 packages): 20 min → 6-8 min
- Production (30 packages): 8-10 min → 3-5 min
- Minimal projects: 3-5 min → 1-2 min
New Functions
-
build_base_image()- Build base Docker image with common dependencies -
ensure_base_image()- Check for/create base image as needed -
get_base_image_uri()- Get ECR URI for base image
Bug Fixes
- Fixed globals serialization causing empty results from workers
- Added missing system dependencies for package compilation
- Resolved Docker build failures for graphics packages
