April 1, 2026
2 pull requests merged across 1 repo
bahdotsh/wrkflw
Comprehensive bug fix pass addressing correctness, security, and parsing issues discovered during full codebase verification.
Key fixes:
- Security (critical): Fix AES-GCM nonce reuse in
EncryptedSecretStore— each secret now gets a unique random nonce prepended to its ciphertext - Executor: Implement
continue-on-errorand step-levelifcondition support, fix hardcodedshow_action_messagesflag, replace inline regex hacks with propersubstitution::process_step_run, skip symlinks during directory copy, validate volume host paths for traversal - Parser: Add
Strategywrapper to correctly model GitHub Actionsstrategy.matrixstructure, add newStepfields (if,id,working-directory,shell,timeout-minutes,continue-on-error) - Models: Handle GitLab
script/before_script/after_scriptas string-or-vec, coerce variable values to strings, addCacheKeyenum, fixRule.ifserde rename, addneeds/interruptible/reports/defaultfields - Validators: Fix reusable workflow reference validation logic (
||→&&), add proper cron syntax validation, add cyclicneedsdetection via DFS, fix GitLab artifact validation for reports-only artifacts - GitHub/GitLab: Fix default branch detection to use remote HEAD, replace
curlshell-out withreqwest - UI: Fix
Box::leakmemory leak in status bar, fix unsafe string slicing in workflow path display, wireshow_action_messagesthrough TUI - CLI: Remove dead
if trueblock, fixvalidate_github_workflowto call evaluator directly, handleread_direrrors gracefully
Breaking change: EncryptedSecretStore serialization format changed (nonce field removed). See BREAKING_CHANGES.md.
Test plan
-
cargo checkpasses -
cargo clippypasses with no warnings -
cargo fmtproduces no changes - All 159 tests pass, including 19 new tests:
- Matrix include/exclude merge semantics (5 tests)
- Step condition evaluation for unsupported expressions (6 tests)
- Volume path traversal edge cases (2 tests)
- Continue-on-error and step-level
ifparsing (1 test) - Per-secret unique nonce verification (1 test)
- Cyclic
needsdetection (1 test) - Cron syntax validation (7 tests)
- Strategy/matrix parsing (1 test)
- Step field parsing (1 test)
- Docker
build_image_innermtime bug: Used.elapsed()instead of.duration_since(UNIX_EPOCH)— tar timestamps were "seconds since modification" instead of actual Unix timestamps - Docker
logs()missing options: Was passingNonefor log options, not explicitly requesting stdout/stderr streams - Emulation runtime exit code inconsistency: Returned
Erron non-zero exit codes (swallowing stdout/stderr), while Docker/Podman returnOkwith the exit code — engine already handles non-zero in theOkpath - UI
previous_job()missing bounds check:next_job()had a.filter()guard against stale indices,previous_job()did not — potential panic - Log processor UTF-8 safety: String slicing without
is_char_boundary()checks could panic on multi-byte characters - Step validation logic error: Steps with only
name(nousesorrun) incorrectly passed validation main.rspanic on directory read:.expect()calls replaced with proper error handling
Test plan
- All 134 existing tests pass
- Clippy clean (no new warnings)
- Full workspace build succeeds
- Manual: run
wrkflw validateon a directory with restricted permissions - Manual: run a workflow in emulation mode with a failing step — verify stdout/stderr preserved
- Manual: navigate job list in TUI with stale workflow state