diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..5d33735 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,19 @@ +## Linked issue + +Closes # + +## Summary + + + +## Test plan + +- [ ] `cargo test` passes +- [ ] `bash bench/run.sh` — all fixtures ≥30% reduction, ≤100ms latency +- [ ] `bash bench/run_context.sh` — all context scenarios pass (if touching context engine) + +## Checklist + +- [ ] Issue is linked above +- [ ] CI is green +- [ ] No `Co-Authored-By:` trailers in commit messages diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f37e226..7e3a425 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,3 +15,5 @@ jobs: cp target/release/squeez "$HOME/.claude/squeez/bin/squeez" - name: Run benchmarks run: bash bench/run.sh + - name: Run context-engine benchmarks + run: bash bench/run_context.sh diff --git a/.github/workflows/cleanup-branches.yml b/.github/workflows/cleanup-branches.yml new file mode 100644 index 0000000..f3a6b37 --- /dev/null +++ b/.github/workflows/cleanup-branches.yml @@ -0,0 +1,33 @@ +name: Delete branch after merge + +on: + pull_request: + types: [closed] + +jobs: + delete-branch: + if: github.event.pull_request.merged == true && github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Delete merged branch + uses: actions/github-script@v7 + with: + script: | + const branch = context.payload.pull_request.head.ref; + const protected = ['main', 'develop']; + if (protected.includes(branch)) { + console.log(`Skipping protected branch: ${branch}`); + return; + } + try { + await github.rest.git.deleteRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: `heads/${branch}`, + }); + console.log(`Deleted branch: ${branch}`); + } catch (e) { + console.log(`Branch already deleted or not found: ${branch}`); + } diff --git a/.github/workflows/no-claude-trailer.yml b/.github/workflows/no-claude-trailer.yml new file mode 100644 index 0000000..1147e79 --- /dev/null +++ b/.github/workflows/no-claude-trailer.yml @@ -0,0 +1,24 @@ +name: No Claude trailer + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + check-commits: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Fail if any commit has Claude Co-Authored-By trailer + run: | + base="${{ github.event.pull_request.base.sha }}" + head="${{ github.event.pull_request.head.sha }}" + bad=$(git log "$base".."$head" --format="%B" | grep -iE "^Co-Authored-By:.*noreply@anthropic\.com" || true) + if [ -n "$bad" ]; then + echo "ERROR: commit messages contain Claude Co-Authored-By trailers." + echo "Remove them with: git rebase -i and edit the commit messages." + exit 1 + fi + echo "No Claude trailers found — OK" diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 0000000..0a1bca6 --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,26 @@ +name: PR Checks + +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +jobs: + require-linked-issue: + if: github.base_ref == 'develop' || github.base_ref == 'main' + runs-on: ubuntu-latest + steps: + - name: Check for linked issue + uses: actions/github-script@v7 + with: + script: | + const body = context.payload.pull_request.body || ''; + // Accept "Closes #N", "Fixes #N", "Resolves #N" (case-insensitive) + const linked = /(?:closes|fixes|resolves)\s+#\d+/i.test(body); + if (!linked) { + core.setFailed( + 'This PR has no linked issue.\n' + + 'Add "Closes #" to the PR description before merging.' + ); + } else { + console.log('Linked issue found — OK'); + } diff --git a/.github/workflows/promote-develop.yml b/.github/workflows/promote-develop.yml new file mode 100644 index 0000000..345e56f --- /dev/null +++ b/.github/workflows/promote-develop.yml @@ -0,0 +1,54 @@ +name: Promote develop to main +on: + push: + branches: [develop] +permissions: + contents: write + pull-requests: write +jobs: + create_pr: + runs-on: ubuntu-latest + steps: + - name: Create or update PR to main (using PAT) + if: ${{ secrets.PR_CREATION_TOKEN != '' }} + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.PR_CREATION_TOKEN }} + script: | + const prTitle = 'Promote develop to main'; + const prBody = 'Automated PR to propose changes from develop to main. Review and merge according to repo policy.'; + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + head: `${context.repo.owner}:develop`, + base: 'main', + }); + if (prs.length === 0) { + await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: prTitle, + head: 'develop', + base: 'main', + body: prBody, + }); + } else { + const pr = prs[0]; + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + title: prTitle, + body: prBody, + }); + } + + - name: Skip automatic promotion (no token) + if: ${{ secrets.PR_CREATION_TOKEN == '' }} + run: | + echo "Automatic promotion to main skipped: PR_CREATION_TOKEN secret not set." + echo "To enable automatic promotion, either:" + echo " 1) Enable 'Allow GitHub Actions to create and approve pull requests' in the repository Settings → Actions → General (recommended), or" + echo " 2) Create a Personal Access Token (PAT) with 'repo' scope and add it as a repository secret named 'PR_CREATION_TOKEN'." + echo "Create secret via GH CLI: gh secret set PR_CREATION_TOKEN --body ''" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2d22708..2ae63e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,8 +62,23 @@ jobs: name: squeez-linux-aarch64 path: squeez-linux-aarch64 + build-windows-x86_64: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - name: Build + run: cargo build --release --target x86_64-pc-windows-msvc + - name: Rename binary + run: mv target/x86_64-pc-windows-msvc/release/squeez.exe squeez-windows-x86_64.exe + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: squeez-windows-x86_64 + path: squeez-windows-x86_64.exe + release: - needs: [build-macos, build-linux-x86_64, build-linux-aarch64] + needs: [build-macos, build-linux-x86_64, build-linux-aarch64, build-windows-x86_64] runs-on: ubuntu-latest permissions: contents: write @@ -75,6 +90,7 @@ jobs: cd squeez-macos-universal && sha256sum squeez-macos-universal > ../checksums.sha256 && cd .. cd squeez-linux-x86_64 && sha256sum squeez-linux-x86_64 >> ../checksums.sha256 && cd .. cd squeez-linux-aarch64 && sha256sum squeez-linux-aarch64 >> ../checksums.sha256 && cd .. + cd squeez-windows-x86_64 && sha256sum squeez-windows-x86_64.exe >> ../checksums.sha256 && cd .. - name: Upload to release uses: softprops/action-gh-release@v1 with: @@ -82,4 +98,5 @@ jobs: squeez-macos-universal/squeez-macos-universal squeez-linux-x86_64/squeez-linux-x86_64 squeez-linux-aarch64/squeez-linux-aarch64 + squeez-windows-x86_64/squeez-windows-x86_64.exe checksums.sha256 diff --git a/.gitignore b/.gitignore index 72afbca..2dfc4d4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,10 @@ /bin/ *.DS_Store .omc/ +docs/ +.worktrees/ + +# Bench reports (regenerated on every run) +bench/report.md +bench/report_context.md + diff --git a/Cargo.toml b/Cargo.toml index 4bb7243..be32eee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,8 @@ name = "squeez" path = "src/lib.rs" [dependencies] + +[target.'cfg(unix)'.dependencies] libc = "0.2" [profile.release] diff --git a/README.md b/README.md index f68177d..dd1b8cf 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,22 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Rust](https://img.shields.io/badge/rust-stable-orange.svg)](https://www.rust-lang.org) -Token compression + context optimization for Claude Code, OpenCode, and GitHub Copilot CLI. Runs automatically in Claude Code and Copilot CLI. Manual usage in OpenCode. +End-to-end token optimizer for Claude Code, OpenCode, and GitHub Copilot CLI. Attacks tokens on three axes: **bash output** (compression), **context** (cross-call engine), and **output** (prompt persona). Runs automatically; zero new runtime dependencies. ## What it does -- **Bash compression** — intercepts every command, removes noise, up to 95% token reduction -- **Session memory** — injects a summary of prior sessions at session start -- **Token tracking** — tracks context usage across all tool calls -- **Compact warning** — alerts when session approaches context limit (80% of budget) +- **Bash compression** — intercepts every command, removes noise, up to 95% token reduction. Always-Ultra mode (×0.3 limits by default). +- **Context engine** — cross-call redundancy cache collapses identical outputs; summarize fallback converts >500-line dumps to ≤40-line dense reports. +- **Caveman persona** — injects an ultra-terse prompt at session start so the model responds with fewer tokens. Default: Ultra. +- **Memory-file compression** — `squeez compress-md` compresses CLAUDE.md / AGENTS.md / copilot-instructions.md in-place; pure Rust, zero-LLM. +- **Session memory** — injects a summary of prior sessions at session start. +- **Token tracking** — every PostToolUse result (Bash, Read, Grep, Glob) feeds a SessionContext so squeez knows what the agent has already seen. +- **Self-update** — `squeez update` downloads and atomically installs the latest binary. ## Install +> **Windows users:** squeez requires **Git Bash** to run. PowerShell and CMD are not supported — the hooks and binary rely on a POSIX shell environment. Open Git Bash and run: + ```bash curl -fsSL https://raw.githubusercontent.com/claudioemmanuel/squeez/main/install.sh | sh ``` @@ -30,17 +35,20 @@ Measured on macOS (Apple Silicon), token estimate = chars/4. Run with `bash benc | Fixture | Before | After | Reduction | Latency | |---------|--------|-------|-----------|---------| | `ps aux` | 40,373 tk | 2,352 tk | **-95%** | 6ms | -| `git log` (200 commits) | 2,667 tk | 819 tk | **-70%** | 4ms | -| `docker logs` | 665 tk | 186 tk | **-73%** | 5ms | +| 5,000-line log (summarize) | 82,257 tk | 47 tk | **-100%** | 12ms | +| `git log` (200 commits) | 2,667 tk | 819 tk | **-70%** | 3ms | +| `docker logs` | 665 tk | 186 tk | **-73%** | 4ms | | `find` (deep tree) | 424 tk | 134 tk | **-69%** | 3ms | | `git status` | 50 tk | 16 tk | **-68%** | 3ms | -| `ls -la` | 1,782 tk | 886 tk | **-51%** | 4ms | +| `ls -la` | 1,782 tk | 886 tk | **-51%** | 3ms | | `npm install` | 524 tk | 231 tk | **-56%** | 3ms | | `git diff` | 502 tk | 317 tk | **-37%** | 4ms | -| `env` dump | 441 tk | 287 tk | **-35%** | 3ms | -| Copilot CLI session | 639 tk | 421 tk | **-35%** | 3ms | +| `env` dump | 441 tk | 287 tk | **-35%** | 4ms | +| Copilot CLI session | 639 tk | 421 tk | **-35%** | 4ms | +| `cargo build` (Ultra intensity) | 4,418 tk | 52 tk | **-99%** | 4ms | +| CLAUDE.md prose (compress-md) | 316 tk | 246 tk | **-23%** | 3ms | -10/10 fixtures pass. Latency under 10ms on every fixture. +14/14 fixtures pass. Latency under 15ms on every fixture. ## Escape hatch @@ -62,10 +70,108 @@ docker_logs_max_lines = 100 bypass = docker exec, psql, ssh # Session memory -compact_threshold_tokens = 160000 # warn at 80% of context budget +compact_threshold_tokens = 120000 # warn when approaching context limit (120K default) memory_retention_days = 30 # how long to keep session summaries + +# Context engine (PR1) +adaptive_intensity = true # auto-tighten compression as budget fills +context_cache_enabled = true # persist cross-call state in sessions/context.json +redundancy_cache_enabled = true # collapse identical recent outputs to a reference line +summarize_threshold_lines = 500 # raw lines above this trigger summary fallback + +# Output / memory-file (PR2) +persona = ultra # off|lite|full|ultra — caveman prompt injected at session start +auto_compress_md = true # compress CLAUDE.md / copilot-instructions.md on every session start +``` + +### Output compression — caveman persona + +squeez cannot intercept the model's response stream from the hook layer. +Instead it ships a short caveman-style prompt text and injects it into: + +- The Claude Code session banner (printed by `squeez init` at session start) +- The ` ... ` block in `~/.copilot/copilot-instructions.md` + +Three intensity levels (`lite`, `full`, `ultra`) plus `off`. Default is `ultra`. + +### Memory-file compression — `squeez compress-md` + +Pure-Rust, zero-LLM caveman compressor for `CLAUDE.md`, `AGENTS.md`, +`copilot-instructions.md`, and any other markdown file. Preserves code +blocks, inline code, URLs, headings, file paths, tables, and list markers. +Compresses prose only. Backups always written to `.original.md`. + +```bash +squeez compress-md path/to/file.md # Full mode +squeez compress-md --ultra path/to/file.md # + abbreviations (with→w/, fn, etc.) +squeez compress-md --dry-run path/to/file.md +squeez compress-md --all # Walk known locations ``` +When `auto_compress_md = true` (default), `squeez init` runs `--all` +silently on every session start. The integrity heuristic aborts the +write if any code block, URL, or heading was lost — your files are safe. + +### Self-update — `squeez update` + +```bash +squeez update # Download + verify SHA256 + atomic install +squeez update --check # Report only, do not install +squeez update --insecure # Skip checksum (NOT recommended) +``` + +Uses `curl` and `sha256sum`/`shasum -a 256` (both already required by +`install.sh`). Atomic on Unix; on Windows the running .exe is replaced +via a `.new` + manual `move` shim. + +### Context engine + +When `adaptive_intensity = true` (default), squeez compresses every bash call +at maximum aggression — limits ×0.3 across the board (Ultra mode): + +- `max_lines` × 0.3 (floor 20) +- `dedup_min` × 0.5 (floor 2) +- `git_diff_max_lines`, `docker_logs_max_lines`, `find_max_results` × 0.3 +- `summarize_threshold_lines` × 0.3 (floor 50) + +Set `adaptive_intensity = false` to fall back to **Lite** (no scaling, raw +defaults). The active level is shown in the bash header: +`# squeez [git] 841→323 tokens (-62%) 55ms [adaptive: Ultra]`. + +The `Lite` and `Full` enum variants remain for forward compatibility but are +not selected automatically — they exist so future versions can introduce +softer modes without breaking the public API. + +When the same compressed output appears within the last **16 calls** (length-equality +guarded, min 2 lines), squeez replaces it with a single reference line: +`[squeez: identical to at bash# — re-run with --no-squeez]`. + +When raw output exceeds `summarize_threshold_lines`, squeez emits a dense +≤40-line summary (top errors, top files, test summary, last 20 lines verbatim) +instead of running the per-handler truncation pipeline. + +When the session token count crosses `compact_threshold_tokens` (default 120K), the +compact warning now shows a per-tool breakdown: +`⚠️ squeez: session ~85K tokens (70% of budget). Token breakdown: Bash 60K | Read 20K | Other 5K` + +**Supported command handlers:** + +| Category | Commands | +|---|---| +| Git | `git` | +| Docker/Containers | `docker`, `docker-compose`, `podman` | +| Package managers | `npm`, `pnpm`, `bun`, `yarn` | +| Build systems | `make`, `cmake`, `gradle`, `mvn`, `cargo` (non-test) | +| Test runners | `cargo test`, `jest`, `vitest`, `pytest`, `nextest` | +| TypeScript | `tsc`, `eslint`, `biome` | +| Cloud CLIs | `kubectl`, `gh`, `aws`, `gcloud`, `az` | +| Databases | `psql`, `prisma`, `mysql` | +| Filesystem | `find`, `ls`, `du`, `ps`, `env` | +| JSON/YAML/IaC | `jq`, `yq`, `terraform`, `tofu`, `helm`, `pulumi` | +| Text processing | `grep`, `rg`, `awk`, `sed` | +| Network | `curl`, `wget` | +| Runtimes | `node`, `python`, `ruby` | + ## How it works ### Claude Code & Copilot CLI @@ -76,7 +182,7 @@ Three hooks work together: **Session memory** (`SessionStart`): On each new session, `squeez init` finalizes the previous session into a summary (files touched, errors resolved, test results, git events) and prints a memory banner so the agent has prior-session context from the start. For Copilot CLI, this banner is also written to `~/.copilot/copilot-instructions.md` which is loaded automatically at every session. -**Token tracking** (`PostToolUse`): Every tool call's output size is tracked. When cumulative session tokens cross 80% of the context budget, a compact warning is emitted in the next bash output header. +**Token tracking** (`PostToolUse`): Every tool call's result (Bash, Read, Grep, Glob) is scanned for file paths and errors. These feed a persistent `SessionContext` so squeez knows what the agent has already seen. When cumulative session tokens cross 80% of the context budget, a compact warning is emitted in the next bash output header. ## OpenCode @@ -130,7 +236,18 @@ SQUEEZ_DIR=~/.copilot/squeez ~/.claude/squeez/bin/squeez init --copilot ## Local development -**Prerequisites:** Rust stable (`rustup update stable`), `bash`, macOS or Linux. +**Prerequisites:** Rust stable, `bash` (Git Bash on Windows — PowerShell is not supported). Works on Windows (Git Bash), macOS, and Linux. + +Install Rust via [rustup](https://rust-lang.org/tools/install/): +```bash +# macOS / Linux +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# Windows: download and run rustup-init.exe from https://rust-lang.org/tools/install/ +# Then restart your terminal so cargo is in PATH. +# Windows users also need MSVC C++ Build Tools: +# https://visualstudio.microsoft.com/visual-cpp-build-tools/ +``` ```bash # 1. Clone @@ -154,4 +271,74 @@ To uninstall: `bash uninstall.sh` ## Contributing -See [CONTRIBUTING.md](CONTRIBUTING.md). +Please follow the repository branching and pull-request workflow to ensure stable releases and predictable merges. + +Branching & PR rules + +- Always branch from an up-to-date `develop` branch: + - git fetch origin + - git checkout develop + - git pull +- Create a feature branch from `develop`: + - git checkout -b feature/your-feature develop +- Implement your changes and run tests locally: + - cargo test + - cargo build --release + - bash bench/run.sh # optional for performance-sensitive changes +- Push your branch and create a PR targeting `develop`: + - git push -u origin feature/your-feature + - gh pr create --base develop --head feature/your-feature -t "Short title" -b "Description of changes and tests" +- Request reviewers, ensure CI passes and address feedback. +- Merge into `develop` once approved (follow the repo's merge strategy). + +Promotion to main + +- On push to `develop`, a workflow will create or update a PR from `develop` → `main` for final review and merge. +- Maintainers should review the `develop`→`main` PR, ensure CI/status checks pass, then merge to `main`. + +Note about permissions + +If the promotion workflow fails with an error like "GitHub Actions is not permitted to create or approve pull requests", you can resolve it by doing one of the following: + +- Enable the repository setting: Settings → Actions → General → enable "Allow GitHub Actions to create and approve pull requests" (recommended). +- Or create a Personal Access Token (PAT) with `repo` scope and add it as a repository secret named `PR_CREATION_TOKEN`. The promotion workflow will use that secret to create/update the PR when present. + +Create the secret via the GH CLI: + +```bash +gh secret set PR_CREATION_TOKEN --body '' +``` + +Branch protection & admin notes + +- Protect `main` with branch protection rules: require PR reviews (1+), require passing status checks, disallow force pushes, and enable required linear history if desired. +- If history was rewritten (commit messages edited), collaborators must re-sync their local clones: + - git fetch origin + - git reset --hard origin/develop + - or re-clone the repository + +Changelog (recent) + +- 2026-04-07: **Gap fixes** — `jq`/`yq`/`terraform`/`helm`/`grep`/`rg`/`awk`/`sed` handlers; redundancy window 8→16, min-lines 5→2; `compact_threshold_tokens` default 160K→120K; per-tool token breakdown in compact warning. +- 2026-04-07: **Context engine** — adaptive Ultra intensity (×0.3 limits), cross-call redundancy cache (16-call window), summarize fallback for >500-line outputs, SessionContext persisted to `sessions/context.json`. +- 2026-04-07: **`squeez compress-md`** — pure-Rust markdown compressor; Ultra mode with abbreviations; damage heuristic; `auto_compress_md` runs on every session start. +- 2026-04-07: **Caveman persona** — Ultra prompt injected into session banner and `copilot-instructions.md` by default. +- 2026-04-07: **`squeez update`** — self-updater via `curl` + SHA-256 verification; atomic install. +- 2026-04-07: **PostToolUse extension** — Read/Grep/Glob results feed SessionContext via `track-result` hook. +- 2026-04-06: Added `--codex` and `--antigravity` init scaffolding. +- 2026-04-06: Created `develop` branch; added promotion workflow (`develop` → `main`). +- 2026-04-06: Fixed localization (Portuguese string removed from `install.sh`). + +Benchmarks & running them + +Benchmarks are in the `bench/` folder and can be run as follows: + +```bash +cargo build --release +bash bench/run.sh +``` + +Reported results (macOS Apple Silicon; token estimate = chars/4) are shown in the "Benchmarks" table above. Re-run on your platform to verify and submit improvements as PRs. + +See [CONTRIBUTING.md](CONTRIBUTING.md) for additional guidelines and coding standards. + diff --git a/assets/persona_full.md b/assets/persona_full.md new file mode 100644 index 0000000..5637131 --- /dev/null +++ b/assets/persona_full.md @@ -0,0 +1,11 @@ +## squeez persona: full (caveman) + +Talk like smart caveman. Drop articles (a, an, the). Drop filler. Drop +pleasantries. Fragments fine — no need full sentence. Pattern: +"[thing] [action] [reason]. [next step]." + +Technical terms stay exact. Code blocks unchanged. Error messages quoted +exact. Git commits and PR descriptions written normal. + +Goal: cut ~75% of output tokens, keep 100% technical accuracy. Same fix, +fewer words. Brain still big. diff --git a/assets/persona_lite.md b/assets/persona_lite.md new file mode 100644 index 0000000..5733b67 --- /dev/null +++ b/assets/persona_lite.md @@ -0,0 +1,5 @@ +## squeez persona: lite + +Be terse. Drop fillers ("just", "really", "basically"). Drop pleasantries +("happy to help", "of course"). Skip hedging ("might want to", "perhaps"). +Keep grammar correct. Code blocks unchanged. diff --git a/assets/persona_ultra.md b/assets/persona_ultra.md new file mode 100644 index 0000000..5a20d8e --- /dev/null +++ b/assets/persona_ultra.md @@ -0,0 +1,18 @@ +## squeez persona: ultra (max compression) + +Maximum compression. Telegraphic. Abbreviate everything outside code. +Drop articles, filler, pleasantries, hedging. Fragments OK. Pattern: +"[thing] → [action]. [next]." + +Substitutions: with→w/, without→w/o, because→b/c, function→fn, +parameter→param, configuration→config, documentation→docs, directory→dir, +repository→repo, between→btw, versus→vs, approximately→~. + +Rules that stay exact: +- Code blocks: unchanged +- Inline `code`: unchanged +- Error messages: quoted verbatim +- File paths, URLs, version numbers: unchanged +- Git commits, PR descriptions: written normal + +Goal: minimum tokens, full technical accuracy. Brain big. Mouth small. diff --git a/bench/fixtures/context_crosscall_1.txt b/bench/fixtures/context_crosscall_1.txt new file mode 100644 index 0000000..b0e1a03 --- /dev/null +++ b/bench/fixtures/context_crosscall_1.txt @@ -0,0 +1,18 @@ +On branch develop +Your branch is up to date with origin/develop. + +Changes not staged for commit: + (use git add to update what will be committed) + (use git restore to discard changes in working directory) + modified: src/main.rs + modified: src/lib.rs + modified: src/config.rs + modified: src/commands/wrap.rs + modified: tests/test_intensity.rs + modified: tests/test_redundancy.rs + modified: tests/test_summarize.rs + modified: tests/test_context_cache.rs + modified: bench/run.sh + modified: README.md + +no changes added to commit (use git add and/or git commit -a) diff --git a/bench/fixtures/context_crosscall_2.txt b/bench/fixtures/context_crosscall_2.txt new file mode 100644 index 0000000..b0e1a03 --- /dev/null +++ b/bench/fixtures/context_crosscall_2.txt @@ -0,0 +1,18 @@ +On branch develop +Your branch is up to date with origin/develop. + +Changes not staged for commit: + (use git add to update what will be committed) + (use git restore to discard changes in working directory) + modified: src/main.rs + modified: src/lib.rs + modified: src/config.rs + modified: src/commands/wrap.rs + modified: tests/test_intensity.rs + modified: tests/test_redundancy.rs + modified: tests/test_summarize.rs + modified: tests/test_context_cache.rs + modified: bench/run.sh + modified: README.md + +no changes added to commit (use git add and/or git commit -a) diff --git a/bench/fixtures/context_crosscall_3.txt b/bench/fixtures/context_crosscall_3.txt new file mode 100644 index 0000000..b0e1a03 --- /dev/null +++ b/bench/fixtures/context_crosscall_3.txt @@ -0,0 +1,18 @@ +On branch develop +Your branch is up to date with origin/develop. + +Changes not staged for commit: + (use git add to update what will be committed) + (use git restore to discard changes in working directory) + modified: src/main.rs + modified: src/lib.rs + modified: src/config.rs + modified: src/commands/wrap.rs + modified: tests/test_intensity.rs + modified: tests/test_redundancy.rs + modified: tests/test_summarize.rs + modified: tests/test_context_cache.rs + modified: bench/run.sh + modified: README.md + +no changes added to commit (use git add and/or git commit -a) diff --git a/bench/fixtures/intensity_budget80.txt b/bench/fixtures/intensity_budget80.txt new file mode 100644 index 0000000..5ee2069 --- /dev/null +++ b/bench/fixtures/intensity_budget80.txt @@ -0,0 +1,629 @@ + Compiling serde v0.1.0 + Compiling serde v0.2.0 + Compiling serde v1.0.0 + Compiling tokio v0.1.0 + Compiling tokio v0.2.0 + Compiling tokio v1.0.0 + Compiling hyper v0.1.0 + Compiling hyper v0.2.0 + Compiling hyper v1.0.0 + Compiling reqwest v0.1.0 + Compiling reqwest v0.2.0 + Compiling reqwest v1.0.0 + Compiling sqlx v0.1.0 + Compiling sqlx v0.2.0 + Compiling sqlx v1.0.0 + Compiling axum v0.1.0 + Compiling axum v0.2.0 + Compiling axum v1.0.0 + Compiling tower v0.1.0 + Compiling tower v0.2.0 + Compiling tower v1.0.0 + Compiling tracing v0.1.0 + Compiling tracing v0.2.0 + Compiling tracing v1.0.0 +warning: unused variable: var_0 + --> src/lib.rs:10:5 +warning: unused variable: var_1 + --> src/lib.rs:11:5 +warning: unused variable: var_2 + --> src/lib.rs:12:5 +warning: unused variable: var_3 + --> src/lib.rs:13:5 +warning: unused variable: var_4 + --> src/lib.rs:14:5 +warning: unused variable: var_5 + --> src/lib.rs:15:5 +warning: unused variable: var_6 + --> src/lib.rs:16:5 +warning: unused variable: var_7 + --> src/lib.rs:17:5 +warning: unused variable: var_8 + --> src/lib.rs:18:5 +warning: unused variable: var_9 + --> src/lib.rs:19:5 +warning: unused variable: var_10 + --> src/lib.rs:20:5 +warning: unused variable: var_11 + --> src/lib.rs:21:5 +warning: unused variable: var_12 + --> src/lib.rs:22:5 +warning: unused variable: var_13 + --> src/lib.rs:23:5 +warning: unused variable: var_14 + --> src/lib.rs:24:5 +warning: unused variable: var_15 + --> src/lib.rs:25:5 +warning: unused variable: var_16 + --> src/lib.rs:26:5 +warning: unused variable: var_17 + --> src/lib.rs:27:5 +warning: unused variable: var_18 + --> src/lib.rs:28:5 +warning: unused variable: var_19 + --> src/lib.rs:29:5 +warning: unused variable: var_20 + --> src/lib.rs:30:5 +warning: unused variable: var_21 + --> src/lib.rs:31:5 +warning: unused variable: var_22 + --> src/lib.rs:32:5 +warning: unused variable: var_23 + --> src/lib.rs:33:5 +warning: unused variable: var_24 + --> src/lib.rs:34:5 +warning: unused variable: var_25 + --> src/lib.rs:35:5 +warning: unused variable: var_26 + --> src/lib.rs:36:5 +warning: unused variable: var_27 + --> src/lib.rs:37:5 +warning: unused variable: var_28 + --> src/lib.rs:38:5 +warning: unused variable: var_29 + --> src/lib.rs:39:5 +warning: unused variable: var_30 + --> src/lib.rs:40:5 +warning: unused variable: var_31 + --> src/lib.rs:41:5 +warning: unused variable: var_32 + --> src/lib.rs:42:5 +warning: unused variable: var_33 + --> src/lib.rs:43:5 +warning: unused variable: var_34 + --> src/lib.rs:44:5 +warning: unused variable: var_35 + --> src/lib.rs:45:5 +warning: unused variable: var_36 + --> src/lib.rs:46:5 +warning: unused variable: var_37 + --> src/lib.rs:47:5 +warning: unused variable: var_38 + --> src/lib.rs:48:5 +warning: unused variable: var_39 + --> src/lib.rs:49:5 +warning: unused variable: var_40 + --> src/lib.rs:50:5 +warning: unused variable: var_41 + --> src/lib.rs:51:5 +warning: unused variable: var_42 + --> src/lib.rs:52:5 +warning: unused variable: var_43 + --> src/lib.rs:53:5 +warning: unused variable: var_44 + --> src/lib.rs:54:5 +warning: unused variable: var_45 + --> src/lib.rs:55:5 +warning: unused variable: var_46 + --> src/lib.rs:56:5 +warning: unused variable: var_47 + --> src/lib.rs:57:5 +warning: unused variable: var_48 + --> src/lib.rs:58:5 +warning: unused variable: var_49 + --> src/lib.rs:59:5 +warning: unused variable: var_50 + --> src/lib.rs:60:5 +warning: unused variable: var_51 + --> src/lib.rs:61:5 +warning: unused variable: var_52 + --> src/lib.rs:62:5 +warning: unused variable: var_53 + --> src/lib.rs:63:5 +warning: unused variable: var_54 + --> src/lib.rs:64:5 +warning: unused variable: var_55 + --> src/lib.rs:65:5 +warning: unused variable: var_56 + --> src/lib.rs:66:5 +warning: unused variable: var_57 + --> src/lib.rs:67:5 +warning: unused variable: var_58 + --> src/lib.rs:68:5 +warning: unused variable: var_59 + --> src/lib.rs:69:5 +warning: unused variable: var_60 + --> src/lib.rs:70:5 +warning: unused variable: var_61 + --> src/lib.rs:71:5 +warning: unused variable: var_62 + --> src/lib.rs:72:5 +warning: unused variable: var_63 + --> src/lib.rs:73:5 +warning: unused variable: var_64 + --> src/lib.rs:74:5 +warning: unused variable: var_65 + --> src/lib.rs:75:5 +warning: unused variable: var_66 + --> src/lib.rs:76:5 +warning: unused variable: var_67 + --> src/lib.rs:77:5 +warning: unused variable: var_68 + --> src/lib.rs:78:5 +warning: unused variable: var_69 + --> src/lib.rs:79:5 +warning: unused variable: var_70 + --> src/lib.rs:80:5 +warning: unused variable: var_71 + --> src/lib.rs:81:5 +warning: unused variable: var_72 + --> src/lib.rs:82:5 +warning: unused variable: var_73 + --> src/lib.rs:83:5 +warning: unused variable: var_74 + --> src/lib.rs:84:5 +warning: unused variable: var_75 + --> src/lib.rs:85:5 +warning: unused variable: var_76 + --> src/lib.rs:86:5 +warning: unused variable: var_77 + --> src/lib.rs:87:5 +warning: unused variable: var_78 + --> src/lib.rs:88:5 +warning: unused variable: var_79 + --> src/lib.rs:89:5 +warning: unused variable: var_80 + --> src/lib.rs:90:5 +warning: unused variable: var_81 + --> src/lib.rs:91:5 +warning: unused variable: var_82 + --> src/lib.rs:92:5 +warning: unused variable: var_83 + --> src/lib.rs:93:5 +warning: unused variable: var_84 + --> src/lib.rs:94:5 +warning: unused variable: var_85 + --> src/lib.rs:95:5 +warning: unused variable: var_86 + --> src/lib.rs:96:5 +warning: unused variable: var_87 + --> src/lib.rs:97:5 +warning: unused variable: var_88 + --> src/lib.rs:98:5 +warning: unused variable: var_89 + --> src/lib.rs:99:5 +warning: unused variable: var_90 + --> src/lib.rs:100:5 +warning: unused variable: var_91 + --> src/lib.rs:101:5 +warning: unused variable: var_92 + --> src/lib.rs:102:5 +warning: unused variable: var_93 + --> src/lib.rs:103:5 +warning: unused variable: var_94 + --> src/lib.rs:104:5 +warning: unused variable: var_95 + --> src/lib.rs:105:5 +warning: unused variable: var_96 + --> src/lib.rs:106:5 +warning: unused variable: var_97 + --> src/lib.rs:107:5 +warning: unused variable: var_98 + --> src/lib.rs:108:5 +warning: unused variable: var_99 + --> src/lib.rs:109:5 +warning: unused variable: var_100 + --> src/lib.rs:110:5 +warning: unused variable: var_101 + --> src/lib.rs:111:5 +warning: unused variable: var_102 + --> src/lib.rs:112:5 +warning: unused variable: var_103 + --> src/lib.rs:113:5 +warning: unused variable: var_104 + --> src/lib.rs:114:5 +warning: unused variable: var_105 + --> src/lib.rs:115:5 +warning: unused variable: var_106 + --> src/lib.rs:116:5 +warning: unused variable: var_107 + --> src/lib.rs:117:5 +warning: unused variable: var_108 + --> src/lib.rs:118:5 +warning: unused variable: var_109 + --> src/lib.rs:119:5 +warning: unused variable: var_110 + --> src/lib.rs:120:5 +warning: unused variable: var_111 + --> src/lib.rs:121:5 +warning: unused variable: var_112 + --> src/lib.rs:122:5 +warning: unused variable: var_113 + --> src/lib.rs:123:5 +warning: unused variable: var_114 + --> src/lib.rs:124:5 +warning: unused variable: var_115 + --> src/lib.rs:125:5 +warning: unused variable: var_116 + --> src/lib.rs:126:5 +warning: unused variable: var_117 + --> src/lib.rs:127:5 +warning: unused variable: var_118 + --> src/lib.rs:128:5 +warning: unused variable: var_119 + --> src/lib.rs:129:5 +warning: unused variable: var_120 + --> src/lib.rs:130:5 +warning: unused variable: var_121 + --> src/lib.rs:131:5 +warning: unused variable: var_122 + --> src/lib.rs:132:5 +warning: unused variable: var_123 + --> src/lib.rs:133:5 +warning: unused variable: var_124 + --> src/lib.rs:134:5 +warning: unused variable: var_125 + --> src/lib.rs:135:5 +warning: unused variable: var_126 + --> src/lib.rs:136:5 +warning: unused variable: var_127 + --> src/lib.rs:137:5 +warning: unused variable: var_128 + --> src/lib.rs:138:5 +warning: unused variable: var_129 + --> src/lib.rs:139:5 +warning: unused variable: var_130 + --> src/lib.rs:140:5 +warning: unused variable: var_131 + --> src/lib.rs:141:5 +warning: unused variable: var_132 + --> src/lib.rs:142:5 +warning: unused variable: var_133 + --> src/lib.rs:143:5 +warning: unused variable: var_134 + --> src/lib.rs:144:5 +warning: unused variable: var_135 + --> src/lib.rs:145:5 +warning: unused variable: var_136 + --> src/lib.rs:146:5 +warning: unused variable: var_137 + --> src/lib.rs:147:5 +warning: unused variable: var_138 + --> src/lib.rs:148:5 +warning: unused variable: var_139 + --> src/lib.rs:149:5 +warning: unused variable: var_140 + --> src/lib.rs:150:5 +warning: unused variable: var_141 + --> src/lib.rs:151:5 +warning: unused variable: var_142 + --> src/lib.rs:152:5 +warning: unused variable: var_143 + --> src/lib.rs:153:5 +warning: unused variable: var_144 + --> src/lib.rs:154:5 +warning: unused variable: var_145 + --> src/lib.rs:155:5 +warning: unused variable: var_146 + --> src/lib.rs:156:5 +warning: unused variable: var_147 + --> src/lib.rs:157:5 +warning: unused variable: var_148 + --> src/lib.rs:158:5 +warning: unused variable: var_149 + --> src/lib.rs:159:5 +warning: unused variable: var_150 + --> src/lib.rs:160:5 +warning: unused variable: var_151 + --> src/lib.rs:161:5 +warning: unused variable: var_152 + --> src/lib.rs:162:5 +warning: unused variable: var_153 + --> src/lib.rs:163:5 +warning: unused variable: var_154 + --> src/lib.rs:164:5 +warning: unused variable: var_155 + --> src/lib.rs:165:5 +warning: unused variable: var_156 + --> src/lib.rs:166:5 +warning: unused variable: var_157 + --> src/lib.rs:167:5 +warning: unused variable: var_158 + --> src/lib.rs:168:5 +warning: unused variable: var_159 + --> src/lib.rs:169:5 +warning: unused variable: var_160 + --> src/lib.rs:170:5 +warning: unused variable: var_161 + --> src/lib.rs:171:5 +warning: unused variable: var_162 + --> src/lib.rs:172:5 +warning: unused variable: var_163 + --> src/lib.rs:173:5 +warning: unused variable: var_164 + --> src/lib.rs:174:5 +warning: unused variable: var_165 + --> src/lib.rs:175:5 +warning: unused variable: var_166 + --> src/lib.rs:176:5 +warning: unused variable: var_167 + --> src/lib.rs:177:5 +warning: unused variable: var_168 + --> src/lib.rs:178:5 +warning: unused variable: var_169 + --> src/lib.rs:179:5 +warning: unused variable: var_170 + --> src/lib.rs:180:5 +warning: unused variable: var_171 + --> src/lib.rs:181:5 +warning: unused variable: var_172 + --> src/lib.rs:182:5 +warning: unused variable: var_173 + --> src/lib.rs:183:5 +warning: unused variable: var_174 + --> src/lib.rs:184:5 +warning: unused variable: var_175 + --> src/lib.rs:185:5 +warning: unused variable: var_176 + --> src/lib.rs:186:5 +warning: unused variable: var_177 + --> src/lib.rs:187:5 +warning: unused variable: var_178 + --> src/lib.rs:188:5 +warning: unused variable: var_179 + --> src/lib.rs:189:5 +warning: unused variable: var_180 + --> src/lib.rs:190:5 +warning: unused variable: var_181 + --> src/lib.rs:191:5 +warning: unused variable: var_182 + --> src/lib.rs:192:5 +warning: unused variable: var_183 + --> src/lib.rs:193:5 +warning: unused variable: var_184 + --> src/lib.rs:194:5 +warning: unused variable: var_185 + --> src/lib.rs:195:5 +warning: unused variable: var_186 + --> src/lib.rs:196:5 +warning: unused variable: var_187 + --> src/lib.rs:197:5 +warning: unused variable: var_188 + --> src/lib.rs:198:5 +warning: unused variable: var_189 + --> src/lib.rs:199:5 +warning: unused variable: var_190 + --> src/lib.rs:200:5 +warning: unused variable: var_191 + --> src/lib.rs:201:5 +warning: unused variable: var_192 + --> src/lib.rs:202:5 +warning: unused variable: var_193 + --> src/lib.rs:203:5 +warning: unused variable: var_194 + --> src/lib.rs:204:5 +warning: unused variable: var_195 + --> src/lib.rs:205:5 +warning: unused variable: var_196 + --> src/lib.rs:206:5 +warning: unused variable: var_197 + --> src/lib.rs:207:5 +warning: unused variable: var_198 + --> src/lib.rs:208:5 +warning: unused variable: var_199 + --> src/lib.rs:209:5 +warning: unused variable: var_200 + --> src/lib.rs:210:5 +warning: unused variable: var_201 + --> src/lib.rs:211:5 +warning: unused variable: var_202 + --> src/lib.rs:212:5 +warning: unused variable: var_203 + --> src/lib.rs:213:5 +warning: unused variable: var_204 + --> src/lib.rs:214:5 +warning: unused variable: var_205 + --> src/lib.rs:215:5 +warning: unused variable: var_206 + --> src/lib.rs:216:5 +warning: unused variable: var_207 + --> src/lib.rs:217:5 +warning: unused variable: var_208 + --> src/lib.rs:218:5 +warning: unused variable: var_209 + --> src/lib.rs:219:5 +warning: unused variable: var_210 + --> src/lib.rs:220:5 +warning: unused variable: var_211 + --> src/lib.rs:221:5 +warning: unused variable: var_212 + --> src/lib.rs:222:5 +warning: unused variable: var_213 + --> src/lib.rs:223:5 +warning: unused variable: var_214 + --> src/lib.rs:224:5 +warning: unused variable: var_215 + --> src/lib.rs:225:5 +warning: unused variable: var_216 + --> src/lib.rs:226:5 +warning: unused variable: var_217 + --> src/lib.rs:227:5 +warning: unused variable: var_218 + --> src/lib.rs:228:5 +warning: unused variable: var_219 + --> src/lib.rs:229:5 +warning: unused variable: var_220 + --> src/lib.rs:230:5 +warning: unused variable: var_221 + --> src/lib.rs:231:5 +warning: unused variable: var_222 + --> src/lib.rs:232:5 +warning: unused variable: var_223 + --> src/lib.rs:233:5 +warning: unused variable: var_224 + --> src/lib.rs:234:5 +warning: unused variable: var_225 + --> src/lib.rs:235:5 +warning: unused variable: var_226 + --> src/lib.rs:236:5 +warning: unused variable: var_227 + --> src/lib.rs:237:5 +warning: unused variable: var_228 + --> src/lib.rs:238:5 +warning: unused variable: var_229 + --> src/lib.rs:239:5 +warning: unused variable: var_230 + --> src/lib.rs:240:5 +warning: unused variable: var_231 + --> src/lib.rs:241:5 +warning: unused variable: var_232 + --> src/lib.rs:242:5 +warning: unused variable: var_233 + --> src/lib.rs:243:5 +warning: unused variable: var_234 + --> src/lib.rs:244:5 +warning: unused variable: var_235 + --> src/lib.rs:245:5 +warning: unused variable: var_236 + --> src/lib.rs:246:5 +warning: unused variable: var_237 + --> src/lib.rs:247:5 +warning: unused variable: var_238 + --> src/lib.rs:248:5 +warning: unused variable: var_239 + --> src/lib.rs:249:5 +warning: unused variable: var_240 + --> src/lib.rs:250:5 +warning: unused variable: var_241 + --> src/lib.rs:251:5 +warning: unused variable: var_242 + --> src/lib.rs:252:5 +warning: unused variable: var_243 + --> src/lib.rs:253:5 +warning: unused variable: var_244 + --> src/lib.rs:254:5 +warning: unused variable: var_245 + --> src/lib.rs:255:5 +warning: unused variable: var_246 + --> src/lib.rs:256:5 +warning: unused variable: var_247 + --> src/lib.rs:257:5 +warning: unused variable: var_248 + --> src/lib.rs:258:5 +warning: unused variable: var_249 + --> src/lib.rs:259:5 +warning: unused variable: var_250 + --> src/lib.rs:260:5 +warning: unused variable: var_251 + --> src/lib.rs:261:5 +warning: unused variable: var_252 + --> src/lib.rs:262:5 +warning: unused variable: var_253 + --> src/lib.rs:263:5 +warning: unused variable: var_254 + --> src/lib.rs:264:5 +warning: unused variable: var_255 + --> src/lib.rs:265:5 +warning: unused variable: var_256 + --> src/lib.rs:266:5 +warning: unused variable: var_257 + --> src/lib.rs:267:5 +warning: unused variable: var_258 + --> src/lib.rs:268:5 +warning: unused variable: var_259 + --> src/lib.rs:269:5 +warning: unused variable: var_260 + --> src/lib.rs:270:5 +warning: unused variable: var_261 + --> src/lib.rs:271:5 +warning: unused variable: var_262 + --> src/lib.rs:272:5 +warning: unused variable: var_263 + --> src/lib.rs:273:5 +warning: unused variable: var_264 + --> src/lib.rs:274:5 +warning: unused variable: var_265 + --> src/lib.rs:275:5 +warning: unused variable: var_266 + --> src/lib.rs:276:5 +warning: unused variable: var_267 + --> src/lib.rs:277:5 +warning: unused variable: var_268 + --> src/lib.rs:278:5 +warning: unused variable: var_269 + --> src/lib.rs:279:5 +warning: unused variable: var_270 + --> src/lib.rs:280:5 +warning: unused variable: var_271 + --> src/lib.rs:281:5 +warning: unused variable: var_272 + --> src/lib.rs:282:5 +warning: unused variable: var_273 + --> src/lib.rs:283:5 +warning: unused variable: var_274 + --> src/lib.rs:284:5 +warning: unused variable: var_275 + --> src/lib.rs:285:5 +warning: unused variable: var_276 + --> src/lib.rs:286:5 +warning: unused variable: var_277 + --> src/lib.rs:287:5 +warning: unused variable: var_278 + --> src/lib.rs:288:5 +warning: unused variable: var_279 + --> src/lib.rs:289:5 +warning: unused variable: var_280 + --> src/lib.rs:290:5 +warning: unused variable: var_281 + --> src/lib.rs:291:5 +warning: unused variable: var_282 + --> src/lib.rs:292:5 +warning: unused variable: var_283 + --> src/lib.rs:293:5 +warning: unused variable: var_284 + --> src/lib.rs:294:5 +warning: unused variable: var_285 + --> src/lib.rs:295:5 +warning: unused variable: var_286 + --> src/lib.rs:296:5 +warning: unused variable: var_287 + --> src/lib.rs:297:5 +warning: unused variable: var_288 + --> src/lib.rs:298:5 +warning: unused variable: var_289 + --> src/lib.rs:299:5 +warning: unused variable: var_290 + --> src/lib.rs:300:5 +warning: unused variable: var_291 + --> src/lib.rs:301:5 +warning: unused variable: var_292 + --> src/lib.rs:302:5 +warning: unused variable: var_293 + --> src/lib.rs:303:5 +warning: unused variable: var_294 + --> src/lib.rs:304:5 +warning: unused variable: var_295 + --> src/lib.rs:305:5 +warning: unused variable: var_296 + --> src/lib.rs:306:5 +warning: unused variable: var_297 + --> src/lib.rs:307:5 +warning: unused variable: var_298 + --> src/lib.rs:308:5 +warning: unused variable: var_299 + --> src/lib.rs:309:5 +error[E0308]: mismatched types + --> src/main.rs:42:9 + | +42 | let x: u32 = "hello"; + | --- ^^^^^^^ expected u32, found &str \ No newline at end of file diff --git a/bench/fixtures/mdcompress_claude_md.txt b/bench/fixtures/mdcompress_claude_md.txt new file mode 100644 index 0000000..5d37c5b --- /dev/null +++ b/bench/fixtures/mdcompress_claude_md.txt @@ -0,0 +1,32 @@ +# Project Name + +The quick brown fox really just jumps over the lazy dog. This is basically a sample document that contains some natural language prose along with code blocks and tables. + +## Background + +The reason we are building this is because the existing solution does not really work the way we would like. I'd be happy to explain more, but the basic idea is to use the new framework with these parameters. + +In general, you could consider using the configuration directory for the documentation files. The repository structure is approximately as follows: + +```rust +fn main() { + let config = Config::default(); + println!("{}", config.as_str()); +} +``` + +## Usage + +Run `cargo build --release` to compile the binary. Then run the function with these arguments: + +| flag | description | +|------|-------------| +| --check | Just verify, do not write | +| --all | Walk all known directories | +| --quiet | Suppress the informational output | + +For more details, see [the documentation](https://example.com/docs/v1.0). + +## Notes + +It might be worth considering the trade-off between the speed and the accuracy. Perhaps the configuration could be tuned. Maybe the function should be split into smaller pieces. The repository structure is documented in the README file. diff --git a/bench/fixtures/mdcompress_prose.txt b/bench/fixtures/mdcompress_prose.txt new file mode 100644 index 0000000..014529b --- /dev/null +++ b/bench/fixtures/mdcompress_prose.txt @@ -0,0 +1,5 @@ +The reason that this approach really works is because the underlying mechanism is basically a deduplication strategy that just removes the redundant entries. I'd be happy to walk through it. + +In general, you could consider that the function essentially takes a list of items and returns the unique ones. Perhaps the most important thing to note is that the order is preserved. Maybe you would like to use a different data structure, but for the simple case the basic implementation works really well. + +It might be worth considering the trade-off between memory and speed. Of course, you would also like to ensure correctness. Sure, the implementation could be optimized further, but for now the simple version is sufficient for the use case at hand. diff --git a/bench/fixtures/summarize_huge.txt b/bench/fixtures/summarize_huge.txt new file mode 100644 index 0000000..6543644 --- /dev/null +++ b/bench/fixtures/summarize_huge.txt @@ -0,0 +1,5003 @@ +2026-04-07T12:00:00 INFO worker[0] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[5] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[6] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[7] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[8] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[9] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[10] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[11] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[12] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[13] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[14] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[15] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[16] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[17] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[18] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[19] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[20] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[21] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[22] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[23] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[24] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[25] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[26] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[27] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[28] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[29] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[30] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[31] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[32] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[33] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[34] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[35] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[36] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[37] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[38] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[39] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[40] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[41] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[42] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[43] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[44] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[45] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[46] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[47] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[48] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[49] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[50] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[51] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[52] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[53] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[54] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[55] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[56] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[57] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[58] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[59] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[60] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[61] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[62] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[63] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[64] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[65] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[66] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[67] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[68] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[69] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[70] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[71] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[72] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[73] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[74] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[75] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[76] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[77] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[78] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[79] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[80] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[81] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[82] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[83] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[84] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[85] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[86] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[87] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[88] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[89] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[90] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[91] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[92] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[93] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[94] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[95] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[96] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[97] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[98] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[99] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[100] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[101] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[102] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[103] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[104] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[105] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[106] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[107] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[108] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[109] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[110] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[111] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[112] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[113] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[114] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[115] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[116] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[117] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[118] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[119] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[120] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[121] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[122] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[123] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[124] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[125] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[126] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[127] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[128] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[129] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[130] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[131] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[132] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[133] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[134] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[135] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[136] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[137] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[138] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[139] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[140] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[141] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[142] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[143] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[144] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[145] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[146] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[147] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[148] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[149] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[150] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[151] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[152] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[153] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[154] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[155] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[156] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[157] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[158] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[159] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[160] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[161] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[162] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[163] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[164] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[165] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[166] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[167] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[168] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[169] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[170] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[171] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[172] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[173] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[174] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[175] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[176] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[177] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[178] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[179] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[180] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[181] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[182] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[183] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[184] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[185] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[186] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[187] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[188] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[189] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[190] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[191] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[192] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[193] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[194] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[195] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[196] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[197] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[198] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[199] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[200] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[201] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[202] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[203] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[204] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[205] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[206] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[207] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[208] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[209] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[210] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[211] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[212] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[213] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[214] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[215] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[216] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[217] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[218] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[219] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[220] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[221] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[222] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[223] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[224] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[225] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[226] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[227] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[228] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[229] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[230] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[231] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[232] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[233] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[234] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[235] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[236] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[237] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[238] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[239] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[240] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[241] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[242] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[243] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[244] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[245] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[246] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[247] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[248] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[249] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[250] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[251] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[252] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[253] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[254] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[255] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[256] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[257] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[258] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[259] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[260] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[261] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[262] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[263] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[264] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[265] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[266] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[267] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[268] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[269] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[270] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[271] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[272] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[273] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[274] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[275] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[276] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[277] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[278] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[279] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[280] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[281] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[282] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[283] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[284] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[285] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[286] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[287] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[288] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[289] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[290] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[291] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[292] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[293] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[294] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[295] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[296] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[297] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[298] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[299] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[300] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[301] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[302] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[303] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[304] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[305] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[306] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[307] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[308] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[309] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[310] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[311] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[312] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[313] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[314] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[315] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[316] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[317] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[318] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[319] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[320] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[321] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[322] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[323] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[324] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[325] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[326] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[327] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[328] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[329] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[330] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[331] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[332] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[333] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[334] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[335] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[336] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[337] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[338] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[339] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[340] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[341] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[342] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[343] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[344] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[345] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[346] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[347] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[348] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[349] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[350] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[351] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[352] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[353] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[354] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[355] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[356] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[357] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[358] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[359] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[360] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[361] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[362] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[363] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[364] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[365] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[366] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[367] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[368] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[369] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[370] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[371] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[372] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[373] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[374] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[375] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[376] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[377] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[378] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[379] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[380] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[381] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[382] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[383] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[384] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[385] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[386] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[387] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[388] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[389] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[390] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[391] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[392] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[393] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[394] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[395] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[396] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[397] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[398] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[399] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[400] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[401] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[402] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[403] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[404] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[405] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[406] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[407] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[408] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[409] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[410] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[411] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[412] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[413] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[414] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[415] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[416] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[417] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[418] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[419] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[420] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[421] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[422] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[423] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[424] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[425] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[426] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[427] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[428] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[429] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[430] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[431] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[432] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[433] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[434] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[435] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[436] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[437] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[438] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[439] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[440] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[441] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[442] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[443] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[444] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[445] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[446] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[447] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[448] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[449] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[450] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[451] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[452] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[453] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[454] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[455] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[456] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[457] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[458] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[459] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[460] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[461] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[462] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[463] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[464] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[465] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[466] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[467] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[468] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[469] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[470] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[471] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[472] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[473] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[474] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[475] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[476] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[477] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[478] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[479] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[480] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[481] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[482] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[483] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[484] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[485] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[486] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[487] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[488] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[489] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[490] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[491] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[492] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[493] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[494] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[495] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[496] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[497] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[498] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[499] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[500] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[501] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[502] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[503] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[504] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[505] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[506] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[507] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[508] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[509] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[510] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[511] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[512] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[513] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[514] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[515] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[516] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[517] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[518] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[519] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[520] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[521] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[522] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[523] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[524] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[525] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[526] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[527] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[528] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[529] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[530] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[531] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[532] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[533] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[534] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[535] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[536] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[537] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[538] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[539] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[540] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[541] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[542] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[543] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[544] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[545] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[546] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[547] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[548] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[549] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[550] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[551] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[552] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[553] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[554] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[555] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[556] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[557] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[558] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[559] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[560] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[561] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[562] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[563] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[564] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[565] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[566] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[567] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[568] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[569] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[570] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[571] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[572] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[573] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[574] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[575] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[576] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[577] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[578] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[579] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[580] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[581] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[582] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[583] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[584] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[585] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[586] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[587] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[588] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[589] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[590] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[591] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[592] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[593] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[594] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[595] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[596] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[597] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[598] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[599] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[600] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[601] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[602] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[603] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[604] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[605] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[606] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[607] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[608] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[609] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[610] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[611] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[612] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[613] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[614] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[615] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[616] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[617] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[618] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[619] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[620] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[621] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[622] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[623] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[624] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[625] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[626] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[627] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[628] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[629] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[630] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[631] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[632] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[633] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[634] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[635] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[636] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[637] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[638] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[639] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[640] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[641] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[642] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[643] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[644] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[645] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[646] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[647] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[648] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[649] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[650] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[651] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[652] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[653] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[654] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[655] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[656] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[657] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[658] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[659] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[660] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[661] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[662] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[663] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[664] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[665] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[666] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[667] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[668] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[669] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[670] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[671] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[672] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[673] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[674] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[675] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[676] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[677] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[678] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[679] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[680] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[681] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[682] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[683] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[684] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[685] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[686] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[687] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[688] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[689] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[690] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[691] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[692] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[693] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[694] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[695] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[696] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[697] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[698] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[699] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[700] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[701] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[702] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[703] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[704] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[705] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[706] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[707] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[708] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[709] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[710] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[711] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[712] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[713] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[714] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[715] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[716] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[717] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[718] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[719] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[720] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[721] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[722] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[723] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[724] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[725] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[726] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[727] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[728] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[729] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[730] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[731] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[732] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[733] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[734] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[735] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[736] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[737] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[738] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[739] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[740] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[741] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[742] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[743] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[744] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[745] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[746] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[747] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[748] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[749] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[750] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[751] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[752] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[753] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[754] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[755] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[756] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[757] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[758] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[759] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[760] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[761] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[762] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[763] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[764] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[765] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[766] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[767] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[768] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[769] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[770] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[771] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[772] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[773] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[774] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[775] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[776] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[777] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[778] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[779] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[780] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[781] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[782] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[783] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[784] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[785] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[786] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[787] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[788] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[789] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[790] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[791] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[792] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[793] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[794] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[795] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[796] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[797] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[798] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[799] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[800] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[801] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[802] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[803] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[804] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[805] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[806] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[807] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[808] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[809] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[810] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[811] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[812] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[813] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[814] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[815] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[816] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[817] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[818] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[819] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[820] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[821] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[822] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[823] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[824] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[825] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[826] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[827] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[828] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[829] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[830] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[831] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[832] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[833] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[834] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[835] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[836] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[837] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[838] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[839] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[840] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[841] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[842] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[843] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[844] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[845] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[846] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[847] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[848] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[849] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[850] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[851] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[852] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[853] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[854] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[855] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[856] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[857] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[858] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[859] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[860] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[861] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[862] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[863] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[864] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[865] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[866] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[867] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[868] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[869] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[870] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[871] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[872] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[873] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[874] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[875] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[876] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[877] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[878] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[879] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[880] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[881] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[882] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[883] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[884] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[885] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[886] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[887] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[888] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[889] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[890] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[891] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[892] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[893] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[894] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[895] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[896] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[897] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[898] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[899] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[900] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[901] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[902] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[903] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[904] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[905] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[906] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[907] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[908] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[909] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[910] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[911] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[912] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[913] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[914] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[915] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[916] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[917] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[918] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[919] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[920] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[921] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[922] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[923] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[924] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[925] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[926] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[927] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[928] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[929] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[930] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[931] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[932] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[933] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[934] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[935] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[936] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[937] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[938] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[939] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[940] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[941] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[942] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[943] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[944] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[945] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[946] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[947] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[948] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[949] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[950] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[951] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[952] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[953] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[954] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[955] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[956] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[957] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[958] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[959] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[960] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[961] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[962] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[963] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[964] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[965] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[966] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[967] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[968] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[969] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[970] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[971] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[972] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[973] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[974] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[975] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[976] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[977] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[978] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[979] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[980] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[981] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[982] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[983] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[984] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[985] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[986] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[987] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[988] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[989] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[990] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[991] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[992] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[993] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[994] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[995] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[996] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[997] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[998] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[999] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1000] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1001] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1002] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1003] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1004] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1005] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1006] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1007] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1008] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1009] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1010] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1011] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1012] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1013] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1014] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1015] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1016] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1017] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1018] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1019] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1020] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1021] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1022] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1023] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1024] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1025] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1026] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1027] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1028] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1029] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1030] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1031] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1032] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1033] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1034] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1035] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1036] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1037] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1038] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1039] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1040] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1041] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1042] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1043] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1044] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1045] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1046] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1047] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1048] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1049] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1050] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1051] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1052] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1053] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1054] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1055] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1056] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1057] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1058] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1059] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1060] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1061] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1062] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1063] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1064] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1065] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1066] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1067] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1068] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1069] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1070] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1071] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1072] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1073] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1074] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1075] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1076] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1077] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1078] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1079] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1080] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1081] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1082] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1083] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1084] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1085] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1086] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1087] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1088] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1089] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1090] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1091] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1092] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1093] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1094] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1095] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1096] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1097] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1098] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1099] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1100] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1101] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1102] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1103] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1104] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1105] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1106] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1107] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1108] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1109] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1110] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1111] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1112] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1113] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1114] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1115] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1116] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1117] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1118] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1119] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1120] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1121] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1122] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1123] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1124] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1125] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1126] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1127] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1128] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1129] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1130] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1131] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1132] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1133] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1134] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1135] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1136] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1137] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1138] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1139] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1140] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1141] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1142] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1143] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1144] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1145] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1146] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1147] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1148] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1149] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1150] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1151] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1152] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1153] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1154] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1155] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1156] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1157] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1158] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1159] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1160] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1161] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1162] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1163] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1164] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1165] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1166] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1167] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1168] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1169] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1170] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1171] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1172] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1173] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1174] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1175] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1176] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1177] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1178] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1179] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1180] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1181] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1182] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1183] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1184] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1185] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1186] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1187] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1188] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1189] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1190] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1191] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1192] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1193] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1194] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1195] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1196] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1197] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1198] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1199] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1200] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1201] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1202] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1203] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1204] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1205] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1206] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1207] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1208] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1209] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1210] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1211] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1212] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1213] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1214] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1215] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1216] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1217] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1218] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1219] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1220] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1221] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1222] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1223] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1224] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1225] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1226] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1227] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1228] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1229] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1230] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1231] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1232] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1233] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1234] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1235] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1236] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1237] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1238] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1239] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1240] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1241] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1242] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1243] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1244] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1245] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1246] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1247] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1248] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1249] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1250] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1251] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1252] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1253] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1254] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1255] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1256] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1257] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1258] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1259] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1260] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1261] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1262] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1263] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1264] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1265] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1266] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1267] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1268] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1269] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1270] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1271] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1272] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1273] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1274] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1275] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1276] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1277] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1278] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1279] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1280] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1281] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1282] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1283] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1284] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1285] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1286] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1287] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1288] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1289] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1290] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1291] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1292] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1293] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1294] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1295] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1296] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1297] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1298] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1299] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1300] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1301] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1302] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1303] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1304] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1305] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1306] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1307] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1308] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1309] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1310] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1311] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1312] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1313] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1314] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1315] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1316] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1317] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1318] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1319] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1320] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1321] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1322] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1323] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1324] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1325] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1326] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1327] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1328] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1329] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1330] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1331] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1332] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1333] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1334] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1335] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1336] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1337] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1338] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1339] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1340] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1341] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1342] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1343] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1344] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1345] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1346] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1347] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1348] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1349] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1350] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1351] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1352] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1353] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1354] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1355] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1356] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1357] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1358] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1359] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1360] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1361] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1362] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1363] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1364] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1365] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1366] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1367] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1368] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1369] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1370] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1371] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1372] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1373] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1374] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1375] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1376] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1377] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1378] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1379] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1380] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1381] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1382] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1383] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1384] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1385] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1386] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1387] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1388] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1389] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1390] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1391] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1392] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1393] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1394] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1395] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1396] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1397] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1398] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1399] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1400] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1401] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1402] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1403] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1404] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1405] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1406] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1407] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1408] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1409] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1410] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1411] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1412] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1413] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1414] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1415] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1416] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1417] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1418] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1419] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1420] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1421] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1422] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1423] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1424] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1425] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1426] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1427] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1428] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1429] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1430] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1431] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1432] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1433] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1434] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1435] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1436] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1437] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1438] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1439] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1440] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1441] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1442] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1443] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1444] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1445] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1446] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1447] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1448] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1449] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1450] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1451] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1452] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1453] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1454] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1455] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1456] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1457] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1458] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1459] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1460] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1461] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1462] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1463] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1464] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1465] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1466] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1467] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1468] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1469] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1470] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1471] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1472] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1473] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1474] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1475] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1476] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1477] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1478] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1479] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1480] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1481] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1482] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1483] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1484] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1485] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1486] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1487] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1488] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1489] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1490] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1491] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1492] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1493] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1494] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1495] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1496] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1497] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1498] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1499] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1500] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1501] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1502] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1503] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1504] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1505] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1506] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1507] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1508] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1509] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1510] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1511] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1512] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1513] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1514] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1515] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1516] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1517] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1518] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1519] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1520] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1521] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1522] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1523] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1524] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1525] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1526] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1527] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1528] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1529] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1530] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1531] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1532] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1533] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1534] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1535] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1536] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1537] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1538] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1539] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1540] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1541] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1542] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1543] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1544] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1545] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1546] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1547] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1548] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1549] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1550] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1551] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1552] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1553] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1554] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1555] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1556] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1557] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1558] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1559] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1560] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1561] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1562] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1563] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1564] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1565] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1566] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1567] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1568] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1569] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1570] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1571] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1572] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1573] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1574] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1575] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1576] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1577] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1578] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1579] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1580] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1581] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1582] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1583] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1584] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1585] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1586] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1587] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1588] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1589] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1590] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1591] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1592] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1593] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1594] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1595] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1596] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1597] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1598] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1599] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1600] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1601] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1602] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1603] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1604] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1605] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1606] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1607] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1608] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1609] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1610] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1611] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1612] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1613] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1614] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1615] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1616] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1617] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1618] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1619] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1620] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1621] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1622] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1623] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1624] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1625] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1626] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1627] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1628] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1629] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1630] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1631] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1632] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1633] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1634] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1635] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1636] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1637] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1638] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1639] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1640] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1641] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1642] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1643] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1644] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1645] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1646] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1647] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1648] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1649] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1650] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1651] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1652] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1653] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1654] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1655] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1656] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1657] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1658] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1659] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1660] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1661] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1662] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1663] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1664] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1665] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1666] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1667] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1668] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1669] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1670] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1671] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1672] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1673] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1674] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1675] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1676] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1677] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1678] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1679] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1680] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1681] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1682] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1683] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1684] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1685] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1686] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1687] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1688] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1689] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1690] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1691] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1692] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1693] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1694] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1695] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1696] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1697] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1698] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1699] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1700] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1701] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1702] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1703] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1704] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1705] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1706] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1707] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1708] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1709] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1710] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1711] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1712] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1713] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1714] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1715] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1716] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1717] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1718] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1719] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1720] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1721] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1722] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1723] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1724] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1725] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1726] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1727] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1728] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1729] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1730] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1731] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1732] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1733] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1734] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1735] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1736] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1737] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1738] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1739] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1740] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1741] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1742] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1743] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1744] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1745] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1746] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1747] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1748] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1749] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1750] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1751] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1752] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1753] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1754] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1755] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1756] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1757] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1758] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1759] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1760] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1761] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1762] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1763] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1764] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1765] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1766] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1767] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1768] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1769] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1770] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1771] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1772] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1773] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1774] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1775] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1776] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1777] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1778] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1779] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1780] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1781] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1782] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1783] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1784] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1785] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1786] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1787] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1788] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1789] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1790] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1791] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1792] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1793] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1794] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1795] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1796] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1797] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1798] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1799] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1800] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1801] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1802] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1803] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1804] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1805] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1806] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1807] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1808] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1809] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1810] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1811] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1812] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1813] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1814] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1815] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1816] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1817] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1818] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1819] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1820] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1821] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1822] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1823] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1824] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1825] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1826] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1827] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1828] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1829] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1830] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1831] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1832] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1833] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1834] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1835] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1836] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1837] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1838] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1839] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1840] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1841] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1842] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1843] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1844] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1845] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1846] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1847] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1848] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1849] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1850] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1851] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1852] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1853] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1854] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1855] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1856] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1857] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1858] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1859] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1860] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1861] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1862] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1863] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1864] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1865] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1866] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1867] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1868] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1869] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1870] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1871] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1872] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1873] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1874] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1875] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1876] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1877] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1878] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1879] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1880] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1881] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1882] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1883] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1884] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1885] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1886] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1887] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1888] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1889] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1890] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1891] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1892] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1893] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1894] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1895] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1896] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1897] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1898] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1899] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1900] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1901] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1902] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1903] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1904] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1905] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1906] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1907] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1908] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1909] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1910] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1911] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1912] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1913] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1914] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1915] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1916] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1917] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1918] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1919] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1920] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1921] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1922] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1923] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1924] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1925] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1926] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1927] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1928] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1929] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1930] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1931] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1932] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1933] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1934] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1935] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1936] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1937] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1938] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1939] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[1940] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[1941] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[1942] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[1943] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[1944] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[1945] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[1946] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[1947] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[1948] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[1949] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[1950] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[1951] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[1952] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[1953] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[1954] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[1955] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[1956] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[1957] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[1958] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[1959] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[1960] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[1961] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[1962] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[1963] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[1964] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[1965] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[1966] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[1967] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[1968] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[1969] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[1970] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[1971] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[1972] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[1973] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[1974] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[1975] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[1976] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[1977] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[1978] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[1979] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[1980] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[1981] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[1982] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[1983] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[1984] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[1985] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[1986] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[1987] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[1988] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[1989] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[1990] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[1991] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[1992] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[1993] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[1994] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[1995] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[1996] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[1997] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[1998] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[1999] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2000] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2001] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2002] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2003] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2004] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2005] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2006] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2007] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2008] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2009] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2010] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2011] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2012] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2013] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2014] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2015] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2016] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2017] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2018] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2019] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2020] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2021] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2022] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2023] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2024] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2025] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2026] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2027] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2028] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2029] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2030] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2031] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2032] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2033] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2034] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2035] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2036] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2037] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2038] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2039] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2040] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2041] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2042] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2043] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2044] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2045] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2046] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2047] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2048] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2049] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2050] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2051] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2052] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2053] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2054] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2055] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2056] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2057] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2058] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2059] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2060] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2061] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2062] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2063] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2064] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2065] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2066] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2067] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2068] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2069] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2070] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2071] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2072] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2073] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2074] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2075] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2076] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2077] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2078] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2079] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2080] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2081] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2082] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2083] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2084] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2085] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2086] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2087] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2088] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2089] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2090] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2091] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2092] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2093] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2094] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2095] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2096] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2097] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2098] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2099] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2100] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2101] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2102] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2103] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2104] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2105] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2106] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2107] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2108] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2109] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2110] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2111] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2112] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2113] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2114] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2115] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2116] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2117] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2118] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2119] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2120] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2121] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2122] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2123] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2124] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2125] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2126] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2127] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2128] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2129] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2130] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2131] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2132] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2133] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2134] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2135] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2136] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2137] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2138] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2139] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2140] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2141] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2142] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2143] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2144] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2145] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2146] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2147] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2148] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2149] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2150] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2151] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2152] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2153] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2154] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2155] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2156] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2157] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2158] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2159] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2160] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2161] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2162] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2163] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2164] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2165] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2166] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2167] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2168] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2169] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2170] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2171] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2172] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2173] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2174] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2175] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2176] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2177] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2178] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2179] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2180] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2181] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2182] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2183] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2184] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2185] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2186] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2187] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2188] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2189] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2190] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2191] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2192] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2193] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2194] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2195] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2196] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2197] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2198] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2199] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2200] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2201] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2202] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2203] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2204] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2205] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2206] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2207] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2208] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2209] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2210] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2211] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2212] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2213] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2214] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2215] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2216] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2217] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2218] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2219] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2220] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2221] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2222] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2223] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2224] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2225] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2226] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2227] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2228] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2229] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2230] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2231] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2232] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2233] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2234] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2235] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2236] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2237] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2238] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2239] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2240] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2241] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2242] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2243] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2244] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2245] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2246] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2247] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2248] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2249] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2250] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2251] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2252] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2253] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2254] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2255] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2256] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2257] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2258] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2259] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2260] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2261] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2262] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2263] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2264] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2265] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2266] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2267] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2268] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2269] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2270] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2271] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2272] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2273] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2274] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2275] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2276] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2277] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2278] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2279] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2280] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2281] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2282] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2283] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2284] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2285] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2286] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2287] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2288] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2289] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2290] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2291] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2292] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2293] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2294] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2295] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2296] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2297] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2298] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2299] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2300] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2301] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2302] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2303] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2304] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2305] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2306] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2307] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2308] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2309] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2310] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2311] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2312] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2313] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2314] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2315] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2316] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2317] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2318] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2319] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2320] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2321] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2322] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2323] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2324] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2325] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2326] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2327] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2328] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2329] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2330] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2331] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2332] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2333] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2334] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2335] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2336] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2337] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2338] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2339] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2340] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2341] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2342] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2343] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2344] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2345] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2346] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2347] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2348] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2349] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2350] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2351] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2352] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2353] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2354] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2355] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2356] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2357] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2358] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2359] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2360] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2361] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2362] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2363] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2364] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2365] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2366] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2367] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2368] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2369] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2370] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2371] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2372] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2373] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2374] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2375] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2376] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2377] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2378] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2379] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2380] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2381] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2382] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2383] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2384] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2385] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2386] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2387] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2388] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2389] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2390] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2391] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2392] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2393] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2394] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2395] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2396] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2397] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2398] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2399] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2400] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2401] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2402] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2403] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2404] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2405] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2406] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2407] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2408] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2409] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2410] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2411] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2412] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2413] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2414] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2415] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2416] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2417] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2418] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2419] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2420] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2421] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2422] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2423] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2424] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2425] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2426] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2427] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2428] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2429] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2430] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2431] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2432] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2433] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2434] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2435] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2436] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2437] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2438] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2439] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2440] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2441] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2442] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2443] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2444] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2445] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2446] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2447] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2448] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2449] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2450] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2451] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2452] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2453] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2454] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2455] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2456] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2457] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2458] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2459] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2460] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2461] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2462] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2463] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2464] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2465] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2466] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2467] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2468] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2469] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2470] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2471] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2472] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2473] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2474] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2475] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2476] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2477] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2478] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2479] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2480] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2481] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2482] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2483] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2484] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2485] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2486] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2487] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2488] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2489] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2490] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2491] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2492] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2493] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2494] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2495] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2496] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2497] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2498] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2499] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2500] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2501] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2502] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2503] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2504] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2505] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2506] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2507] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2508] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2509] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2510] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2511] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2512] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2513] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2514] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2515] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2516] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2517] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2518] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2519] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2520] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2521] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2522] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2523] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2524] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2525] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2526] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2527] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2528] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2529] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2530] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2531] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2532] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2533] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2534] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2535] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2536] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2537] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2538] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2539] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2540] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2541] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2542] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2543] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2544] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2545] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2546] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2547] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2548] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2549] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2550] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2551] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2552] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2553] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2554] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2555] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2556] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2557] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2558] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2559] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2560] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2561] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2562] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2563] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2564] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2565] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2566] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2567] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2568] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2569] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2570] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2571] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2572] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2573] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2574] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2575] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2576] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2577] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2578] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2579] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2580] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2581] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2582] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2583] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2584] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2585] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2586] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2587] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2588] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2589] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2590] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2591] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2592] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2593] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2594] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2595] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2596] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2597] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2598] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2599] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2600] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2601] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2602] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2603] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2604] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2605] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2606] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2607] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2608] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2609] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2610] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2611] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2612] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2613] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2614] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2615] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2616] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2617] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2618] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2619] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2620] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2621] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2622] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2623] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2624] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2625] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2626] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2627] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2628] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2629] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2630] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2631] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2632] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2633] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2634] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2635] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2636] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2637] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2638] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2639] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2640] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2641] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2642] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2643] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2644] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2645] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2646] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2647] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2648] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2649] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2650] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2651] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2652] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2653] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2654] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2655] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2656] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2657] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2658] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2659] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2660] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2661] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2662] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2663] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2664] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2665] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2666] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2667] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2668] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2669] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2670] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2671] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2672] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2673] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2674] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2675] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2676] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2677] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2678] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2679] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2680] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2681] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2682] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2683] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2684] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2685] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2686] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2687] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2688] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2689] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2690] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2691] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2692] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2693] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2694] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2695] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2696] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2697] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2698] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2699] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2700] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2701] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2702] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2703] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2704] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2705] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2706] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2707] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2708] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2709] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2710] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2711] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2712] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2713] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2714] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2715] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2716] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2717] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2718] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2719] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2720] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2721] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2722] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2723] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2724] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2725] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2726] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2727] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2728] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2729] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2730] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2731] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2732] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2733] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2734] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2735] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2736] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2737] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2738] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2739] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2740] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2741] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2742] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2743] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2744] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2745] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2746] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2747] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2748] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2749] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2750] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2751] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2752] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2753] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2754] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2755] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2756] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2757] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2758] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2759] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2760] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2761] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2762] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2763] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2764] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2765] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2766] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2767] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2768] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2769] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2770] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2771] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2772] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2773] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2774] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2775] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2776] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2777] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2778] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2779] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2780] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2781] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2782] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2783] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2784] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2785] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2786] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2787] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2788] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2789] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2790] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2791] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2792] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2793] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2794] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2795] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2796] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2797] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2798] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2799] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2800] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2801] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2802] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2803] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2804] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2805] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2806] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2807] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2808] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2809] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2810] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2811] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2812] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2813] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2814] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2815] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2816] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2817] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2818] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2819] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2820] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2821] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2822] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2823] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2824] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2825] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2826] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2827] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2828] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2829] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2830] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2831] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2832] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2833] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2834] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2835] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2836] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2837] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2838] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2839] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2840] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2841] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2842] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2843] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2844] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2845] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2846] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2847] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2848] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2849] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2850] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2851] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2852] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2853] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2854] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2855] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2856] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2857] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2858] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2859] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2860] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2861] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2862] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2863] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2864] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2865] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2866] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2867] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2868] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2869] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2870] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2871] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2872] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2873] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2874] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2875] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2876] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2877] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2878] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2879] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2880] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2881] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2882] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2883] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2884] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2885] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2886] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2887] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2888] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2889] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2890] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2891] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2892] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2893] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2894] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2895] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2896] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2897] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2898] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2899] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2900] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2901] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2902] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2903] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2904] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2905] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2906] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2907] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2908] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2909] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2910] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2911] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2912] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2913] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2914] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2915] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2916] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2917] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2918] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2919] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2920] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2921] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2922] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2923] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2924] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2925] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2926] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2927] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2928] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2929] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2930] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2931] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2932] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2933] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2934] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2935] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2936] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2937] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2938] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2939] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[2940] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[2941] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[2942] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[2943] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[2944] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[2945] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[2946] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[2947] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[2948] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[2949] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[2950] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[2951] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[2952] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[2953] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[2954] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[2955] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[2956] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[2957] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[2958] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[2959] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[2960] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[2961] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[2962] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[2963] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[2964] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[2965] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[2966] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[2967] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[2968] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[2969] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[2970] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[2971] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[2972] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[2973] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[2974] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[2975] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[2976] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[2977] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[2978] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[2979] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[2980] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[2981] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[2982] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[2983] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[2984] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[2985] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[2986] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[2987] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[2988] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[2989] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[2990] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[2991] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[2992] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[2993] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[2994] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[2995] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[2996] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[2997] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[2998] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[2999] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3000] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3001] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3002] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3003] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3004] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3005] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3006] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3007] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3008] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3009] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3010] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3011] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3012] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3013] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3014] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3015] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3016] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3017] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3018] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3019] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3020] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3021] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3022] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3023] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3024] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3025] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3026] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3027] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3028] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3029] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3030] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3031] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3032] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3033] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3034] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3035] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3036] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3037] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3038] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3039] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3040] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3041] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3042] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3043] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3044] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3045] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3046] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3047] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3048] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3049] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3050] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3051] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3052] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3053] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3054] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3055] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3056] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3057] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3058] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3059] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3060] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3061] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3062] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3063] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3064] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3065] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3066] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3067] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3068] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3069] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3070] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3071] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3072] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3073] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3074] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3075] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3076] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3077] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3078] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3079] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3080] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3081] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3082] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3083] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3084] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3085] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3086] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3087] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3088] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3089] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3090] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3091] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3092] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3093] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3094] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3095] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3096] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3097] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3098] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3099] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3100] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3101] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3102] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3103] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3104] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3105] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3106] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3107] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3108] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3109] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3110] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3111] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3112] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3113] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3114] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3115] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3116] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3117] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3118] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3119] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3120] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3121] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3122] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3123] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3124] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3125] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3126] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3127] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3128] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3129] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3130] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3131] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3132] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3133] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3134] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3135] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3136] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3137] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3138] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3139] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3140] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3141] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3142] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3143] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3144] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3145] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3146] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3147] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3148] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3149] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3150] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3151] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3152] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3153] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3154] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3155] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3156] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3157] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3158] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3159] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3160] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3161] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3162] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3163] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3164] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3165] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3166] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3167] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3168] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3169] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3170] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3171] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3172] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3173] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3174] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3175] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3176] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3177] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3178] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3179] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3180] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3181] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3182] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3183] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3184] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3185] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3186] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3187] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3188] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3189] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3190] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3191] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3192] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3193] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3194] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3195] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3196] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3197] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3198] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3199] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3200] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3201] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3202] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3203] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3204] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3205] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3206] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3207] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3208] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3209] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3210] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3211] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3212] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3213] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3214] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3215] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3216] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3217] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3218] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3219] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3220] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3221] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3222] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3223] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3224] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3225] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3226] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3227] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3228] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3229] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3230] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3231] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3232] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3233] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3234] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3235] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3236] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3237] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3238] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3239] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3240] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3241] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3242] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3243] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3244] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3245] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3246] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3247] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3248] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3249] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3250] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3251] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3252] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3253] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3254] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3255] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3256] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3257] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3258] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3259] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3260] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3261] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3262] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3263] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3264] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3265] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3266] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3267] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3268] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3269] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3270] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3271] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3272] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3273] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3274] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3275] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3276] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3277] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3278] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3279] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3280] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3281] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3282] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3283] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3284] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3285] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3286] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3287] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3288] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3289] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3290] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3291] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3292] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3293] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3294] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3295] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3296] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3297] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3298] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3299] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3300] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3301] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3302] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3303] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3304] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3305] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3306] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3307] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3308] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3309] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3310] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3311] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3312] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3313] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3314] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3315] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3316] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3317] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3318] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3319] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3320] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3321] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3322] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3323] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3324] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3325] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3326] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3327] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3328] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3329] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3330] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3331] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3332] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3333] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3334] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3335] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3336] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3337] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3338] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3339] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3340] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3341] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3342] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3343] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3344] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3345] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3346] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3347] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3348] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3349] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3350] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3351] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3352] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3353] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3354] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3355] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3356] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3357] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3358] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3359] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3360] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3361] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3362] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3363] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3364] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3365] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3366] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3367] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3368] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3369] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3370] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3371] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3372] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3373] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3374] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3375] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3376] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3377] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3378] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3379] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3380] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3381] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3382] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3383] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3384] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3385] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3386] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3387] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3388] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3389] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3390] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3391] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3392] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3393] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3394] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3395] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3396] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3397] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3398] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3399] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3400] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3401] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3402] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3403] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3404] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3405] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3406] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3407] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3408] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3409] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3410] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3411] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3412] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3413] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3414] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3415] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3416] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3417] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3418] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3419] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3420] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3421] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3422] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3423] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3424] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3425] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3426] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3427] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3428] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3429] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3430] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3431] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3432] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3433] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3434] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3435] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3436] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3437] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3438] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3439] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3440] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3441] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3442] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3443] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3444] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3445] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3446] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3447] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3448] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3449] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3450] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3451] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3452] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3453] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3454] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3455] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3456] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3457] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3458] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3459] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3460] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3461] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3462] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3463] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3464] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3465] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3466] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3467] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3468] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3469] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3470] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3471] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3472] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3473] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3474] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3475] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3476] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3477] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3478] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3479] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3480] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3481] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3482] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3483] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3484] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3485] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3486] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3487] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3488] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3489] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3490] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3491] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3492] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3493] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3494] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3495] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3496] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3497] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3498] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3499] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3500] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3501] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3502] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3503] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3504] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3505] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3506] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3507] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3508] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3509] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3510] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3511] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3512] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3513] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3514] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3515] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3516] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3517] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3518] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3519] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3520] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3521] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3522] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3523] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3524] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3525] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3526] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3527] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3528] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3529] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3530] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3531] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3532] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3533] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3534] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3535] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3536] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3537] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3538] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3539] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3540] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3541] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3542] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3543] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3544] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3545] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3546] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3547] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3548] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3549] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3550] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3551] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3552] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3553] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3554] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3555] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3556] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3557] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3558] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3559] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3560] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3561] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3562] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3563] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3564] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3565] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3566] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3567] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3568] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3569] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3570] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3571] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3572] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3573] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3574] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3575] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3576] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3577] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3578] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3579] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3580] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3581] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3582] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3583] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3584] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3585] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3586] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3587] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3588] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3589] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3590] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3591] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3592] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3593] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3594] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3595] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3596] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3597] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3598] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3599] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3600] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3601] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3602] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3603] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3604] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3605] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3606] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3607] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3608] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3609] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3610] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3611] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3612] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3613] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3614] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3615] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3616] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3617] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3618] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3619] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3620] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3621] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3622] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3623] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3624] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3625] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3626] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3627] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3628] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3629] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3630] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3631] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3632] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3633] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3634] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3635] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3636] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3637] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3638] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3639] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3640] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3641] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3642] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3643] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3644] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3645] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3646] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3647] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3648] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3649] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3650] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3651] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3652] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3653] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3654] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3655] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3656] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3657] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3658] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3659] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3660] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3661] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3662] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3663] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3664] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3665] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3666] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3667] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3668] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3669] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3670] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3671] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3672] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3673] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3674] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3675] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3676] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3677] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3678] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3679] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3680] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3681] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3682] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3683] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3684] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3685] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3686] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3687] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3688] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3689] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3690] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3691] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3692] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3693] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3694] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3695] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3696] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3697] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3698] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3699] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3700] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3701] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3702] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3703] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3704] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3705] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3706] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3707] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3708] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3709] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3710] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3711] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3712] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3713] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3714] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3715] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3716] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3717] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3718] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3719] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3720] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3721] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3722] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3723] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3724] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3725] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3726] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3727] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3728] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3729] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3730] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3731] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3732] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3733] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3734] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3735] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3736] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3737] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3738] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3739] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3740] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3741] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3742] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3743] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3744] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3745] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3746] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3747] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3748] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3749] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3750] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3751] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3752] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3753] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3754] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3755] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3756] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3757] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3758] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3759] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3760] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3761] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3762] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3763] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3764] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3765] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3766] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3767] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3768] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3769] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3770] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3771] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3772] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3773] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3774] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3775] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3776] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3777] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3778] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3779] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3780] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3781] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3782] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3783] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3784] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3785] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3786] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3787] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3788] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3789] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3790] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3791] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3792] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3793] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3794] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3795] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3796] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3797] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3798] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3799] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3800] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3801] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3802] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3803] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3804] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3805] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3806] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3807] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3808] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3809] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3810] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3811] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3812] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3813] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3814] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3815] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3816] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3817] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3818] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3819] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3820] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3821] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3822] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3823] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3824] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3825] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3826] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3827] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3828] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3829] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3830] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3831] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3832] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3833] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3834] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3835] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3836] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3837] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3838] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3839] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3840] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3841] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3842] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3843] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3844] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3845] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3846] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3847] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3848] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3849] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3850] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3851] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3852] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3853] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3854] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3855] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3856] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3857] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3858] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3859] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3860] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3861] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3862] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3863] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3864] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3865] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3866] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3867] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3868] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3869] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3870] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3871] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3872] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3873] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3874] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3875] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3876] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3877] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3878] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3879] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3880] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3881] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3882] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3883] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3884] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3885] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3886] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3887] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3888] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3889] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3890] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3891] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3892] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3893] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3894] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3895] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3896] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3897] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3898] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3899] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3900] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3901] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3902] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3903] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3904] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3905] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3906] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3907] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3908] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3909] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3910] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3911] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3912] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3913] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3914] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3915] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3916] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3917] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3918] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3919] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3920] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3921] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3922] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3923] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3924] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3925] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3926] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3927] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3928] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3929] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3930] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3931] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3932] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3933] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3934] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3935] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3936] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3937] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3938] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3939] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[3940] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[3941] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[3942] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[3943] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[3944] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[3945] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[3946] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[3947] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[3948] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[3949] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[3950] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[3951] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[3952] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[3953] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[3954] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[3955] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[3956] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[3957] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[3958] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[3959] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[3960] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[3961] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[3962] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[3963] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[3964] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[3965] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[3966] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[3967] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[3968] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[3969] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[3970] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[3971] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[3972] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[3973] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[3974] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[3975] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[3976] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[3977] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[3978] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[3979] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[3980] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[3981] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[3982] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[3983] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[3984] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[3985] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[3986] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[3987] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[3988] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[3989] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[3990] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[3991] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[3992] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[3993] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[3994] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[3995] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[3996] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[3997] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[3998] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[3999] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4000] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4001] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4002] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4003] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4004] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4005] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4006] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4007] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4008] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4009] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4010] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4011] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4012] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4013] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4014] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4015] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4016] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4017] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4018] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4019] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4020] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4021] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4022] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4023] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4024] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4025] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4026] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4027] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4028] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4029] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4030] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4031] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4032] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4033] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4034] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4035] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4036] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4037] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4038] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4039] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4040] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4041] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4042] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4043] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4044] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4045] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4046] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4047] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4048] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4049] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4050] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4051] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4052] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4053] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4054] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4055] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4056] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4057] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4058] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4059] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4060] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4061] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4062] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4063] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4064] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4065] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4066] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4067] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4068] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4069] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4070] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4071] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4072] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4073] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4074] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4075] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4076] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4077] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4078] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4079] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4080] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4081] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4082] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4083] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4084] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4085] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4086] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4087] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4088] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4089] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4090] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4091] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4092] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4093] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4094] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4095] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4096] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4097] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4098] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4099] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4100] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4101] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4102] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4103] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4104] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4105] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4106] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4107] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4108] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4109] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4110] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4111] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4112] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4113] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4114] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4115] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4116] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4117] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4118] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4119] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4120] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4121] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4122] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4123] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4124] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4125] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4126] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4127] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4128] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4129] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4130] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4131] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4132] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4133] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4134] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4135] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4136] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4137] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4138] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4139] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4140] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4141] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4142] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4143] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4144] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4145] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4146] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4147] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4148] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4149] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4150] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4151] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4152] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4153] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4154] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4155] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4156] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4157] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4158] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4159] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4160] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4161] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4162] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4163] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4164] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4165] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4166] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4167] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4168] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4169] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4170] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4171] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4172] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4173] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4174] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4175] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4176] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4177] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4178] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4179] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4180] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4181] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4182] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4183] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4184] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4185] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4186] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4187] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4188] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4189] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4190] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4191] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4192] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4193] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4194] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4195] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4196] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4197] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4198] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4199] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4200] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4201] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4202] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4203] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4204] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4205] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4206] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4207] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4208] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4209] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4210] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4211] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4212] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4213] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4214] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4215] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4216] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4217] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4218] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4219] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4220] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4221] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4222] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4223] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4224] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4225] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4226] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4227] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4228] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4229] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4230] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4231] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4232] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4233] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4234] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4235] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4236] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4237] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4238] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4239] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4240] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4241] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4242] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4243] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4244] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4245] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4246] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4247] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4248] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4249] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4250] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4251] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4252] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4253] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4254] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4255] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4256] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4257] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4258] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4259] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4260] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4261] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4262] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4263] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4264] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4265] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4266] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4267] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4268] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4269] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4270] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4271] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4272] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4273] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4274] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4275] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4276] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4277] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4278] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4279] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4280] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4281] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4282] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4283] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4284] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4285] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4286] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4287] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4288] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4289] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4290] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4291] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4292] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4293] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4294] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4295] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4296] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4297] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4298] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4299] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4300] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4301] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4302] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4303] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4304] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4305] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4306] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4307] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4308] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4309] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4310] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4311] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4312] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4313] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4314] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4315] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4316] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4317] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4318] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4319] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4320] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4321] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4322] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4323] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4324] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4325] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4326] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4327] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4328] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4329] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4330] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4331] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4332] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4333] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4334] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4335] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4336] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4337] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4338] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4339] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4340] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4341] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4342] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4343] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4344] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4345] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4346] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4347] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4348] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4349] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4350] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4351] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4352] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4353] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4354] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4355] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4356] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4357] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4358] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4359] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4360] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4361] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4362] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4363] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4364] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4365] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4366] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4367] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4368] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4369] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4370] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4371] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4372] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4373] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4374] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4375] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4376] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4377] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4378] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4379] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4380] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4381] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4382] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4383] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4384] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4385] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4386] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4387] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4388] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4389] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4390] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4391] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4392] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4393] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4394] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4395] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4396] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4397] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4398] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4399] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4400] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4401] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4402] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4403] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4404] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4405] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4406] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4407] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4408] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4409] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4410] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4411] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4412] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4413] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4414] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4415] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4416] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4417] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4418] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4419] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4420] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4421] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4422] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4423] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4424] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4425] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4426] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4427] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4428] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4429] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4430] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4431] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4432] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4433] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4434] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4435] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4436] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4437] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4438] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4439] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4440] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4441] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4442] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4443] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4444] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4445] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4446] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4447] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4448] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4449] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4450] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4451] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4452] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4453] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4454] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4455] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4456] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4457] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4458] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4459] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4460] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4461] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4462] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4463] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4464] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4465] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4466] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4467] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4468] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4469] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4470] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4471] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4472] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4473] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4474] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4475] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4476] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4477] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4478] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4479] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4480] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4481] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4482] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4483] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4484] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4485] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4486] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4487] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4488] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4489] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4490] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4491] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4492] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4493] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4494] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4495] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4496] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4497] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4498] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4499] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4500] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4501] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4502] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4503] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4504] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4505] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4506] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4507] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4508] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4509] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4510] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4511] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4512] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4513] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4514] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4515] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4516] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4517] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4518] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4519] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4520] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4521] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4522] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4523] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4524] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4525] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4526] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4527] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4528] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4529] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4530] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4531] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4532] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4533] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4534] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4535] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4536] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4537] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4538] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4539] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4540] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4541] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4542] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4543] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4544] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4545] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4546] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4547] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4548] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4549] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4550] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4551] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4552] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4553] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4554] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4555] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4556] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4557] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4558] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4559] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4560] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4561] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4562] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4563] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4564] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4565] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4566] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4567] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4568] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4569] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4570] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4571] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4572] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4573] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4574] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4575] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4576] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4577] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4578] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4579] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4580] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4581] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4582] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4583] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4584] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4585] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4586] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4587] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4588] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4589] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4590] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4591] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4592] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4593] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4594] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4595] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4596] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4597] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4598] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4599] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4600] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4601] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4602] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4603] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4604] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4605] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4606] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4607] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4608] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4609] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4610] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4611] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4612] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4613] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4614] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4615] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4616] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4617] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4618] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4619] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4620] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4621] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4622] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4623] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4624] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4625] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4626] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4627] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4628] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4629] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4630] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4631] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4632] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4633] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4634] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4635] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4636] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4637] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4638] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4639] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4640] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4641] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4642] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4643] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4644] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4645] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4646] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4647] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4648] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4649] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4650] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4651] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4652] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4653] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4654] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4655] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4656] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4657] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4658] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4659] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4660] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4661] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4662] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4663] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4664] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4665] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4666] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4667] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4668] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4669] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4670] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4671] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4672] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4673] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4674] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4675] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4676] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4677] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4678] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4679] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4680] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4681] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4682] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4683] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4684] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4685] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4686] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4687] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4688] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4689] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4690] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4691] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4692] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4693] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4694] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4695] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4696] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4697] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4698] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4699] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4700] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4701] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4702] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4703] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4704] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4705] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4706] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4707] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4708] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4709] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4710] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4711] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4712] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4713] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4714] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4715] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4716] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4717] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4718] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4719] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4720] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4721] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4722] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4723] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4724] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4725] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4726] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4727] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4728] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4729] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4730] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4731] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4732] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4733] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4734] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4735] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4736] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4737] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4738] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4739] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4740] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4741] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4742] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4743] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4744] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4745] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4746] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4747] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4748] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4749] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4750] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4751] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4752] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4753] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4754] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4755] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4756] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4757] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4758] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4759] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4760] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4761] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4762] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4763] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4764] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4765] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4766] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4767] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4768] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4769] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4770] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4771] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4772] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4773] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4774] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4775] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4776] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4777] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4778] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4779] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4780] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4781] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4782] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4783] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4784] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4785] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4786] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4787] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4788] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4789] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4790] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4791] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4792] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4793] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4794] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4795] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4796] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4797] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4798] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4799] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4800] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4801] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4802] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4803] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4804] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4805] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4806] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4807] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4808] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4809] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4810] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4811] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4812] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4813] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4814] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4815] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4816] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4817] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4818] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4819] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4820] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4821] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4822] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4823] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4824] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4825] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4826] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4827] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4828] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4829] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4830] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4831] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4832] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4833] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4834] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4835] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4836] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4837] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4838] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4839] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4840] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4841] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4842] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4843] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4844] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4845] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4846] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4847] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4848] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4849] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4850] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4851] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4852] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4853] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4854] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4855] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4856] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4857] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4858] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4859] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4860] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4861] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4862] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4863] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4864] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4865] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4866] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4867] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4868] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4869] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4870] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4871] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4872] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4873] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4874] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4875] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4876] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4877] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4878] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4879] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4880] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4881] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4882] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4883] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4884] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4885] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4886] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4887] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4888] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4889] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4890] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4891] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4892] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4893] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4894] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4895] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4896] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4897] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4898] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4899] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4900] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4901] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4902] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4903] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4904] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4905] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4906] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4907] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4908] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4909] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4910] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4911] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4912] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4913] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4914] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4915] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4916] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4917] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4918] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4919] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4920] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4921] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4922] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4923] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4924] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4925] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4926] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4927] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4928] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4929] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4930] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4931] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4932] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4933] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4934] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4935] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4936] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4937] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4938] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4939] processing job batch step=9 +2026-04-07T12:00:20 INFO worker[4940] processing job batch step=0 +2026-04-07T12:00:21 INFO worker[4941] processing job batch step=1 +2026-04-07T12:00:22 INFO worker[4942] processing job batch step=2 +2026-04-07T12:00:23 INFO worker[4943] processing job batch step=3 +2026-04-07T12:00:24 INFO worker[4944] processing job batch step=4 +2026-04-07T12:00:25 INFO worker[4945] processing job batch step=5 +2026-04-07T12:00:26 INFO worker[4946] processing job batch step=6 +2026-04-07T12:00:27 INFO worker[4947] processing job batch step=7 +2026-04-07T12:00:28 INFO worker[4948] processing job batch step=8 +2026-04-07T12:00:29 INFO worker[4949] processing job batch step=9 +2026-04-07T12:00:30 INFO worker[4950] processing job batch step=0 +2026-04-07T12:00:31 INFO worker[4951] processing job batch step=1 +2026-04-07T12:00:32 INFO worker[4952] processing job batch step=2 +2026-04-07T12:00:33 INFO worker[4953] processing job batch step=3 +2026-04-07T12:00:34 INFO worker[4954] processing job batch step=4 +2026-04-07T12:00:35 INFO worker[4955] processing job batch step=5 +2026-04-07T12:00:36 INFO worker[4956] processing job batch step=6 +2026-04-07T12:00:37 INFO worker[4957] processing job batch step=7 +2026-04-07T12:00:38 INFO worker[4958] processing job batch step=8 +2026-04-07T12:00:39 INFO worker[4959] processing job batch step=9 +2026-04-07T12:00:40 INFO worker[4960] processing job batch step=0 +2026-04-07T12:00:41 INFO worker[4961] processing job batch step=1 +2026-04-07T12:00:42 INFO worker[4962] processing job batch step=2 +2026-04-07T12:00:43 INFO worker[4963] processing job batch step=3 +2026-04-07T12:00:44 INFO worker[4964] processing job batch step=4 +2026-04-07T12:00:45 INFO worker[4965] processing job batch step=5 +2026-04-07T12:00:46 INFO worker[4966] processing job batch step=6 +2026-04-07T12:00:47 INFO worker[4967] processing job batch step=7 +2026-04-07T12:00:48 INFO worker[4968] processing job batch step=8 +2026-04-07T12:00:49 INFO worker[4969] processing job batch step=9 +2026-04-07T12:00:50 INFO worker[4970] processing job batch step=0 +2026-04-07T12:00:51 INFO worker[4971] processing job batch step=1 +2026-04-07T12:00:52 INFO worker[4972] processing job batch step=2 +2026-04-07T12:00:53 INFO worker[4973] processing job batch step=3 +2026-04-07T12:00:54 INFO worker[4974] processing job batch step=4 +2026-04-07T12:00:55 INFO worker[4975] processing job batch step=5 +2026-04-07T12:00:56 INFO worker[4976] processing job batch step=6 +2026-04-07T12:00:57 INFO worker[4977] processing job batch step=7 +2026-04-07T12:00:58 INFO worker[4978] processing job batch step=8 +2026-04-07T12:00:59 INFO worker[4979] processing job batch step=9 +2026-04-07T12:00:00 INFO worker[4980] processing job batch step=0 +2026-04-07T12:00:01 INFO worker[4981] processing job batch step=1 +2026-04-07T12:00:02 INFO worker[4982] processing job batch step=2 +2026-04-07T12:00:03 INFO worker[4983] processing job batch step=3 +2026-04-07T12:00:04 INFO worker[4984] processing job batch step=4 +2026-04-07T12:00:05 INFO worker[4985] processing job batch step=5 +2026-04-07T12:00:06 INFO worker[4986] processing job batch step=6 +2026-04-07T12:00:07 INFO worker[4987] processing job batch step=7 +2026-04-07T12:00:08 INFO worker[4988] processing job batch step=8 +2026-04-07T12:00:09 INFO worker[4989] processing job batch step=9 +2026-04-07T12:00:10 INFO worker[4990] processing job batch step=0 +2026-04-07T12:00:11 INFO worker[4991] processing job batch step=1 +2026-04-07T12:00:12 INFO worker[4992] processing job batch step=2 +2026-04-07T12:00:13 INFO worker[4993] processing job batch step=3 +2026-04-07T12:00:14 INFO worker[4994] processing job batch step=4 +2026-04-07T12:00:15 INFO worker[4995] processing job batch step=5 +2026-04-07T12:00:16 INFO worker[4996] processing job batch step=6 +2026-04-07T12:00:17 INFO worker[4997] processing job batch step=7 +2026-04-07T12:00:18 INFO worker[4998] processing job batch step=8 +2026-04-07T12:00:19 INFO worker[4999] processing job batch step=9 +error: connection refused on tcp://10.0.0.1:5432 +error: timeout exceeded waiting for replica sync +FAILED: integration test suite (3 of 248) \ No newline at end of file diff --git a/bench/report.md b/bench/report.md index 67d767a..0a957a1 100644 --- a/bench/report.md +++ b/bench/report.md @@ -1,14 +1,18 @@ FIXTURE BEFORE AFTER REDUCTION LATENCY STATUS ────────────────────────────────────────────────────────────────────────────── docker_logs.txt 665tk 186tk 73% 4ms ✅ -env_dump.txt 441tk 287tk 35% 3ms ✅ -find_deep.txt 424tk 134tk 69% 3ms ✅ +env_dump.txt 441tk 287tk 35% 4ms ✅ +find_deep.txt 424tk 134tk 69% 4ms ✅ git_copilot_session.txt 639tk 421tk 35% 3ms ✅ git_diff.txt 502tk 317tk 37% 3ms ✅ git_log_200.txt 2667tk 819tk 70% 3ms ✅ git_status.txt 50tk 16tk 68% 3ms ✅ -ls_la.txt 1782tk 886tk 51% 4ms ✅ +intensity_budget80.txt 4418tk 52tk 99% 3ms ✅ +ls_la.txt 1782tk 886tk 51% 3ms ✅ +mdcompress_claude_md.txt 316tk 246tk 23% 3ms ✅ +mdcompress_prose.txt 187tk 138tk 27% 3ms ✅ npm_install.txt 524tk 231tk 56% 3ms ✅ ps_aux.txt 40373tk 2352tk 95% 6ms ✅ +summarize_huge.txt 82257tk 47tk 100% 13ms ✅ -PASS: 10/10 FAIL: 0/10 +PASS: 14/14 FAIL: 0/14 diff --git a/bench/run.sh b/bench/run.sh index 1ba7fa4..4bbaf2e 100755 --- a/bench/run.sh +++ b/bench/run.sh @@ -18,6 +18,11 @@ printf '%.0s─' {1..78} >> "$REPORT"; echo >> "$REPORT" for f in "$FIXTURES"/*.txt; do name=$(basename "$f") + # context_crosscall_* fixtures exercise wrap.rs cross-call dedup; they + # are run by bench/run_context.sh, not by filter-mode bench. + case "$name" in + context_crosscall_*) continue ;; + esac input=$(cat "$f") before=$(( ${#input} / 4 )) [ "$before" -eq 0 ] && continue @@ -25,14 +30,24 @@ for f in "$FIXTURES"/*.txt; do # Derive handler hint from fixture name: "git_log_200.txt" → hint="git" hint="${name%%_*}" - t0=$(date +%s%N) - compressed=$(echo "$input" | "$SQUEEZ" filter "$hint" 2>/dev/null || echo "$input") - t1=$(date +%s%N) + # mdcompress_* fixtures use the markdown compressor instead of filter + if [ "$hint" = "mdcompress" ]; then + t0=$(date +%s%N) + compressed=$("$SQUEEZ" compress-md --dry-run --ultra --quiet "$f" 2>/dev/null || cat "$f") + t1=$(date +%s%N) + else + t0=$(date +%s%N) + compressed=$(echo "$input" | "$SQUEEZ" filter "$hint" 2>/dev/null || echo "$input") + t1=$(date +%s%N) + fi ms=$(( (t1 - t0) / 1000000 )) after=$(( ${#compressed} / 4 )) pct=$(( 100 - (after * 100 / before) )) - status="✅"; [ "$pct" -lt 30 ] && { status="❌"; FAIL=$((FAIL+1)); } + # mdcompress fixtures: prose compression is naturally lighter (~15-30%) + threshold=30 + if [ "$hint" = "mdcompress" ]; then threshold=15; fi + status="✅"; [ "$pct" -lt "$threshold" ] && { status="❌"; FAIL=$((FAIL+1)); } [ "$ms" -gt 100 ] && { status="❌ slow"; FAIL=$((FAIL+1)); } TOTAL=$((TOTAL+1)) diff --git a/bench/run_context.sh b/bench/run_context.sh new file mode 100755 index 0000000..a054883 --- /dev/null +++ b/bench/run_context.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash +# bench/run_context.sh — exercises the context engine end-to-end (PR1) +# +# Unlike bench/run.sh (which uses `squeez filter`), this runs `squeez wrap` +# on synthetic commands so the wrap.rs pre/post-pass code path is reached. +# Each test uses an isolated SQUEEZ_DIR so state never leaks. + +set -euo pipefail + +if [ -x "$(dirname "$0")/../target/release/squeez" ]; then + SQUEEZ="$(cd "$(dirname "$0")/.." && pwd)/target/release/squeez" +elif [ -x "$HOME/.claude/squeez/bin/squeez" ]; then + SQUEEZ="$HOME/.claude/squeez/bin/squeez" +else + echo "ERROR: squeez binary not found. Run 'cargo build --release' first." >&2 + exit 1 +fi + +FIXTURES="$(dirname "$0")/fixtures" +FAIL=0 +TOTAL=0 +REPORT="$(dirname "$0")/report_context.md" +: > "$REPORT" + +bench_dir() { + local d + d="$(mktemp -d -t squeez_bench_ctx.XXXXXX)" + mkdir -p "$d/sessions" "$d/memory" + echo "$d" +} + +assert_contains() { + local label=$1 haystack=$2 needle=$3 + if printf '%s' "$haystack" | grep -Fq -- "$needle"; then + echo " ✅ $label" | tee -a "$REPORT" + else + echo " ❌ $label — expected to contain: $needle" | tee -a "$REPORT" + FAIL=$((FAIL + 1)) + fi +} + +assert_not_contains() { + local label=$1 haystack=$2 needle=$3 + if printf '%s' "$haystack" | grep -Fq -- "$needle"; then + echo " ❌ $label — should not contain: $needle" | tee -a "$REPORT" + FAIL=$((FAIL + 1)) + else + echo " ✅ $label" | tee -a "$REPORT" + fi +} + +# ── Test 1: summarize fallback on huge output ───────────────────────────── +echo "## summarize_huge — wrap output >500 lines triggers summary" | tee -a "$REPORT" +TOTAL=$((TOTAL + 1)) +DIR=$(bench_dir) +OUT=$(SQUEEZ_DIR="$DIR" "$SQUEEZ" wrap "cat $FIXTURES/summarize_huge.txt" 2>&1 || true) +LINES=$(printf '%s\n' "$OUT" | wc -l | tr -d ' ') +assert_contains "summary header present" "$OUT" "squeez:summary" +assert_contains "total_lines emitted" "$OUT" "total_lines=" +if [ "$LINES" -le 60 ]; then + echo " ✅ output ≤60 lines (got $LINES)" | tee -a "$REPORT" +else + echo " ❌ output too large: $LINES lines" | tee -a "$REPORT" + FAIL=$((FAIL + 1)) +fi +rm -rf "$DIR" +echo | tee -a "$REPORT" + +# ── Test 2: intensity scaling at >80% budget ───────────────────────────── +echo "## intensity_budget80 — pre-seed total_tokens to force Ultra" | tee -a "$REPORT" +TOTAL=$((TOTAL + 1)) +DIR=$(bench_dir) +# Seed current.json with usage = 90% of default budget (160000 * 5/4 = 200000) +SESSION_FILE="$(date -u +%Y-%m-%d-%H).jsonl" +cat > "$DIR/sessions/current.json" <&1 || true) +assert_contains "header shows adaptive: Ultra" "$OUT" "[adaptive: Ultra]" +rm -rf "$DIR" +echo | tee -a "$REPORT" + +# ── Test 3: cross-call redundancy (3 identical runs) ───────────────────── +echo "## context_crosscall — same output 3x triggers redundancy" | tee -a "$REPORT" +TOTAL=$((TOTAL + 1)) +DIR=$(bench_dir) +OUT1=$(SQUEEZ_DIR="$DIR" "$SQUEEZ" wrap "cat $FIXTURES/context_crosscall_1.txt" 2>&1 || true) +OUT2=$(SQUEEZ_DIR="$DIR" "$SQUEEZ" wrap "cat $FIXTURES/context_crosscall_2.txt" 2>&1 || true) +OUT3=$(SQUEEZ_DIR="$DIR" "$SQUEEZ" wrap "cat $FIXTURES/context_crosscall_3.txt" 2>&1 || true) +assert_not_contains "first call has full output" "$OUT1" "[squeez: identical to" +assert_contains "second call shows redundancy reference" "$OUT2" "[squeez: identical to" +assert_contains "third call shows redundancy reference" "$OUT3" "[squeez: identical to" +rm -rf "$DIR" +echo | tee -a "$REPORT" + +# ── Summary ─────────────────────────────────────────────────────────────── +echo | tee -a "$REPORT" +PASSED=$((TOTAL - FAIL)) +echo "PASS: $PASSED/$TOTAL FAIL: $FAIL/$TOTAL" | tee -a "$REPORT" +[ "$FAIL" -eq 0 ] diff --git a/hooks/copilot-posttooluse.sh b/hooks/copilot-posttooluse.sh index 45060cd..282a49d 100644 --- a/hooks/copilot-posttooluse.sh +++ b/hooks/copilot-posttooluse.sh @@ -33,3 +33,7 @@ except Exception: " 2>/dev/null || echo 0) "$SQUEEZ" track "$tool" "$size" 2>/dev/null || true + +# Also feed the raw JSON to track-result so non-Bash tool outputs +# (Read, Grep, LS, Glob) update SessionContext for cross-call dedup. +printf '%s' "$input" | "$SQUEEZ" track-result "$tool" 2>/dev/null || true diff --git a/hooks/posttooluse.sh b/hooks/posttooluse.sh index 548a32a..06e2af9 100755 --- a/hooks/posttooluse.sh +++ b/hooks/posttooluse.sh @@ -31,3 +31,7 @@ except Exception: " 2>/dev/null || echo 0) "$SQUEEZ" track "$tool" "$size" 2>/dev/null || true + +# Also feed the raw JSON to track-result so non-Bash tool outputs +# (Read, Grep, LS, Glob) update SessionContext for cross-call dedup. +printf '%s' "$input" | "$SQUEEZ" track-result "$tool" 2>/dev/null || true diff --git a/install.sh b/install.sh index a3d6078..6667d0c 100644 --- a/install.sh +++ b/install.sh @@ -17,18 +17,23 @@ case "$OS" in *) echo "ERROR: unsupported arch $ARCH" >&2; exit 1 ;; esac ;; - Windows*|MINGW*|CYGWIN*) - echo "ERROR: Windows não é suportado. Use macOS ou Linux." >&2 - exit 1 + Windows*|MINGW*|MSYS*|CYGWIN*) + BINARY="squeez-windows-x86_64.exe" ;; *) echo "ERROR: unsupported OS $OS" >&2; exit 1 ;; esac +# Local binary name: squeez.exe on Windows, squeez elsewhere +case "$OS" in + Windows*|MINGW*|MSYS*|CYGWIN*) BIN_NAME="squeez.exe" ;; + *) BIN_NAME="squeez" ;; +esac + mkdir -p "$INSTALL_DIR/bin" "$INSTALL_DIR/hooks" "$INSTALL_DIR/sessions" "$INSTALL_DIR/memory" -chmod 700 "$INSTALL_DIR" "$INSTALL_DIR/sessions" "$INSTALL_DIR/memory" +chmod 700 "$INSTALL_DIR" "$INSTALL_DIR/sessions" "$INSTALL_DIR/memory" 2>/dev/null || true echo "Downloading squeez binary for $OS/$ARCH..." -curl -fsSL "$RELEASES/$BINARY" -o "$INSTALL_DIR/bin/squeez" +curl -fsSL "$RELEASES/$BINARY" -o "$INSTALL_DIR/bin/$BIN_NAME" echo "Verifying checksum..." curl -fsSL "$RELEASES/checksums.sha256" -o /tmp/squeez-checksums.sha256 @@ -36,25 +41,25 @@ expected=$(grep "$BINARY" /tmp/squeez-checksums.sha256 2>/dev/null | awk '{print rm -f /tmp/squeez-checksums.sha256 if [ -z "$expected" ]; then echo "ERROR: could not find checksum for $BINARY in release" >&2 - rm -f "$INSTALL_DIR/bin/squeez" + rm -f "$INSTALL_DIR/bin/$BIN_NAME" exit 1 fi -# Use sha256sum if available (Linux), otherwise fall back to shasum (macOS) +# Use sha256sum if available (Linux/Windows Git Bash), otherwise fall back to shasum (macOS) if command -v sha256sum >/dev/null 2>&1; then - actual=$(sha256sum "$INSTALL_DIR/bin/squeez" | awk '{print $1}') + actual=$(sha256sum "$INSTALL_DIR/bin/$BIN_NAME" | awk '{print $1}') else - actual=$(shasum -a 256 "$INSTALL_DIR/bin/squeez" | awk '{print $1}') + actual=$(shasum -a 256 "$INSTALL_DIR/bin/$BIN_NAME" | awk '{print $1}') fi if [ "$expected" != "$actual" ]; then echo "ERROR: checksum mismatch — binary may be corrupted or tampered" >&2 - rm -f "$INSTALL_DIR/bin/squeez" + rm -f "$INSTALL_DIR/bin/$BIN_NAME" exit 1 fi echo "Checksum verified." -chmod +x "$INSTALL_DIR/bin/squeez" +chmod +x "$INSTALL_DIR/bin/$BIN_NAME" 2>/dev/null || true echo "Installing hooks..." curl -fsSL "$REPO_RAW/hooks/pretooluse.sh" -o "$INSTALL_DIR/hooks/pretooluse.sh" @@ -132,8 +137,8 @@ mkdir -p "$COPILOT_SQUEEZ_DIR/bin" "$COPILOT_SQUEEZ_DIR/hooks" \ chmod 700 "$COPILOT_SQUEEZ_DIR" "$COPILOT_SQUEEZ_DIR/sessions" "$COPILOT_SQUEEZ_DIR/memory" 2>/dev/null || true # Symlink the same binary so SQUEEZ_DIR-aware calls work -ln -sf "$INSTALL_DIR/bin/squeez" "$COPILOT_SQUEEZ_DIR/bin/squeez" 2>/dev/null || \ - cp "$INSTALL_DIR/bin/squeez" "$COPILOT_SQUEEZ_DIR/bin/squeez" +ln -sf "$INSTALL_DIR/bin/$BIN_NAME" "$COPILOT_SQUEEZ_DIR/bin/$BIN_NAME" 2>/dev/null || \ + cp "$INSTALL_DIR/bin/$BIN_NAME" "$COPILOT_SQUEEZ_DIR/bin/$BIN_NAME" curl -fsSL "$REPO_RAW/hooks/copilot-pretooluse.sh" -o "$INSTALL_DIR/hooks/copilot-pretooluse.sh" curl -fsSL "$REPO_RAW/hooks/copilot-session-start.sh" -o "$INSTALL_DIR/hooks/copilot-session-start.sh" @@ -143,7 +148,7 @@ chmod +x "$INSTALL_DIR/hooks/copilot-pretooluse.sh" \ "$INSTALL_DIR/hooks/copilot-posttooluse.sh" # Seed Copilot instructions (writes ~/.copilot/copilot-instructions.md) -"$INSTALL_DIR/bin/squeez" init --copilot 2>/dev/null || true +"$INSTALL_DIR/bin/$BIN_NAME" init --copilot 2>/dev/null || true # Register hooks in ~/.copilot/settings.json (Copilot CLI hook format mirrors Claude Code) if [ -d "$HOME/.copilot" ]; then @@ -183,7 +188,7 @@ os.replace(tmp, path) COPILOT_EOF fi -version=$("$INSTALL_DIR/bin/squeez" --version 2>/dev/null || echo "squeez") +version=$("$INSTALL_DIR/bin/$BIN_NAME" --version 2>/dev/null || echo "squeez") echo "✅ $version installed." echo "" echo "Claude Code: Restart Claude Code to activate." diff --git a/src/commands/compress_md.rs b/src/commands/compress_md.rs new file mode 100644 index 0000000..7469b07 --- /dev/null +++ b/src/commands/compress_md.rs @@ -0,0 +1,895 @@ +// Pure-Rust caveman-style markdown compressor. +// No LLM calls. Preserves code blocks, URLs, headings, file paths, tables. +// Compresses natural-language prose only. + +use std::path::{Path, PathBuf}; + +use crate::session::home_dir; + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum Mode { + Full, + Ultra, +} + +#[derive(Debug, Clone, Default)] +pub struct Stats { + pub orig_bytes: usize, + pub new_bytes: usize, + pub orig_code_blocks: usize, + pub new_code_blocks: usize, + pub orig_urls: usize, + pub new_urls: usize, + pub orig_headings: usize, + pub new_headings: usize, +} + +#[derive(Debug, Clone)] +pub struct CompressResult { + pub output: String, + pub stats: Stats, + pub safe: bool, +} + +// ── CLI entry ────────────────────────────────────────────────────────────── + +pub fn run(args: &[String]) -> i32 { + let mut mode = Mode::Full; + let mut dry_run = false; + let mut all = false; + let mut quiet = false; + let mut targets: Vec = Vec::new(); + + for a in args { + match a.as_str() { + "--ultra" => mode = Mode::Ultra, + "--dry-run" => dry_run = true, + "--all" => all = true, + "--quiet" => quiet = true, + "-h" | "--help" => { + print_help(); + return 0; + } + s if s.starts_with("--") => { + eprintln!("squeez compress-md: unknown flag {}", s); + return 2; + } + s => targets.push(s.to_string()), + } + } + + let files: Vec = if all { + all_targets() + } else if targets.is_empty() { + eprintln!("squeez compress-md: no files given (use --all or pass paths)"); + return 2; + } else { + targets.iter().map(PathBuf::from).collect() + }; + + let mut had_error = false; + let mut any_processed = false; + + for f in &files { + if !f.exists() { + if !all && !quiet { + eprintln!("squeez compress-md: not found: {}", f.display()); + } + continue; + } + any_processed = true; + match process_file(f, mode, dry_run, quiet) { + Ok(()) => {} + Err(e) => { + eprintln!("squeez compress-md: {} — {}", f.display(), e); + had_error = true; + } + } + } + + if !any_processed && all && !quiet { + eprintln!("squeez compress-md: no markdown files found in known locations"); + } + + if had_error { + 1 + } else { + 0 + } +} + +/// Quiet bulk-compression entry used by `init` when auto_compress_md=true. +/// Never errors out the caller; failures are silent. +pub fn run_all_quietly() -> i32 { + let files = all_targets(); + for f in &files { + if !f.exists() { + continue; + } + let _ = process_file(f, Mode::Ultra, false, true); + } + 0 +} + +fn print_help() { + println!("squeez compress-md — pure-Rust markdown prose compressor"); + println!(); + println!("Usage:"); + println!(" squeez compress-md [--ultra] [--dry-run] ..."); + println!(" squeez compress-md [--ultra] [--dry-run] --all"); + println!(); + println!("Flags:"); + println!(" --ultra Aggressive abbreviations (with→w/, function→fn, ...)"); + println!(" --dry-run Print compressed text to stdout, do not write"); + println!(" --all Walk known locations: ~/.claude/CLAUDE.md,"); + println!(" ~/.copilot/copilot-instructions.md,"); + println!(" $PWD/CLAUDE.md, $PWD/AGENTS.md,"); + println!(" $PWD/.github/copilot-instructions.md"); + println!(" --quiet Suppress informational output"); + println!(); + println!("Preserved verbatim: code blocks (```...```), inline `code`,"); + println!("URLs, file paths, headings, tables, list markers, version numbers."); + println!(); + println!("Backups are written to .original.md and never overwritten."); +} + +fn all_targets() -> Vec { + let home = home_dir(); + let mut v = vec![ + PathBuf::from(format!("{}/.claude/CLAUDE.md", home)), + PathBuf::from(format!("{}/.copilot/copilot-instructions.md", home)), + ]; + if let Ok(cwd) = std::env::current_dir() { + v.push(cwd.join("CLAUDE.md")); + v.push(cwd.join("AGENTS.md")); + v.push(cwd.join(".github/copilot-instructions.md")); + } + v +} + +fn process_file(path: &Path, mode: Mode, dry_run: bool, quiet: bool) -> Result<(), String> { + let original = std::fs::read_to_string(path).map_err(|e| e.to_string())?; + let result = compress_text(&original, mode); + + if !result.safe { + return Err(format!( + "integrity check failed (code_blocks {}→{}, urls {}→{}, headings {}→{}, bytes {}→{})", + result.stats.orig_code_blocks, + result.stats.new_code_blocks, + result.stats.orig_urls, + result.stats.new_urls, + result.stats.orig_headings, + result.stats.new_headings, + result.stats.orig_bytes, + result.stats.new_bytes, + )); + } + + let pct = if result.stats.orig_bytes > 0 { + 100usize.saturating_sub(result.stats.new_bytes * 100 / result.stats.orig_bytes) + } else { + 0 + }; + + if dry_run { + print!("{}", result.output); + if !quiet { + eprintln!( + "# squeez compress-md (dry-run) {} {}→{} bytes (-{}%)", + path.display(), + result.stats.orig_bytes, + result.stats.new_bytes, + pct + ); + } + return Ok(()); + } + + // Skip if already at-or-below target — backup may exist from a prior run. + if result.stats.new_bytes >= result.stats.orig_bytes { + if !quiet { + eprintln!( + "squeez compress-md: {} already compressed (no further reduction)", + path.display() + ); + } + return Ok(()); + } + + // Backup once. Never clobber. + let backup = backup_path(path); + if !backup.exists() { + std::fs::write(&backup, &original).map_err(|e| e.to_string())?; + } + + std::fs::write(path, &result.output).map_err(|e| e.to_string())?; + + if !quiet { + eprintln!( + "squeez compress-md: {} {}→{} bytes (-{}%)", + path.display(), + result.stats.orig_bytes, + result.stats.new_bytes, + pct + ); + } + Ok(()) +} + +fn backup_path(p: &Path) -> PathBuf { + let stem = p.file_stem().and_then(|s| s.to_str()).unwrap_or("file"); + let parent = p.parent().unwrap_or_else(|| Path::new(".")); + parent.join(format!("{}.original.md", stem)) +} + +// ── Core compression ─────────────────────────────────────────────────────── + +#[derive(Eq, PartialEq)] +enum State { + Text, + FencedCode, + Table, +} + +pub fn compress_text(input: &str, mode: Mode) -> CompressResult { + let mut stats = Stats::default(); + stats.orig_bytes = input.len(); + stats.orig_code_blocks = count_code_blocks(input); + stats.orig_urls = count_urls(input); + stats.orig_headings = count_headings(input); + + let mut out = String::with_capacity(input.len()); + let mut state = State::Text; + + let lines: Vec<&str> = input.split('\n').collect(); + let mut i = 0; + while i < lines.len() { + let line = lines[i]; + match state { + State::FencedCode => { + out.push_str(line); + out.push('\n'); + if line.trim_start().starts_with("```") { + state = State::Text; + } + i += 1; + } + State::Table => { + if is_table_row(line) { + out.push_str(line); + out.push('\n'); + i += 1; + } else { + state = State::Text; + // reprocess this line as Text without advancing i + } + } + State::Text => { + if line.trim_start().starts_with("```") { + out.push_str(line); + out.push('\n'); + state = State::FencedCode; + i += 1; + } else if is_table_row(line) { + out.push_str(line); + out.push('\n'); + state = State::Table; + i += 1; + } else if is_protected_line(line) { + out.push_str(line); + out.push('\n'); + i += 1; + } else { + let compressed = compress_prose_line(line, mode); + out.push_str(&compressed); + out.push('\n'); + i += 1; + } + } + } + } + + // Strip trailing newline introduced by split('\n') if input didn't end with one. + if !input.ends_with('\n') && out.ends_with('\n') { + out.pop(); + } + + let collapsed = collapse_blank_runs(&out); + + stats.new_bytes = collapsed.len(); + stats.new_code_blocks = count_code_blocks(&collapsed); + stats.new_urls = count_urls(&collapsed); + stats.new_headings = count_headings(&collapsed); + + let safe = stats.new_code_blocks == stats.orig_code_blocks + && stats.new_urls >= stats.orig_urls + && stats.new_headings == stats.orig_headings + && stats.new_bytes * 5 >= stats.orig_bytes; // not >80% reduction + + CompressResult { + output: collapsed, + stats, + safe, + } +} + +// ── Helpers: classification ──────────────────────────────────────────────── + +fn is_table_row(s: &str) -> bool { + let t = s.trim_start(); + t.starts_with('|') && t[1..].contains('|') +} + +fn is_protected_line(s: &str) -> bool { + let t = s.trim_start(); + t.is_empty() + || t.starts_with('#') + || t.starts_with("\n"); // Strip previous squeez block if present @@ -122,13 +134,25 @@ pub fn run_with_dirs(sessions_dir: &Path, memory_dir: &Path, config: &Config) -> let summaries = memory::read_last_n(memory_dir, 3); println!("─── squeez active ─────────────────────────────────────────"); println!( - "Context budget: ~{}K tokens | Compression: ON | Memory: ON", - budget_k + "Context budget: ~{}K tokens | Compression: ON | Memory: ON | Persona: {}", + budget_k, + persona::as_str(config.persona) ); for s in &summaries { println!("{}", s.display_line()); } + let persona_text = persona::text(config.persona); + if !persona_text.is_empty() { + println!(); + print!("{}", persona_text); + } println!("────────────────────────────────────────────────────────────"); + + // 5. Auto-compress known memory files (idempotent — backup is never clobbered) + if config.auto_compress_md { + let _ = compress_md::run_all_quietly(); + } + 0 } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 4208ad0..2202cd9 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -6,6 +6,8 @@ pub trait Handler { pub mod build; pub mod cloud; +pub mod compress_md; +pub mod data_tool; pub mod database; pub mod docker; pub mod filter_stdin; @@ -14,9 +16,13 @@ pub mod generic; pub mod git; pub mod init; pub mod network; +pub mod persona; pub mod package_mgr; pub mod runtime; pub mod test_runner; +pub mod text_proc; pub mod track; +pub mod track_result; pub mod typescript; +pub mod update; pub mod wrap; diff --git a/src/commands/persona.rs b/src/commands/persona.rs new file mode 100644 index 0000000..0be6f67 --- /dev/null +++ b/src/commands/persona.rs @@ -0,0 +1,92 @@ +// Caveman persona for prompt-side output compression. +// The text is injected by `init.rs` into the session banner (Claude Code) +// and into the block in copilot-instructions.md +// (Copilot CLI). It nudges the agent to produce terser output — +// squeez can't intercept the model's response stream, only suggest. + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum Persona { + Off, + Lite, + Full, + Ultra, +} + +impl Default for Persona { + fn default() -> Self { + // User chose Ultra as the default during PR2 design. + Persona::Ultra + } +} + +pub fn from_str(s: &str) -> Persona { + match s.trim().to_lowercase().as_str() { + "off" | "false" | "0" | "" => Persona::Off, + "lite" => Persona::Lite, + "full" => Persona::Full, + "ultra" => Persona::Ultra, + _ => Persona::default(), + } +} + +pub fn as_str(p: Persona) -> &'static str { + match p { + Persona::Off => "off", + Persona::Lite => "lite", + Persona::Full => "full", + Persona::Ultra => "ultra", + } +} + +const LITE: &str = include_str!("../../assets/persona_lite.md"); +const FULL: &str = include_str!("../../assets/persona_full.md"); +const ULTRA: &str = include_str!("../../assets/persona_ultra.md"); + +pub fn text(p: Persona) -> &'static str { + match p { + Persona::Off => "", + Persona::Lite => LITE, + Persona::Full => FULL, + Persona::Ultra => ULTRA, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn from_str_round_trip() { + for p in [Persona::Off, Persona::Lite, Persona::Full, Persona::Ultra] { + assert_eq!(from_str(as_str(p)), p); + } + } + + #[test] + fn from_str_case_insensitive() { + assert_eq!(from_str("ULTRA"), Persona::Ultra); + assert_eq!(from_str("Lite"), Persona::Lite); + } + + #[test] + fn from_str_unknown_falls_back_to_default() { + assert_eq!(from_str("nonsense"), Persona::default()); + } + + #[test] + fn off_text_is_empty() { + assert!(text(Persona::Off).is_empty()); + } + + #[test] + fn ultra_text_contains_ultra_marker() { + let t = text(Persona::Ultra); + assert!(t.contains("ultra")); + assert!(t.len() > 50); + } + + #[test] + fn default_is_ultra() { + assert_eq!(Persona::default(), Persona::Ultra); + } +} diff --git a/src/commands/text_proc.rs b/src/commands/text_proc.rs new file mode 100644 index 0000000..8b9ea2c --- /dev/null +++ b/src/commands/text_proc.rs @@ -0,0 +1,118 @@ +// Handler for text-processing commands: grep, awk, sed, ripgrep (rg). +// These produce match lines; squeeze groups them by file and deduplicates +// identical match patterns. + +use crate::commands::Handler; +use crate::config::Config; +use crate::strategies::{dedup, truncation}; + +pub struct TextProcHandler; + +impl Handler for TextProcHandler { + fn compress(&self, _cmd: &str, lines: Vec, config: &Config) -> Vec { + // Group consecutive matches from the same file prefix (filename:lineno:match) + let grouped = group_by_file(lines); + let grouped = dedup::apply(grouped, config.dedup_min); + truncation::apply(grouped, config.max_lines.max(20), truncation::Keep::Head) + } +} + +/// Collapse multiple matches from the same file into a single summary block. +/// Input: "src/foo.rs:42: match line" → kept as-is. +/// When the same file appears ≥3 times, emit a summary: "src/foo.rs: N matches". +fn group_by_file(lines: Vec) -> Vec { + use std::collections::HashMap; + + let mut file_count: HashMap = HashMap::new(); + let mut file_order: Vec = Vec::new(); + + for line in &lines { + if let Some(file) = extract_grep_file(line) { + let e = file_count.entry(file.clone()).or_insert(0); + if *e == 0 { + file_order.push(file); + } + *e += 1; + } + } + + // If any file has ≥5 matches, collapse those; otherwise passthrough. + let should_collapse = file_count.values().any(|&n| n >= 5); + if !should_collapse { + return lines; + } + + let mut out: Vec = Vec::new(); + let mut collapsed: std::collections::HashSet = std::collections::HashSet::new(); + + for line in &lines { + if let Some(file) = extract_grep_file(line) { + let count = file_count.get(&file).copied().unwrap_or(0); + if count >= 5 { + if collapsed.insert(file.clone()) { + out.push(format!("{}: {} matches [squeez: collapsed]", file, count)); + } + continue; + } + } + out.push(line.clone()); + } + + // Summary files with <5 matches already added inline. + // Also list any collapsed files we didn't emit yet (edge case). + let _ = file_order; // ordering was used above implicitly via HashMap iteration + out +} + +fn extract_grep_file(line: &str) -> Option { + // Formats: "filename:lineno:content" or "filename:content" or just "filename" + if line.trim().is_empty() || line.starts_with("Binary file") { + return None; + } + // Try "path:digits:..." pattern + let parts: Vec<&str> = line.splitn(3, ':').collect(); + if parts.len() >= 2 && parts[1].parse::().is_ok() { + let p = parts[0]; + if p.contains('.') || p.contains('/') { + return Some(p.to_string()); + } + } + // Try "path:content" (no line number) + if parts.len() >= 2 && (parts[0].contains('/') || parts[0].contains('.')) { + return Some(parts[0].to_string()); + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::config::Config; + + fn grep_lines(file: &str, n: usize) -> Vec { + (0..n) + .map(|i| format!("{}:{}: match content {}", file, i + 1, i)) + .collect() + } + + #[test] + fn collapses_many_matches_from_same_file() { + let mut lines = grep_lines("src/main.rs", 6); + lines.push("other.rs:1:something".into()); + let cfg = Config::default(); + let out = TextProcHandler.compress("grep foo", lines, &cfg); + let collapsed: Vec<_> = out.iter().filter(|l| l.contains("collapsed")).collect(); + assert_eq!(collapsed.len(), 1); + assert!(collapsed[0].contains("src/main.rs")); + assert!(collapsed[0].contains("6 matches")); + } + + #[test] + fn passthrough_when_few_matches() { + let lines = grep_lines("src/main.rs", 3); + let cfg = Config::default(); + let out = TextProcHandler.compress("grep foo", lines.clone(), &cfg); + // 3 < 5, so no collapse — dedup may merge identical lines though + assert!(out.iter().all(|l| !l.contains("collapsed"))); + } +} diff --git a/src/commands/track_result.rs b/src/commands/track_result.rs new file mode 100644 index 0000000..156b6e4 --- /dev/null +++ b/src/commands/track_result.rs @@ -0,0 +1,201 @@ +// PostToolUse hook reads the JSON tool result from stdin and pipes it +// to `squeez track-result `. We extract artifacts (file paths, +// errors) and feed them into the SessionContext so future Bash calls +// can dedup against already-seen state. We do NOT (and cannot) rewrite +// the model's view of the result — Claude Code's PostToolUse only allows +// observation. The win is cross-tool dedup in subsequent calls. + +use std::io::Read; +use std::path::Path; + +use crate::commands::wrap; +use crate::context::cache::SessionContext; +use crate::session; + +const MAX_CONTENT_BYTES: usize = 256 * 1024; + +pub fn run(tool: &str) -> i32 { + let mut buf = String::new(); + if std::io::stdin().read_to_string(&mut buf).is_err() { + return 0; // never block + } + let dir = session::sessions_dir(); + run_with_dir(tool, &buf, &dir) +} + +pub fn run_with_dir(tool: &str, raw: &str, sessions_dir: &Path) -> i32 { + if raw.trim().is_empty() { + return 0; + } + + // Parse minimal JSON via existing helpers (flat keys only). + let file_path = extract_string_field(raw, "file_path"); + let pattern = extract_string_field(raw, "pattern"); + let path_arg = extract_string_field(raw, "path"); + let content = extract_content(raw); + + let mut ctx = SessionContext::load(sessions_dir); + + // Bump the call counter for context tracking; tool calls advance state too. + ctx.next_call_n(); + + // Files: from explicit fields + extracted from content + let mut files: Vec = Vec::new(); + if let Some(p) = file_path { + files.push(p); + } + if let Some(p) = path_arg { + files.push(p); + } + if let Some(content) = content.as_deref() { + let trimmed: String = content.chars().take(MAX_CONTENT_BYTES).collect(); + let mut paths = wrap::extract_file_paths(&trimmed); + files.append(&mut paths); + let errors = wrap::extract_errors(&trimmed); + if !errors.is_empty() { + ctx.note_errors(&errors); + } + } + if let Some(_p) = pattern { + // No-op: pattern alone isn't a file fingerprint, but we may want + // to log it as a tool_artifacts event in the session log. + } + + if !files.is_empty() { + ctx.note_files(&files); + } + + // Track tokens consumed by this tool call (estimate from content length) + if let Some(ref c) = content { + let tokens = (c.len() / 4) as u64; + if tokens > 0 { + ctx.note_tool_tokens(tool, tokens); + } + } + + ctx.save(sessions_dir); + 0 +} + +/// Extract a string value from the raw input, scanning the whole document +/// for any `"key":"value"` occurrence (nested or flat). +fn extract_string_field(raw: &str, key: &str) -> Option { + let pat = format!("\"{}\":", key); + let mut rest = raw; + while let Some(idx) = rest.find(&pat) { + let after = &rest[idx + pat.len()..]; + let after = after.trim_start(); + if let Some(stripped) = after.strip_prefix('"') { + // simple string value + if let Some(end) = stripped.find('"') { + let val = &stripped[..end]; + if !val.is_empty() { + return Some(val.to_string()); + } + } + } + rest = &rest[idx + pat.len()..]; + } + None +} + +/// Extract `tool_result.content` (or top-level `content`) as a single string. +/// Handles both `"content":"…"` and `"content":[{"type":"text","text":"…"}]`. +fn extract_content(raw: &str) -> Option { + // Try plain string first + if let Some(s) = extract_string_field(raw, "content") { + if !s.trim().is_empty() { + return Some(unescape(&s)); + } + } + // Try `"text":"…"` (Anthropic content-block format) + let mut out = String::new(); + let mut rest = raw; + while let Some(idx) = rest.find("\"text\":") { + let after = &rest[idx + 7..]; + let after = after.trim_start(); + if let Some(stripped) = after.strip_prefix('"') { + if let Some(end) = stripped.find('"') { + out.push_str(&unescape(&stripped[..end])); + out.push('\n'); + } + } + rest = &rest[idx + 7..]; + } + if out.is_empty() { + None + } else { + Some(out) + } +} + +fn unescape(s: &str) -> String { + s.replace("\\n", "\n") + .replace("\\t", "\t") + .replace("\\\"", "\"") + .replace("\\\\", "\\") +} + +#[cfg(test)] +mod tests { + use super::*; + + fn tmp() -> std::path::PathBuf { + let d = std::env::temp_dir().join(format!( + "squeez_track_result_{}", + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .subsec_nanos() + )); + std::fs::create_dir_all(&d).unwrap(); + d + } + + #[test] + fn read_input_records_file_path() { + let dir = tmp(); + let json = r#"{"tool_name":"Read","tool_input":{"file_path":"/tmp/foo.rs"},"tool_result":{"content":"some content"}}"#; + let rc = run_with_dir("Read", json, &dir); + assert_eq!(rc, 0); + let ctx = SessionContext::load(&dir); + assert!(ctx.seen_files.iter().any(|f| f.path == "/tmp/foo.rs")); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn grep_input_no_panic_on_pattern() { + let dir = tmp(); + let json = r#"{"tool_name":"Grep","tool_input":{"pattern":"fn main","glob":"*.rs"}}"#; + assert_eq!(run_with_dir("Grep", json, &dir), 0); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn malformed_json_exits_zero() { + let dir = tmp(); + assert_eq!(run_with_dir("Read", "not json at all", &dir), 0); + assert_eq!(run_with_dir("Read", "", &dir), 0); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn extracts_errors_from_content() { + let dir = tmp(); + let json = r#"{"tool_name":"Read","tool_input":{"file_path":"/tmp/x.log"},"tool_result":{"content":"error: cannot find symbol\nok line"}}"#; + run_with_dir("Read", json, &dir); + let ctx = SessionContext::load(&dir); + assert!(!ctx.seen_errors.is_empty()); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn extracts_paths_from_content_body() { + let dir = tmp(); + let json = r#"{"tool_name":"Bash","tool_result":{"content":"modified: src/main.rs\nmodified: src/lib.rs"}}"#; + run_with_dir("Bash", json, &dir); + let ctx = SessionContext::load(&dir); + assert!(ctx.seen_files.iter().any(|f| f.path == "src/main.rs")); + let _ = std::fs::remove_dir_all(&dir); + } +} diff --git a/src/commands/update.rs b/src/commands/update.rs new file mode 100644 index 0000000..5a92695 --- /dev/null +++ b/src/commands/update.rs @@ -0,0 +1,358 @@ +// `squeez update` — self-updater. Zero-dep: shells out to `curl` and +// `sha256sum` / `shasum -a 256` (both already required by install.sh). + +use std::path::{Path, PathBuf}; +use std::process::Command; + +use crate::json_util; +use crate::session::home_dir; + +const REPO: &str = "claudioemmanuel/squeez"; + +pub fn run(args: &[String]) -> i32 { + let mut check_only = false; + let mut insecure = false; + for a in args { + match a.as_str() { + "--check" => check_only = true, + "--insecure" => insecure = true, + "-h" | "--help" => { + print_help(); + return 0; + } + other => { + eprintln!("squeez update: unknown flag {}", other); + return 2; + } + } + } + + let current = current_version(); + + let latest = match fetch_latest_tag() { + Ok(t) => t, + Err(e) => { + eprintln!("squeez update: failed to fetch latest release: {}", e); + return 1; + } + }; + + let latest_clean = latest.trim_start_matches('v'); + if latest_clean == current { + println!("squeez {}: already up to date", current); + return 0; + } + + if check_only { + println!("squeez update: {} → {}", current, latest_clean); + return 0; + } + + let target = detect_target(); + let asset_name = asset_name_for(target); + let base = base_url(); + let asset_url = format!("{}/releases/download/{}/{}", base, latest, asset_name); + let sha_url = format!("{}/releases/download/{}/checksums.sha256", base, latest); + + println!("squeez update: downloading {}...", asset_name); + let bytes = match curl(&asset_url) { + Ok(b) => b, + Err(e) => { + eprintln!("squeez update: download failed: {}", e); + return 1; + } + }; + + if !insecure { + let sha_text = match curl(&sha_url) { + Ok(b) => String::from_utf8_lossy(&b).into_owned(), + Err(e) => { + eprintln!("squeez update: failed to fetch checksums: {}", e); + return 1; + } + }; + let expected = match find_expected_sha(&sha_text, &asset_name) { + Some(s) => s, + None => { + eprintln!("squeez update: no checksum entry for {}", asset_name); + return 1; + } + }; + if !verify_sha256(&bytes, &expected) { + eprintln!("squeez update: SHA256 mismatch — refusing to install"); + return 1; + } + println!("squeez update: SHA256 ok"); + } else { + eprintln!("squeez update: --insecure: skipping checksum verification"); + } + + let target_path = install_target_path(); + if let Err(e) = install_atomic(&bytes, &target_path) { + eprintln!("squeez update: install failed: {}", e); + return 1; + } + + println!("squeez update: installed {} → {}", current, latest_clean); + 0 +} + +fn print_help() { + println!("squeez update — self-update from GitHub releases"); + println!(); + println!("Usage:"); + println!(" squeez update Download and install latest"); + println!(" squeez update --check Report whether an update is available"); + println!(" squeez update --insecure Skip SHA256 verification (NOT recommended)"); +} + +pub fn current_version() -> &'static str { + env!("CARGO_PKG_VERSION") +} + +fn base_url() -> String { + if let Ok(o) = std::env::var("SQUEEZ_UPDATE_URL_OVERRIDE") { + return o; + } + format!("https://github.com/{}", REPO) +} + +fn api_base() -> String { + if let Ok(o) = std::env::var("SQUEEZ_UPDATE_API_OVERRIDE") { + return o; + } + format!("https://api.github.com/repos/{}", REPO) +} + +pub fn detect_target() -> &'static str { + if cfg!(target_os = "macos") { + "macos-universal" + } else if cfg!(target_os = "linux") && cfg!(target_arch = "x86_64") { + "linux-x86_64" + } else if cfg!(target_os = "linux") && cfg!(target_arch = "aarch64") { + "linux-aarch64" + } else if cfg!(target_os = "windows") { + "windows-x86_64" + } else { + "unknown" + } +} + +fn asset_name_for(target: &str) -> String { + if target == "windows-x86_64" { + format!("squeez-{}.exe", target) + } else { + format!("squeez-{}", target) + } +} + +fn install_target_path() -> PathBuf { + let dir = format!("{}/.claude/squeez/bin", home_dir()); + PathBuf::from(dir).join(if cfg!(windows) { "squeez.exe" } else { "squeez" }) +} + +// ── Network ──────────────────────────────────────────────────────────────── + +fn fetch_latest_tag() -> Result { + // Try /releases/latest API endpoint first. + let url = format!("{}/releases/latest", api_base()); + let body = curl(&url)?; + let s = String::from_utf8_lossy(&body); + if let Some(tag) = json_util::extract_str(&s, "tag_name") { + return Ok(tag); + } + // Fallback for file:// overrides used in tests + if let Some(tag) = s.lines().find(|l| l.starts_with("v")).map(String::from) { + return Ok(tag.trim().to_string()); + } + Err("no tag_name in release JSON".to_string()) +} + +pub fn curl(url: &str) -> Result, String> { + let out = Command::new("curl") + .args(["-fsSL", "-A", "squeez-update", url]) + .output() + .map_err(|e| format!("curl spawn: {}", e))?; + if !out.status.success() { + return Err(format!( + "curl exit {}: {}", + out.status.code().unwrap_or(-1), + String::from_utf8_lossy(&out.stderr).trim() + )); + } + Ok(out.stdout) +} + +// ── SHA256 verification ──────────────────────────────────────────────────── + +pub fn find_expected_sha(text: &str, filename: &str) -> Option { + for line in text.lines() { + let line = line.trim(); + if line.is_empty() || line.starts_with('#') { + continue; + } + // Format: " " + let mut parts = line.split_whitespace(); + let hash = parts.next()?; + let name = parts.next()?; + if name.ends_with(filename) || name == filename { + return Some(hash.to_string()); + } + } + None +} + +pub fn verify_sha256(bytes: &[u8], expected_hex: &str) -> bool { + if let Some(actual) = compute_sha256(bytes) { + actual.eq_ignore_ascii_case(expected_hex) + } else { + false + } +} + +fn compute_sha256(bytes: &[u8]) -> Option { + // Try sha256sum then shasum -a 256 + for (cmd, args) in [ + ("sha256sum", vec![]), + ("shasum", vec!["-a", "256"]), + ] { + if let Some(hash) = run_hasher(cmd, &args, bytes) { + return Some(hash); + } + } + None +} + +fn run_hasher(cmd: &str, args: &[&str], input: &[u8]) -> Option { + use std::io::Write; + let mut child = Command::new(cmd) + .args(args) + .stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::null()) + .spawn() + .ok()?; + if let Some(stdin) = child.stdin.as_mut() { + stdin.write_all(input).ok()?; + } + let out = child.wait_with_output().ok()?; + if !out.status.success() { + return None; + } + let s = String::from_utf8_lossy(&out.stdout); + s.split_whitespace().next().map(|h| h.to_string()) +} + +// ── Install ──────────────────────────────────────────────────────────────── + +pub fn install_atomic(bytes: &[u8], target: &Path) -> Result<(), String> { + let parent = target.parent().ok_or("target has no parent")?; + std::fs::create_dir_all(parent).map_err(|e| e.to_string())?; + let staging = parent.join(format!( + "{}.new", + target.file_name().and_then(|s| s.to_str()).unwrap_or("squeez") + )); + std::fs::write(&staging, bytes).map_err(|e| format!("write staging: {}", e))?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + std::fs::set_permissions(&staging, std::fs::Permissions::from_mode(0o755)) + .map_err(|e| e.to_string())?; + } + #[cfg(unix)] + { + std::fs::rename(&staging, target).map_err(|e| format!("rename: {}", e))?; + } + #[cfg(windows)] + { + // On Windows the running .exe cannot be renamed. Leave .new in place + // and ask the user to move it manually (or rely on a wrapper script). + eprintln!( + "squeez update: wrote {} — Windows cannot replace a running .exe.", + staging.display() + ); + eprintln!( + " Run: move /Y \"{}\" \"{}\"", + staging.display(), + target.display() + ); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn detect_target_returns_known() { + let t = detect_target(); + assert!(matches!( + t, + "macos-universal" | "linux-x86_64" | "linux-aarch64" | "windows-x86_64" + )); + } + + #[test] + fn asset_name_windows_has_exe() { + assert!(asset_name_for("windows-x86_64").ends_with(".exe")); + assert!(!asset_name_for("linux-x86_64").ends_with(".exe")); + } + + #[test] + fn find_expected_sha_parses_standard_format() { + let text = "abc123 squeez-linux-x86_64\nf00d squeez-macos-universal\n"; + assert_eq!( + find_expected_sha(text, "squeez-linux-x86_64"), + Some("abc123".to_string()) + ); + assert_eq!( + find_expected_sha(text, "squeez-macos-universal"), + Some("f00d".to_string()) + ); + assert_eq!(find_expected_sha(text, "squeez-windows-x86_64.exe"), None); + } + + #[test] + fn find_expected_sha_skips_blank_and_comments() { + let text = "# header\n\nabcd squeez-x\n"; + assert_eq!(find_expected_sha(text, "squeez-x"), Some("abcd".to_string())); + } + + #[test] + fn verify_sha256_known_vector() { + // sha256("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad + let ok = verify_sha256( + b"abc", + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + ); + // Skip on systems without shasum/sha256sum + if compute_sha256(b"abc").is_some() { + assert!(ok); + } + } + + #[test] + fn verify_sha256_mismatch_returns_false() { + if compute_sha256(b"x").is_some() { + assert!(!verify_sha256(b"x", "0000000000000000000000000000000000000000000000000000000000000000")); + } + } + + #[test] + fn install_atomic_writes_target() { + let dir = std::env::temp_dir().join(format!( + "squeez_update_test_{}", + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .subsec_nanos() + )); + std::fs::create_dir_all(&dir).unwrap(); + let target = dir.join("squeez"); + install_atomic(b"#!/bin/sh\necho test\n", &target).unwrap(); + let content = std::fs::read(&target).unwrap(); + assert_eq!(content, b"#!/bin/sh\necho test\n"); + let _ = std::fs::remove_dir_all(&dir); + } +} diff --git a/src/commands/wrap.rs b/src/commands/wrap.rs index 8efcf40..8f10aaf 100644 --- a/src/commands/wrap.rs +++ b/src/commands/wrap.rs @@ -1,16 +1,37 @@ use crate::config::Config; +use crate::context; use crate::filter; use crate::{json_util, session}; use std::io::Read; -use std::os::unix::process::CommandExt; use std::process::{Command, Stdio}; +#[cfg(unix)] use std::sync::atomic::{AtomicI32, Ordering}; use std::thread; use std::time::{Duration, Instant}; +#[cfg(unix)] static CHILD_PID: AtomicI32 = AtomicI32::new(-1); +/// Returns a `Command` pre-configured to run `cmd` through the platform shell. +/// Unix/Git Bash: `sh -c ` +/// Windows native: `cmd /C ` +fn shell_command(cmd: &str) -> Command { + #[cfg(windows)] + { + let mut c = Command::new("cmd"); + c.args(["/C", cmd]); + c + } + #[cfg(not(windows))] + { + let mut c = Command::new("sh"); + c.args(["-c", cmd]); + c + } +} + pub fn run(cmd_str: &str) -> i32 { + #[cfg(unix)] setup_signals(); let config = Config::load(); @@ -18,17 +39,30 @@ pub fn run(cmd_str: &str) -> i32 { return passthrough(cmd_str); } + // ── Context engine pre-pass ──────────────────────────────────────── + let sessions_dir_pp = session::sessions_dir(); + let used_tokens = session::CurrentSession::load(&sessions_dir_pp) + .map(|c| c.total_tokens) + .unwrap_or(0); + let (mut ctx, intensity, eff_cfg) = + context::pre_pass(&config, &sessions_dir_pp, used_tokens); + + // Optional cross-call hint for raw cat/head/tail of seen files + if let Some(hint) = context::cache::raw_read_hint(&ctx, cmd_str) { + println!("{}", hint); + } + let start = Instant::now(); - // Spawn via sh -c to handle pipes, &&, redirections, builtins - let mut child = match Command::new("sh") - .arg("-c") - .arg(cmd_str) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .process_group(0) - .spawn() + // Spawn via platform shell to handle pipes, &&, redirections, builtins + let mut cmd = shell_command(cmd_str); + cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); + #[cfg(unix)] { + use std::os::unix::process::CommandExt; + cmd.process_group(0); + } + let mut child = match cmd.spawn() { Ok(c) => c, Err(e) => { eprintln!("squeez: {}", e); @@ -36,7 +70,8 @@ pub fn run(cmd_str: &str) -> i32 { } }; - // Store PID for signal forwarding + // Store PID for signal forwarding (Unix only) + #[cfg(unix)] CHILD_PID.store(child.id() as i32, Ordering::SeqCst); // Drain stdout/stderr on background threads to prevent pipe-buffer deadlock. @@ -76,10 +111,11 @@ pub fn run(cmd_str: &str) -> i32 { Ok(Some(s)) => break s.code().unwrap_or(1), Ok(None) => { if start.elapsed() >= timeout { + #[cfg(unix)] unsafe { libc::kill(-(child.id() as i32), libc::SIGTERM); + std::thread::sleep(Duration::from_millis(200)); } - std::thread::sleep(Duration::from_millis(200)); let _ = child.kill(); eprintln!("squeez: command timed out after 120s"); let _ = stdout_thread.join(); @@ -109,7 +145,26 @@ pub fn run(cmd_str: &str) -> i32 { let input_tokens = combined.len() / 4; let lines: Vec = combined.lines().map(String::from).collect(); - let compressed = filter::compress(cmd_str, lines, &config); + // ── Summarize fallback for huge outputs (pre-handler) ────────────── + // Decision based on raw line count so handlers can't hide huge inputs. + let mut compressed = if context::summarize::should_apply(&lines, &eff_cfg) { + context::summarize::apply(lines, cmd_str) + } else { + filter::compress(cmd_str, lines, &eff_cfg) + }; + + // ── Redundancy short-circuit ─────────────────────────────────────── + let mut redundancy_hit = false; + if eff_cfg.redundancy_cache_enabled { + if let Some(hit) = context::redundancy::check(&ctx, &compressed) { + compressed = vec![format!( + "[squeez: identical to {} at bash#{} — re-run with --no-squeez]", + hit.short_hash, hit.call_n + )]; + redundancy_hit = true; + } + } + let output_str = compressed.join("\n"); let output_tokens = output_str.len() / 4; @@ -132,9 +187,14 @@ pub fn run(cmd_str: &str) -> i32 { let cmd_name = cmd_str.split_whitespace().next().unwrap_or("cmd"); if config.show_header { + let intensity_tag = if config.adaptive_intensity { + format!(" [adaptive: {}]", intensity.as_str()) + } else { + String::new() + }; println!( - "# squeez [{}] {}→{} tokens (-{}%) {}ms", - cmd_name, input_tokens, output_tokens, reduction, elapsed_ms + "# squeez [{}] {}→{} tokens (-{}%) {}ms{}", + cmd_name, input_tokens, output_tokens, reduction, elapsed_ms, intensity_tag ); if let Some(ref warning) = compact_warning { println!("{}", warning); @@ -144,13 +204,26 @@ pub fn run(cmd_str: &str) -> i32 { println!("{}", output_str); } + // ── Context engine post-pass ─────────────────────────────────────── + if config.context_cache_enabled && !redundancy_hit { + context::redundancy::record(&mut ctx, cmd_str, &compressed); + } else if config.context_cache_enabled { + // still bump the call counter so future calls reference the right index + ctx.next_call_n(); + } + if config.context_cache_enabled { + ctx.note_files(&files); + ctx.note_errors(&errors); + ctx.note_git(&git_events); + ctx.note_tool_tokens("Bash", input_tokens as u64); + ctx.save(&sessions_dir_pp); + } + exit_code } fn passthrough(cmd: &str) -> i32 { - let status = Command::new("sh") - .arg("-c") - .arg(cmd) + let status = shell_command(cmd) .status() .unwrap_or_else(|e| { eprintln!("squeez: {}", e); @@ -166,6 +239,7 @@ fn is_streaming(cmd: &str) -> bool { && cmd.split_whitespace().any(|a| a == "-f" || a == "--follow") } +#[cfg(unix)] fn setup_signals() { unsafe { libc::signal(libc::SIGTERM, forward_signal as *const () as libc::sighandler_t); @@ -173,6 +247,7 @@ fn setup_signals() { } } +#[cfg(unix)] extern "C" fn forward_signal(sig: libc::c_int) { let pid = CHILD_PID.load(Ordering::SeqCst); if pid > 0 { @@ -282,12 +357,15 @@ fn record_bash_event( let budget = config.compact_threshold_tokens * 5 / 4; let pct = current.total_tokens * 100 / budget.max(1); current.compact_warned = true; + // Load context for per-tool breakdown + let ctx = crate::context::cache::SessionContext::load(&dir); Some(format!( - "⚠️ squeez: session ~{}K tokens ({}% of budget). Run /compact to free context.\n Artifacts: {} files touched, {} errors seen.", + "⚠️ squeez: session ~{}K tokens ({}% of budget). Run /compact to free context.\n Token breakdown: Bash {}K | Read {}K | Other {}K", current.total_tokens / 1000, pct, - files.len(), - errors.len(), + ctx.tokens_bash / 1000, + ctx.tokens_read / 1000, + ctx.tokens_other / 1000, )) } else { None diff --git a/src/config.rs b/src/config.rs index bc2d0ee..075ec0a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,3 +1,5 @@ +use crate::commands::persona::Persona; + #[derive(Debug, Clone)] pub struct Config { pub enabled: bool, @@ -11,6 +13,14 @@ pub struct Config { pub bypass: Vec, pub compact_threshold_tokens: u64, pub memory_retention_days: u32, + // ── Context engine flags ──────────────────────────────────────────── + pub adaptive_intensity: bool, + pub context_cache_enabled: bool, + pub redundancy_cache_enabled: bool, + pub summarize_threshold_lines: usize, + // ── Output / memory-file flags ────────────────────────────────────── + pub persona: Persona, + pub auto_compress_md: bool, } impl Default for Config { @@ -30,8 +40,14 @@ impl Default for Config { "mysql".to_string(), "ssh".to_string(), ], - compact_threshold_tokens: 160_000, + compact_threshold_tokens: 120_000, memory_retention_days: 30, + adaptive_intensity: true, + context_cache_enabled: true, + redundancy_cache_enabled: true, + summarize_threshold_lines: 500, + persona: Persona::Ultra, + auto_compress_md: true, } } } @@ -70,6 +86,15 @@ impl Config { "memory_retention_days" => { c.memory_retention_days = v.parse().unwrap_or(c.memory_retention_days) } + "adaptive_intensity" => c.adaptive_intensity = v == "true", + "context_cache_enabled" => c.context_cache_enabled = v == "true", + "redundancy_cache_enabled" => c.redundancy_cache_enabled = v == "true", + "summarize_threshold_lines" => { + c.summarize_threshold_lines = + v.parse().unwrap_or(c.summarize_threshold_lines) + } + "persona" => c.persona = crate::commands::persona::from_str(v), + "auto_compress_md" => c.auto_compress_md = v == "true", _ => {} } } @@ -79,10 +104,7 @@ impl Config { pub fn load() -> Self { let base = std::env::var("SQUEEZ_DIR").unwrap_or_else(|_| { - format!( - "{}/.claude/squeez", - std::env::var("HOME").unwrap_or_default() - ) + format!("{}/.claude/squeez", crate::session::home_dir()) }); let path = format!("{}/config.ini", base); std::fs::read_to_string(&path) diff --git a/src/context/cache.rs b/src/context/cache.rs new file mode 100644 index 0000000..14e41ad --- /dev/null +++ b/src/context/cache.rs @@ -0,0 +1,464 @@ +use std::path::Path; + +use crate::context::hash::{fnv1a_64, short_hex}; +use crate::json_util; + +// ── Bounds ───────────────────────────────────────────────────────────────── + +const MAX_CALL_LOG: usize = 32; +const MAX_SEEN_FILES: usize = 256; +const MAX_SEEN_ERRORS: usize = 128; +const MAX_SEEN_GIT_REFS: usize = 64; + +/// How many recent calls are eligible for redundancy lookup. +pub const RECENT_WINDOW: u64 = 16; + +// ── Data structures ──────────────────────────────────────────────────────── + +#[derive(Debug, Clone)] +pub struct CallEntry { + pub call_n: u64, + pub cmd_short: String, // first 40 chars of cmd + pub output_hash: u64, + pub output_len: usize, + pub short_hash: String, // 8 hex chars +} + +#[derive(Debug, Clone)] +pub struct FileFingerprint { + pub path: String, + pub size_class: u32, // bytes / 4096 + pub last_seen_call: u64, +} + +#[derive(Debug, Default, Clone)] +pub struct SessionContext { + pub session_file: String, + pub call_counter: u64, + pub seen_files: Vec, + pub seen_errors: Vec, // FNV of normalized error + pub seen_git_refs: Vec, // 7-char SHAs + pub call_log: Vec, + /// Cumulative token counts by tool category (Bash, Read, Other) + pub tokens_bash: u64, + pub tokens_read: u64, + pub tokens_other: u64, +} + +// ── Public API ───────────────────────────────────────────────────────────── + +impl SessionContext { + pub fn load(sessions_dir: &Path) -> Self { + let path = sessions_dir.join("context.json"); + let content = match std::fs::read_to_string(&path) { + Ok(s) => s, + Err(_) => return Self::default(), + }; + Self::from_json(&content) + } + + pub fn save(&self, sessions_dir: &Path) { + let _ = std::fs::create_dir_all(sessions_dir); + let path = sessions_dir.join("context.json"); + let json = self.to_json(); + #[cfg(unix)] + { + use std::io::Write; + use std::os::unix::fs::OpenOptionsExt; + if let Ok(mut f) = std::fs::OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .mode(0o600) + .open(&path) + { + let _ = f.write_all(json.as_bytes()); + } + } + #[cfg(not(unix))] + { + let _ = std::fs::write(path, json); + } + } + + pub fn next_call_n(&mut self) -> u64 { + self.call_counter = self.call_counter.saturating_add(1); + self.call_counter + } + + pub fn record_call( + &mut self, + cmd: &str, + output_hash: u64, + output_len: usize, + call_n: u64, + ) { + let short = short_hex(output_hash); + let cmd_short: String = cmd.chars().take(40).collect(); + self.call_log.push(CallEntry { + call_n, + cmd_short, + output_hash, + output_len, + short_hash: short, + }); + if self.call_log.len() > MAX_CALL_LOG { + let drop_n = self.call_log.len() - MAX_CALL_LOG; + self.call_log.drain(0..drop_n); + } + } + + /// Lookup a recent call with matching hash AND output_len. Only considers + /// the last RECENT_WINDOW entries. + pub fn lookup_recent(&self, hash: u64, len: usize) -> Option<&CallEntry> { + let start = self.call_log.len().saturating_sub(RECENT_WINDOW as usize); + self.call_log[start..] + .iter() + .find(|e| e.output_hash == hash && e.output_len == len) + } + + pub fn note_files(&mut self, files: &[String]) { + let call_n = self.call_counter; + for f in files { + if let Some(existing) = self.seen_files.iter_mut().find(|fp| fp.path == *f) { + existing.last_seen_call = call_n; + } else { + self.seen_files.push(FileFingerprint { + path: f.clone(), + size_class: 0, + last_seen_call: call_n, + }); + } + } + if self.seen_files.len() > MAX_SEEN_FILES { + let drop_n = self.seen_files.len() - MAX_SEEN_FILES; + self.seen_files.drain(0..drop_n); + } + } + + pub fn note_errors(&mut self, errors: &[String]) { + for e in errors { + let fp = fnv1a_64(normalize_error(e).as_bytes()); + if !self.seen_errors.contains(&fp) { + self.seen_errors.push(fp); + } + } + if self.seen_errors.len() > MAX_SEEN_ERRORS { + let drop_n = self.seen_errors.len() - MAX_SEEN_ERRORS; + self.seen_errors.drain(0..drop_n); + } + } + + pub fn note_git(&mut self, refs: &[String]) { + for r in refs { + // first 7 chars of any line, if hex + let sha: String = r + .trim() + .chars() + .take(7) + .filter(|c| c.is_ascii_hexdigit()) + .collect(); + if sha.len() == 7 && !self.seen_git_refs.contains(&sha) { + self.seen_git_refs.push(sha); + } + } + if self.seen_git_refs.len() > MAX_SEEN_GIT_REFS { + let drop_n = self.seen_git_refs.len() - MAX_SEEN_GIT_REFS; + self.seen_git_refs.drain(0..drop_n); + } + } + + /// Record token usage by tool category. + pub fn note_tool_tokens(&mut self, tool: &str, tokens: u64) { + match tool.to_lowercase().as_str() { + "bash" => self.tokens_bash = self.tokens_bash.saturating_add(tokens), + "read" => self.tokens_read = self.tokens_read.saturating_add(tokens), + _ => self.tokens_other = self.tokens_other.saturating_add(tokens), + } + } + + pub fn file_was_seen(&self, path: &str) -> Option { + self.seen_files + .iter() + .find(|f| f.path == path) + .map(|f| f.last_seen_call) + } +} + +// ── Cross-call hint ──────────────────────────────────────────────────────── + +/// If `cmd` is a raw read of a file already in context, return a hint line. +/// Recognised: cat, head, tail, less, more, bat. +pub fn raw_read_hint(ctx: &SessionContext, cmd: &str) -> Option { + let mut parts = cmd.trim().split_whitespace(); + let prog = parts.next()?; + let prog = prog.rsplit('/').next().unwrap_or(prog); + if !matches!(prog, "cat" | "head" | "tail" | "less" | "more" | "bat") { + return None; + } + for arg in parts { + if arg.starts_with('-') { + continue; + } + if let Some(call_n) = ctx.file_was_seen(arg) { + return Some(format!( + "# squeez hint: {} already in context (Read tool, call #{}) — consider --no-squeez or skip", + arg, call_n + )); + } + } + None +} + +// ── Error normalization ──────────────────────────────────────────────────── + +/// Normalize an error string before hashing for fingerprinting: +/// lowercase → trim → digit runs → N → /paths → PATH → hex≥6 → HEX → trunc 200. +pub fn normalize_error(s: &str) -> String { + let lower = s.trim().to_lowercase(); + let mut out = String::with_capacity(lower.len()); + let chars: Vec = lower.chars().collect(); + let mut i = 0; + while i < chars.len() { + let c = chars[i]; + // Path: a / followed by non-space chars + if c == '/' { + let mut j = i + 1; + while j < chars.len() && !chars[j].is_whitespace() && chars[j] != '"' { + j += 1; + } + if j > i + 1 { + out.push_str("PATH"); + i = j; + continue; + } + } + // Digit run + if c.is_ascii_digit() { + let mut j = i; + while j < chars.len() && chars[j].is_ascii_digit() { + j += 1; + } + out.push('N'); + i = j; + continue; + } + // Hex run ≥6 chars (after digit check so pure-digit doesn't match) + if c.is_ascii_hexdigit() { + let mut j = i; + while j < chars.len() && chars[j].is_ascii_hexdigit() { + j += 1; + } + if j - i >= 6 { + out.push_str("HEX"); + i = j; + continue; + } + } + out.push(c); + i += 1; + } + out.chars().take(200).collect() +} + +// ── (de)serialization (hand-rolled, parallel arrays) ─────────────────────── + +impl SessionContext { + pub fn to_json(&self) -> String { + // Parallel arrays for call_log + let cl_n: Vec = self.call_log.iter().map(|c| c.call_n).collect(); + let cl_cmd: Vec = self.call_log.iter().map(|c| c.cmd_short.clone()).collect(); + let cl_hash: Vec = self.call_log.iter().map(|c| c.output_hash).collect(); + let cl_len: Vec = self.call_log.iter().map(|c| c.output_len).collect(); + let cl_short: Vec = self.call_log.iter().map(|c| c.short_hash.clone()).collect(); + + let sf_path: Vec = self.seen_files.iter().map(|f| f.path.clone()).collect(); + let sf_size: Vec = + self.seen_files.iter().map(|f| f.size_class as u64).collect(); + let sf_last: Vec = self.seen_files.iter().map(|f| f.last_seen_call).collect(); + + format!( + "{{\"session_file\":\"{}\",\"call_counter\":{},\ +\"call_log_n\":{},\"call_log_cmd\":{},\"call_log_hash\":{},\"call_log_len\":{},\"call_log_short\":{},\ +\"seen_files_path\":{},\"seen_files_size\":{},\"seen_files_last\":{},\ +\"seen_errors\":{},\"seen_git_refs\":{}}}", + json_util::escape_str(&self.session_file), + self.call_counter, + json_util::u64_array(&cl_n), + json_util::str_array(&cl_cmd), + json_util::u64_array(&cl_hash), + json_util::usize_array(&cl_len), + json_util::str_array(&cl_short), + json_util::str_array(&sf_path), + json_util::u64_array(&sf_size), + json_util::u64_array(&sf_last), + json_util::u64_array(&self.seen_errors), + json_util::str_array(&self.seen_git_refs), + ) + } + + pub fn from_json(s: &str) -> Self { + let mut c = Self::default(); + c.session_file = json_util::extract_str(s, "session_file").unwrap_or_default(); + c.call_counter = json_util::extract_u64(s, "call_counter").unwrap_or(0); + + let cl_n = json_util::extract_u64_array(s, "call_log_n"); + let cl_cmd = json_util::extract_str_array(s, "call_log_cmd"); + let cl_hash = json_util::extract_u64_array(s, "call_log_hash"); + let cl_len = json_util::extract_u64_array(s, "call_log_len"); + let cl_short = json_util::extract_str_array(s, "call_log_short"); + let n = cl_n + .len() + .min(cl_cmd.len()) + .min(cl_hash.len()) + .min(cl_len.len()) + .min(cl_short.len()); + for i in 0..n { + c.call_log.push(CallEntry { + call_n: cl_n[i], + cmd_short: cl_cmd[i].clone(), + output_hash: cl_hash[i], + output_len: cl_len[i] as usize, + short_hash: cl_short[i].clone(), + }); + } + + let sf_path = json_util::extract_str_array(s, "seen_files_path"); + let sf_size = json_util::extract_u64_array(s, "seen_files_size"); + let sf_last = json_util::extract_u64_array(s, "seen_files_last"); + let m = sf_path.len().min(sf_size.len()).min(sf_last.len()); + for i in 0..m { + c.seen_files.push(FileFingerprint { + path: sf_path[i].clone(), + size_class: sf_size[i] as u32, + last_seen_call: sf_last[i], + }); + } + + c.seen_errors = json_util::extract_u64_array(s, "seen_errors"); + c.seen_git_refs = json_util::extract_str_array(s, "seen_git_refs"); + c.tokens_bash = json_util::extract_u64(s, "tokens_bash").unwrap_or(0); + c.tokens_read = json_util::extract_u64(s, "tokens_read").unwrap_or(0); + c.tokens_other = json_util::extract_u64(s, "tokens_other").unwrap_or(0); + c + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn normalize_replaces_digits_paths_hex() { + let n = normalize_error("Error: file /tmp/foo/bar.txt line 42 abc123def"); + assert!(n.contains("PATH"), "got: {}", n); + assert!(n.contains('N'), "got: {}", n); + assert!(!n.contains("/tmp/foo")); + } + + #[test] + fn record_call_drops_oldest_at_33rd() { + let mut c = SessionContext::default(); + for i in 0..40 { + let n = c.next_call_n(); + c.record_call(&format!("cmd{}", i), i, i as usize, n); + } + assert_eq!(c.call_log.len(), MAX_CALL_LOG); + // Oldest entries dropped + assert_eq!(c.call_log[0].call_n, 9); // calls 1..=8 dropped + } + + #[test] + fn lookup_recent_only_within_window() { + let mut c = SessionContext::default(); + // Record 25 calls: window=16 covers last 16 (calls 10..=25) + for i in 1..=25u64 { + c.next_call_n(); + c.record_call(&format!("c{}", i), i * 10, i as usize, i); + } + // Last call hash present (call 25, hash=250, len=25) + assert!(c.lookup_recent(250, 25).is_some()); + // Call 9 is outside window (window starts at call 10) + assert!(c.lookup_recent(90, 9).is_none()); + } + + #[test] + fn note_files_dedup_and_caps() { + let mut c = SessionContext::default(); + c.next_call_n(); + for i in 0..300 { + c.note_files(&[format!("/path/{}.rs", i)]); + } + assert!(c.seen_files.len() <= MAX_SEEN_FILES); + } + + #[test] + fn file_was_seen_returns_call_n() { + let mut c = SessionContext::default(); + c.next_call_n(); + c.note_files(&["/foo.rs".to_string()]); + assert_eq!(c.file_was_seen("/foo.rs"), Some(1)); + assert_eq!(c.file_was_seen("/bar.rs"), None); + } + + #[test] + fn raw_read_hint_detects_seen_file() { + let mut c = SessionContext::default(); + c.next_call_n(); + c.note_files(&["/foo.rs".to_string()]); + let hint = raw_read_hint(&c, "cat /foo.rs"); + assert!(hint.is_some()); + assert!(hint.unwrap().contains("/foo.rs")); + } + + #[test] + fn raw_read_hint_ignores_unknown_program() { + let c = SessionContext::default(); + assert!(raw_read_hint(&c, "git status").is_none()); + } + + #[test] + fn json_round_trip() { + let mut c = SessionContext::default(); + c.session_file = "2026-04-07-10.jsonl".to_string(); + c.next_call_n(); + c.record_call("git status", 0xdead_beef, 100, 1); + c.note_files(&["/a.rs".to_string(), "/b.rs".to_string()]); + c.note_errors(&["error: cannot find function 'foo'".to_string()]); + + let json = c.to_json(); + let r = SessionContext::from_json(&json); + assert_eq!(r.session_file, c.session_file); + assert_eq!(r.call_counter, c.call_counter); + assert_eq!(r.call_log.len(), 1); + assert_eq!(r.call_log[0].output_hash, 0xdead_beef); + assert_eq!(r.call_log[0].output_len, 100); + assert_eq!(r.seen_files.len(), 2); + assert_eq!(r.seen_errors.len(), 1); + } + + #[test] + fn save_load_round_trip_via_disk() { + let dir = std::env::temp_dir().join(format!( + "squeez_ctx_{}", + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .subsec_nanos() + )); + std::fs::create_dir_all(&dir).unwrap(); + + let mut c = SessionContext::default(); + c.session_file = "test.jsonl".to_string(); + c.next_call_n(); + c.record_call("ls", 42, 10, 1); + c.save(&dir); + + let loaded = SessionContext::load(&dir); + assert_eq!(loaded.session_file, "test.jsonl"); + assert_eq!(loaded.call_counter, 1); + assert_eq!(loaded.call_log.len(), 1); + + let _ = std::fs::remove_dir_all(&dir); + } +} diff --git a/src/context/hash.rs b/src/context/hash.rs new file mode 100644 index 0000000..ae9f9ca --- /dev/null +++ b/src/context/hash.rs @@ -0,0 +1,47 @@ +// FNV-1a 64-bit hash. Zero-dep, ~10 lines, good distribution for short strings. +// Reference: http://www.isthe.com/chongo/tech/comp/fnv/ + +const FNV_OFFSET: u64 = 0xcbf2_9ce4_8422_2325; +const FNV_PRIME: u64 = 0x0000_0100_0000_01b3; + +pub fn fnv1a_64(bytes: &[u8]) -> u64 { + let mut h = FNV_OFFSET; + for &b in bytes { + h ^= b as u64; + h = h.wrapping_mul(FNV_PRIME); + } + h +} + +/// First 8 hex chars of a 64-bit hash, lowercase. +pub fn short_hex(h: u64) -> String { + format!("{:016x}", h).chars().take(8).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty_input_is_offset_basis() { + assert_eq!(fnv1a_64(b""), FNV_OFFSET); + } + + #[test] + fn known_vector() { + // FNV-1a("a") = 0xaf63dc4c8601ec8c + assert_eq!(fnv1a_64(b"a"), 0xaf63_dc4c_8601_ec8c); + } + + #[test] + fn different_inputs_differ() { + assert_ne!(fnv1a_64(b"foo"), fnv1a_64(b"bar")); + } + + #[test] + fn short_hex_length() { + let h = fnv1a_64(b"squeez"); + assert_eq!(short_hex(h).len(), 8); + assert!(short_hex(h).chars().all(|c| c.is_ascii_hexdigit())); + } +} diff --git a/src/context/intensity.rs b/src/context/intensity.rs new file mode 100644 index 0000000..ea1e9df --- /dev/null +++ b/src/context/intensity.rs @@ -0,0 +1,146 @@ +use crate::config::Config; + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum Intensity { + Lite, + Full, + Ultra, +} + +impl Intensity { + pub fn as_str(self) -> &'static str { + match self { + Intensity::Lite => "Lite", + Intensity::Full => "Full", + Intensity::Ultra => "Ultra", + } + } +} + +/// Budget = compact_threshold_tokens * 5 / 4 (matches existing wrap.rs math). +pub fn budget(cfg: &Config) -> u64 { + cfg.compact_threshold_tokens.saturating_mul(5) / 4 +} + +/// Derive intensity from config + current usage. +/// When `adaptive_intensity` is enabled (the default), squeez compresses +/// at maximum aggression (Ultra) regardless of budget. The Lite/Full tiers +/// remain in the type so users can opt into a softer mode by disabling +/// adaptive_intensity (which falls back to Lite — no scaling). +/// +/// `used` is accepted for forward compatibility but is currently unused. +pub fn derive(_used: u64, cfg: &Config) -> Intensity { + if cfg.adaptive_intensity { + Intensity::Ultra + } else { + Intensity::Lite + } +} + +/// Return a clone of `cfg` with line/dedup limits scaled by `level`. +/// Floors enforced so we never reduce to zero. +pub fn scale(cfg: &Config, level: Intensity) -> Config { + let mut c = cfg.clone(); + let (lines_mult_num, lines_mult_den, dedup_floor) = match level { + Intensity::Lite => return c, + Intensity::Full => (6u64, 10u64, 2usize), // ×0.6 + Intensity::Ultra => (3u64, 10u64, 2usize), // ×0.3 + }; + c.max_lines = scale_usize(c.max_lines, lines_mult_num, lines_mult_den, 20); + c.git_log_max_commits = scale_usize(c.git_log_max_commits, lines_mult_num, lines_mult_den, 5); + c.git_diff_max_lines = scale_usize(c.git_diff_max_lines, lines_mult_num, lines_mult_den, 20); + c.docker_logs_max_lines = + scale_usize(c.docker_logs_max_lines, lines_mult_num, lines_mult_den, 20); + c.find_max_results = scale_usize(c.find_max_results, lines_mult_num, lines_mult_den, 10); + c.summarize_threshold_lines = scale_usize( + c.summarize_threshold_lines, + lines_mult_num, + lines_mult_den, + 50, + ); + + // dedup_min: Full ×0.66 → ceil to 2; Ultra ×0.5 → ceil to 2 + let dedup_num = match level { + Intensity::Full => 66u64, + Intensity::Ultra => 50u64, + Intensity::Lite => 100u64, + }; + c.dedup_min = scale_usize(c.dedup_min, dedup_num, 100, dedup_floor); + c +} + +fn scale_usize(v: usize, num: u64, den: u64, floor: usize) -> usize { + let scaled = (v as u64).saturating_mul(num) / den.max(1); + (scaled as usize).max(floor) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn cfg() -> Config { + Config::default() + } + + #[test] + fn adaptive_enabled_at_zero_is_ultra() { + assert_eq!(derive(0, &cfg()), Intensity::Ultra); + } + + #[test] + fn adaptive_enabled_at_full_budget_is_ultra() { + let c = cfg(); + assert_eq!(derive(budget(&c), &c), Intensity::Ultra); + } + + #[test] + fn adaptive_enabled_above_budget_is_ultra() { + let c = cfg(); + assert_eq!(derive(budget(&c) * 5, &c), Intensity::Ultra); + } + + #[test] + fn adaptive_disabled_always_lite() { + let mut c = cfg(); + c.adaptive_intensity = false; + assert_eq!(derive(0, &c), Intensity::Lite); + assert_eq!(derive(budget(&c) * 5, &c), Intensity::Lite); + } + + #[test] + fn scale_lite_is_passthrough() { + let c = cfg(); + let s = scale(&c, Intensity::Lite); + assert_eq!(s.max_lines, c.max_lines); + assert_eq!(s.dedup_min, c.dedup_min); + } + + #[test] + fn scale_full_shrinks() { + let c = cfg(); + let s = scale(&c, Intensity::Full); + assert!(s.max_lines < c.max_lines); + assert!(s.git_diff_max_lines < c.git_diff_max_lines); + } + + #[test] + fn scale_ultra_shrinks_more_than_full() { + let c = cfg(); + let f = scale(&c, Intensity::Full); + let u = scale(&c, Intensity::Ultra); + assert!(u.max_lines <= f.max_lines); + assert!(u.git_diff_max_lines <= f.git_diff_max_lines); + } + + #[test] + fn floors_enforced() { + let mut c = cfg(); + c.max_lines = 10; + c.git_diff_max_lines = 5; + c.dedup_min = 1; + let s = scale(&c, Intensity::Ultra); + assert!(s.max_lines >= 20, "max_lines floor: got {}", s.max_lines); + assert!(s.git_diff_max_lines >= 20); + assert!(s.dedup_min >= 2); + } +} diff --git a/src/context/mod.rs b/src/context/mod.rs new file mode 100644 index 0000000..b80974c --- /dev/null +++ b/src/context/mod.rs @@ -0,0 +1,28 @@ +pub mod cache; +pub mod hash; +pub mod intensity; +pub mod redundancy; +pub mod summarize; + +pub use cache::SessionContext; +pub use intensity::Intensity; + +use crate::config::Config; +use std::path::Path; + +/// Pre-pass: load context, derive intensity from current usage, return a +/// scaled clone of the user's config to use for this single call. +pub fn pre_pass( + cfg: &Config, + sessions_dir: &Path, + used_tokens: u64, +) -> (SessionContext, Intensity, Config) { + let ctx = if cfg.context_cache_enabled { + SessionContext::load(sessions_dir) + } else { + SessionContext::default() + }; + let level = intensity::derive(used_tokens, cfg); + let scaled = intensity::scale(cfg, level); + (ctx, level, scaled) +} diff --git a/src/context/redundancy.rs b/src/context/redundancy.rs new file mode 100644 index 0000000..3f28132 --- /dev/null +++ b/src/context/redundancy.rs @@ -0,0 +1,99 @@ +use crate::context::cache::{CallEntry, SessionContext}; +use crate::context::hash::fnv1a_64; + +/// Minimum number of compressed lines for an output to be eligible for +/// redundancy lookup. Below this we don't dedup — collapses too much signal. +const MIN_LINES: usize = 2; + +#[derive(Debug, Clone)] +pub struct RedundancyHit { + pub short_hash: String, + pub call_n: u64, +} + +/// Compute the canonical hash + length for a compressed output. +fn fingerprint(output: &[String]) -> (u64, usize) { + let joined = output.join("\n"); + (fnv1a_64(joined.as_bytes()), joined.len()) +} + +/// If `output` matches a recent call's hash AND length, return a hit. +pub fn check(ctx: &SessionContext, output: &[String]) -> Option { + if output.len() < MIN_LINES { + return None; + } + let (h, len) = fingerprint(output); + let entry: &CallEntry = ctx.lookup_recent(h, len)?; + Some(RedundancyHit { + short_hash: entry.short_hash.clone(), + call_n: entry.call_n, + }) +} + +/// Record this call's output for future redundancy lookups. +/// Returns the assigned call_n. +pub fn record(ctx: &mut SessionContext, cmd: &str, output: &[String]) -> u64 { + let (h, len) = fingerprint(output); + let call_n = ctx.next_call_n(); + ctx.record_call(cmd, h, len, call_n); + call_n +} + +#[cfg(test)] +mod tests { + use super::*; + + fn lines(n: usize) -> Vec { + (0..n).map(|i| format!("line {}", i)).collect() + } + + #[test] + fn tiny_output_never_matches() { + let mut ctx = SessionContext::default(); + let out = lines(1); // 1 < MIN_LINES=2 + record(&mut ctx, "cmd", &out); + assert!(check(&ctx, &out).is_none(), "should not match tiny output"); + } + + #[test] + fn exact_repeat_hits() { + let mut ctx = SessionContext::default(); + let out = lines(10); + record(&mut ctx, "git status", &out); + let hit = check(&ctx, &out); + assert!(hit.is_some()); + assert_eq!(hit.unwrap().call_n, 1); + } + + #[test] + fn diff_by_one_line_misses() { + let mut ctx = SessionContext::default(); + let mut out = lines(10); + record(&mut ctx, "ls", &out); + out[0] = "different".to_string(); + assert!(check(&ctx, &out).is_none()); + } + + #[test] + fn outside_recent_window_misses() { + let mut ctx = SessionContext::default(); + let target = lines(10); + record(&mut ctx, "first", &target); + // Push 17 more calls past the window (RECENT_WINDOW=16) + for i in 0..17 { + let other = (0..10).map(|j| format!("o{}-{}", i, j)).collect::>(); + record(&mut ctx, &format!("c{}", i), &other); + } + assert!( + check(&ctx, &target).is_none(), + "first call should be outside RECENT_WINDOW" + ); + } + + #[test] + fn record_returns_incrementing_call_n() { + let mut ctx = SessionContext::default(); + assert_eq!(record(&mut ctx, "a", &lines(10)), 1); + assert_eq!(record(&mut ctx, "b", &lines(10)), 2); + } +} diff --git a/src/context/summarize.rs b/src/context/summarize.rs new file mode 100644 index 0000000..cee9894 --- /dev/null +++ b/src/context/summarize.rs @@ -0,0 +1,122 @@ +use crate::commands::wrap; +use crate::config::Config; + +/// Number of last lines to preserve verbatim in the summary. +const TAIL_KEEP: usize = 20; +/// Number of top items to keep per category. +const TOP_N: usize = 5; + +pub fn should_apply(lines: &[String], cfg: &Config) -> bool { + lines.len() > cfg.summarize_threshold_lines +} + +/// Build a dense ≤40-line summary from a large output. +pub fn apply(lines: Vec, cmd: &str) -> Vec { + let total = lines.len(); + let joined = lines.join("\n"); + + let files = wrap::extract_file_paths(&joined); + let errors = wrap::extract_errors(&joined); + let test = wrap::extract_test_summary(&joined); + + let cmd_short: String = cmd.chars().take(30).collect(); + + let mut out: Vec = Vec::with_capacity(40); + out.push(format!("squeez:summary cmd={}", cmd_short)); + out.push(format!("total_lines={}", total)); + out.push(format!("unique_files={}", files.len())); + + if !errors.is_empty() { + out.push("top_errors:".to_string()); + for e in errors.iter().take(TOP_N) { + let trimmed: String = e.chars().take(120).collect(); + out.push(format!(" - {}", trimmed)); + } + } + + if !files.is_empty() { + out.push("top_files:".to_string()); + for f in files.iter().take(TOP_N) { + out.push(format!(" - {}", f)); + } + } + + if !test.is_empty() { + out.push(format!("test_summary={}", test)); + } + + let tail_n = TAIL_KEEP.min(total); + out.push(format!("tail_preserved={}", tail_n)); + + let tail_start = total.saturating_sub(tail_n); + for line in lines.into_iter().skip(tail_start) { + out.push(line); + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + + fn cfg() -> Config { + let mut c = Config::default(); + c.summarize_threshold_lines = 100; + c + } + + #[test] + fn should_apply_respects_threshold() { + let c = cfg(); + let small: Vec = (0..50).map(|i| format!("l{}", i)).collect(); + let big: Vec = (0..200).map(|i| format!("l{}", i)).collect(); + assert!(!should_apply(&small, &c)); + assert!(should_apply(&big, &c)); + } + + #[test] + fn summary_is_bounded() { + let lines: Vec = (0..5000).map(|i| format!("line {}", i)).collect(); + let out = apply(lines, "cargo build"); + // header (3) + tail header (1) + 20 tail lines = 24 + assert!(out.len() <= 40, "got {} lines", out.len()); + } + + #[test] + fn summary_preserves_last_20_lines() { + let lines: Vec = (0..1000).map(|i| format!("line {}", i)).collect(); + let out = apply(lines, "cmd"); + assert!(out.contains(&"line 999".to_string())); + assert!(out.contains(&"line 980".to_string())); + assert!(!out.contains(&"line 0".to_string())); + } + + #[test] + fn summary_extracts_errors() { + let mut lines: Vec = (0..600).map(|i| format!("line {}", i)).collect(); + lines.push("error: cannot resolve type".to_string()); + lines.push("error: missing field".to_string()); + let out = apply(lines, "cargo check"); + let joined = out.join("\n"); + assert!(joined.contains("top_errors")); + assert!(joined.contains("cannot resolve type")); + } + + #[test] + fn summary_extracts_files() { + let mut lines: Vec = (0..600).map(|i| format!("noise {}", i)).collect(); + lines.push("modified: src/main.rs".to_string()); + lines.push("modified: src/lib.rs".to_string()); + let out = apply(lines, "git status"); + let joined = out.join("\n"); + assert!(joined.contains("top_files")); + assert!(joined.contains("src/main.rs")); + } + + #[test] + fn summary_includes_total_count() { + let lines: Vec = (0..1234).map(|i| format!("l{}", i)).collect(); + let out = apply(lines, "x"); + assert!(out.iter().any(|l| l.contains("total_lines=1234"))); + } +} diff --git a/src/filter.rs b/src/filter.rs index 66b97ea..174448e 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -1,8 +1,9 @@ use crate::commands::Handler; use crate::commands::{ - build::BuildHandler, cloud::CloudHandler, database::DatabaseHandler, docker::DockerHandler, - fs::FsHandler, generic::GenericHandler, git::GitHandler, network::NetworkHandler, - package_mgr::PackageMgrHandler, runtime::RuntimeHandler, test_runner::TestRunnerHandler, + build::BuildHandler, cloud::CloudHandler, data_tool::DataToolHandler, + database::DatabaseHandler, docker::DockerHandler, fs::FsHandler, generic::GenericHandler, + git::GitHandler, network::NetworkHandler, package_mgr::PackageMgrHandler, + runtime::RuntimeHandler, test_runner::TestRunnerHandler, text_proc::TextProcHandler, typescript::TypescriptHandler, }; use crate::config::Config; @@ -16,7 +17,7 @@ fn detect(cmd: &str) -> Box { let name = extract_name(cmd); match name.as_str() { "git" => Box::new(GitHandler), - "docker" | "docker-compose" => Box::new(DockerHandler), + "docker" | "docker-compose" | "podman" => Box::new(DockerHandler), "npm" | "pnpm" | "bun" | "yarn" => Box::new(PackageMgrHandler), "cargo" => { if cmd.split_whitespace().any(|a| a == "test") { @@ -25,7 +26,7 @@ fn detect(cmd: &str) -> Box { Box::new(PackageMgrHandler) } } - "jest" | "vitest" | "pytest" | "py.test" => Box::new(TestRunnerHandler), + "jest" | "vitest" | "pytest" | "py.test" | "nextest" => Box::new(TestRunnerHandler), "tsc" | "eslint" | "biome" => Box::new(TypescriptHandler), "make" | "cmake" | "gradle" | "mvn" | "xcodebuild" => Box::new(BuildHandler), "vite" | "next" | "turbo" => { @@ -35,11 +36,15 @@ fn detect(cmd: &str) -> Box { Box::new(GenericHandler) } } - "kubectl" | "gh" | "aws" | "gcloud" => Box::new(CloudHandler), + "kubectl" | "gh" | "aws" | "gcloud" | "az" => Box::new(CloudHandler), "psql" | "prisma" | "mysql" => Box::new(DatabaseHandler), "curl" | "wget" | "http" => Box::new(NetworkHandler), "node" | "python" | "python3" | "ruby" => Box::new(RuntimeHandler), "find" | "ls" | "du" | "ps" | "env" | "lsof" | "netstat" => Box::new(FsHandler), + // JSON/YAML/IaC tools + "jq" | "yq" | "terraform" | "tofu" | "helm" | "pulumi" => Box::new(DataToolHandler), + // Text-processing tools: grep match output + "grep" | "rg" | "awk" | "sed" => Box::new(TextProcHandler), _ => Box::new(GenericHandler), } } diff --git a/src/json_util.rs b/src/json_util.rs index 1d0d814..b10d559 100644 --- a/src/json_util.rs +++ b/src/json_util.rs @@ -76,3 +76,36 @@ pub fn str_array(items: &[String]) -> String { .collect(); format!("[{}]", inner.join(",")) } + +/// Extract a u64 array from a flat JSON object: {"key":[1,2,3],...} +/// Non-digit values are skipped. +pub fn extract_u64_array(json: &str, key: &str) -> Vec { + let pat = format!("\"{}\":[", key); + let start = match json.find(&pat) { + Some(i) => i + pat.len(), + None => return Vec::new(), + }; + let end = match json[start..].find(']') { + Some(i) => start + i, + None => return Vec::new(), + }; + let arr = &json[start..end]; + if arr.trim().is_empty() { + return Vec::new(); + } + arr.split(',') + .filter_map(|s| s.trim().parse::().ok()) + .collect() +} + +/// Serialize a u64 slice as a JSON array of numbers. +pub fn u64_array(items: &[u64]) -> String { + let inner: Vec = items.iter().map(|v| v.to_string()).collect(); + format!("[{}]", inner.join(",")) +} + +/// Serialize a usize slice as a JSON array of numbers. +pub fn usize_array(items: &[usize]) -> String { + let inner: Vec = items.iter().map(|v| v.to_string()).collect(); + format!("[{}]", inner.join(",")) +} diff --git a/src/lib.rs b/src/lib.rs index 3e8a187..5450441 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ pub mod commands; pub mod config; +pub mod context; pub mod filter; pub mod json_util; pub mod memory; diff --git a/src/main.rs b/src/main.rs index 10b774b..53e7255 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,8 +37,27 @@ fn main() { eprintln!("squeez: compact not yet implemented"); std::process::exit(1); } + Some("compress-md") => { + let rest: Vec = args.iter().skip(2).cloned().collect(); + std::process::exit(squeez::commands::compress_md::run(&rest)); + } + Some("update") => { + let rest: Vec = args.iter().skip(2).cloned().collect(); + std::process::exit(squeez::commands::update::run(&rest)); + } + Some("track-result") => { + let tool = args.get(2).map(String::as_str).unwrap_or("unknown"); + std::process::exit(squeez::commands::track_result::run(tool)); + } _ => { - eprintln!("Usage: squeez wrap \n squeez filter \n squeez --version"); + eprintln!("Usage: squeez wrap "); + eprintln!(" squeez filter "); + eprintln!(" squeez init [--copilot]"); + eprintln!(" squeez track "); + eprintln!(" squeez track-result (reads stdin)"); + eprintln!(" squeez compress-md [--ultra] [--dry-run] [--all] ..."); + eprintln!(" squeez update [--check] [--insecure]"); + eprintln!(" squeez --version"); std::process::exit(1); } } diff --git a/src/session.rs b/src/session.rs index b9832c5..b19fc53 100644 --- a/src/session.rs +++ b/src/session.rs @@ -3,15 +3,20 @@ use std::path::{Path, PathBuf}; // ── Directory helpers ────────────────────────────────────────────────────── +/// Returns the user's home directory. +/// Tries `HOME` first (Unix/Git Bash), then `USERPROFILE` (Windows native). +pub fn home_dir() -> String { + std::env::var("HOME") + .or_else(|_| std::env::var("USERPROFILE")) + .unwrap_or_default() +} + /// Returns the squeez state directory. Overridable via SQUEEZ_DIR env var (for tests). pub fn squeez_dir() -> PathBuf { if let Ok(d) = std::env::var("SQUEEZ_DIR") { return PathBuf::from(d); } - PathBuf::from(format!( - "{}/.claude/squeez", - std::env::var("HOME").unwrap_or_default() - )) + PathBuf::from(format!("{}/.claude/squeez", home_dir())) } pub fn sessions_dir() -> PathBuf { diff --git a/tests/test_compress_md.rs b/tests/test_compress_md.rs new file mode 100644 index 0000000..ec21cd0 --- /dev/null +++ b/tests/test_compress_md.rs @@ -0,0 +1,120 @@ +use squeez::commands::compress_md::{compress_text, Mode}; + +#[test] +fn full_mode_drops_articles_and_fillers() { + let input = "The quick brown fox really just jumps over the lazy dog.\n"; + let r = compress_text(input, Mode::Full); + assert!(r.safe); + assert!(!r.output.to_lowercase().contains(" the ")); + assert!(!r.output.to_lowercase().contains("really")); + assert!(!r.output.to_lowercase().contains("just")); + assert!(r.output.to_lowercase().contains("fox")); + assert!(r.output.to_lowercase().contains("dog")); +} + +#[test] +fn ultra_mode_substitutes_long_words() { + let input = "Configure the function with these parameters because of the docs.\n"; + let r = compress_text(input, Mode::Ultra); + assert!(r.safe); + assert!(r.output.contains("fn")); + assert!(r.output.contains("w/")); + assert!(r.output.contains("param")); + assert!(r.output.contains("b/c")); +} + +#[test] +fn fenced_code_block_unchanged() { + let input = "Intro the prose.\n```python\ndef the_func():\n return None\n```\nOutro.\n"; + let r = compress_text(input, Mode::Ultra); + assert!(r.safe); + assert!(r.output.contains("def the_func():")); + assert!(r.output.contains("return None")); +} + +#[test] +fn inline_code_unchanged() { + let input = "Run `git status --porcelain` to see the changes.\n"; + let r = compress_text(input, Mode::Full); + assert!(r.output.contains("`git status --porcelain`")); +} + +#[test] +fn url_in_markdown_link_preserved() { + let input = "See [docs](https://example.com/api/v1) for the details.\n"; + let r = compress_text(input, Mode::Ultra); + assert!(r.safe); + assert!(r.output.contains("https://example.com/api/v1")); +} + +#[test] +fn bare_url_preserved() { + let input = "Try https://github.com/foo/bar.git for the source.\n"; + let r = compress_text(input, Mode::Full); + assert!(r.safe); + assert!(r.output.contains("https://github.com/foo/bar.git")); +} + +#[test] +fn heading_count_unchanged() { + let input = "# Title\n\nintro\n\n## Section\n\nbody\n\n### Subsection\n\nmore\n"; + let r = compress_text(input, Mode::Ultra); + assert_eq!(r.stats.orig_headings, r.stats.new_headings); + assert!(r.safe); +} + +#[test] +fn pleasantries_removed() { + let input = "I'd be happy to help you. Of course, I would like to ensure correctness.\n"; + let r = compress_text(input, Mode::Full); + let lower = r.output.to_lowercase(); + assert!(!lower.contains("happy to")); + assert!(!lower.contains("of course")); + assert!(!lower.contains("would like to")); +} + +#[test] +fn table_preserved_verbatim() { + let input = "Before.\n\n| key | value |\n|-----|-------|\n| a | 1 |\n| b | 2 |\n\nAfter.\n"; + let r = compress_text(input, Mode::Full); + assert!(r.output.contains("| key | value |")); + assert!(r.output.contains("| a | 1 |")); +} + +#[test] +fn integrity_check_aborts_on_corruption() { + // We can't easily simulate code-block loss without internal hooks. + // Verify the safe flag tracks legitimate inputs as safe. + let input = "# H\n\nshort prose.\n"; + let r = compress_text(input, Mode::Full); + assert!(r.safe); +} + +#[test] +fn idempotent_second_pass_safe() { + let input = "# Title\n\nThe quick brown fox really jumps high.\n"; + let r1 = compress_text(input, Mode::Full); + let r2 = compress_text(&r1.output, Mode::Full); + assert!(r2.safe); + // No further damage + assert_eq!(r2.stats.new_headings, r1.stats.new_headings); + assert_eq!(r2.stats.new_code_blocks, r1.stats.new_code_blocks); +} + +#[test] +fn list_marker_kept_articles_dropped() { + let input = "- the first item\n- the second item\n- a third item\n"; + let r = compress_text(input, Mode::Full); + assert!(r.output.starts_with("- ")); + assert!(r.output.contains("first item")); + assert!(!r.output.contains("the first")); +} + +#[test] +fn version_string_preserved() { + let input = "Released v1.2.3 with the new feature.\n"; + let r = compress_text(input, Mode::Ultra); + // (version preservation is best-effort; main check is no panic + safe) + assert!(r.safe); + assert!(r.stats.new_bytes > 0); +} diff --git a/tests/test_config.rs b/tests/test_config.rs index 0c12ce1..0a4044a 100644 --- a/tests/test_config.rs +++ b/tests/test_config.rs @@ -54,7 +54,7 @@ fn is_bypassed_matches_prefix() { #[test] fn test_config_compact_threshold_default() { let c = squeez::config::Config::default(); - assert_eq!(c.compact_threshold_tokens, 160_000); + assert_eq!(c.compact_threshold_tokens, 120_000); assert_eq!(c.memory_retention_days, 30); } diff --git a/tests/test_context_cache.rs b/tests/test_context_cache.rs new file mode 100644 index 0000000..5ac5705 --- /dev/null +++ b/tests/test_context_cache.rs @@ -0,0 +1,99 @@ +use squeez::context::cache::{raw_read_hint, SessionContext}; +use std::path::PathBuf; + +fn tmp_dir(label: &str) -> PathBuf { + let d = std::env::temp_dir().join(format!( + "squeez_ctxcache_{}_{}", + label, + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .subsec_nanos() + )); + std::fs::create_dir_all(&d).unwrap(); + d +} + +#[test] +fn save_load_round_trip() { + let dir = tmp_dir("rt"); + let mut c = SessionContext::default(); + c.session_file = "2026-04-07-12.jsonl".to_string(); + c.next_call_n(); + c.record_call("git status", 0xcafe_babe, 200, 1); + c.note_files(&["src/main.rs".to_string(), "Cargo.toml".to_string()]); + c.note_errors(&["error: cannot find function 'foo'".to_string()]); + c.note_git(&["abc1234 commit msg".to_string()]); + c.save(&dir); + + let loaded = SessionContext::load(&dir); + assert_eq!(loaded.session_file, "2026-04-07-12.jsonl"); + assert_eq!(loaded.call_counter, 1); + assert_eq!(loaded.call_log.len(), 1); + assert_eq!(loaded.call_log[0].output_hash, 0xcafe_babe); + assert_eq!(loaded.call_log[0].output_len, 200); + assert_eq!(loaded.seen_files.len(), 2); + assert_eq!(loaded.seen_errors.len(), 1); + assert_eq!(loaded.seen_git_refs, vec!["abc1234"]); + + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn load_missing_returns_empty() { + let dir = tmp_dir("miss"); + let c = SessionContext::load(&dir); + assert_eq!(c.call_counter, 0); + assert!(c.call_log.is_empty()); + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn ring_buffer_drops_oldest_at_overflow() { + let mut c = SessionContext::default(); + for i in 0..40 { + let n = c.next_call_n(); + c.record_call(&format!("c{}", i), i, i as usize, n); + } + assert_eq!(c.call_log.len(), 32); + assert!(c.call_log[0].call_n > 1); +} + +#[test] +fn note_files_caps_at_max() { + let mut c = SessionContext::default(); + c.next_call_n(); + for i in 0..400 { + c.note_files(&[format!("/p/{}.rs", i)]); + } + assert!(c.seen_files.len() <= 256); +} + +#[test] +fn raw_read_hint_for_seen_file() { + let mut c = SessionContext::default(); + c.next_call_n(); + c.note_files(&["src/main.rs".to_string()]); + let h = raw_read_hint(&c, "cat src/main.rs"); + assert!(h.is_some()); + let s = h.unwrap(); + assert!(s.contains("src/main.rs")); + assert!(s.contains("squeez hint")); +} + +#[test] +fn raw_read_hint_skips_non_read_commands() { + let mut c = SessionContext::default(); + c.next_call_n(); + c.note_files(&["src/main.rs".to_string()]); + assert!(raw_read_hint(&c, "git status").is_none()); + assert!(raw_read_hint(&c, "ls -la").is_none()); +} + +#[test] +fn raw_read_hint_skips_unseen_file() { + let mut c = SessionContext::default(); + c.next_call_n(); + c.note_files(&["src/main.rs".to_string()]); + assert!(raw_read_hint(&c, "cat src/lib.rs").is_none()); +} diff --git a/tests/test_intensity.rs b/tests/test_intensity.rs new file mode 100644 index 0000000..6d23542 --- /dev/null +++ b/tests/test_intensity.rs @@ -0,0 +1,67 @@ +use squeez::config::Config; +use squeez::context::intensity::{budget, derive, scale, Intensity}; + +fn cfg() -> Config { + Config::default() +} + +#[test] +fn adaptive_on_zero_usage_is_ultra() { + assert_eq!(derive(0, &cfg()), Intensity::Ultra); +} + +#[test] +fn adaptive_on_full_budget_is_ultra() { + let c = cfg(); + assert_eq!(derive(budget(&c), &c), Intensity::Ultra); +} + +#[test] +fn adaptive_on_overbudget_is_ultra() { + let c = cfg(); + assert_eq!(derive(budget(&c) * 5, &c), Intensity::Ultra); +} + +#[test] +fn adaptive_off_zero_usage_is_lite() { + let mut c = cfg(); + c.adaptive_intensity = false; + assert_eq!(derive(0, &c), Intensity::Lite); +} + +#[test] +fn adaptive_off_overbudget_still_lite() { + let mut c = cfg(); + c.adaptive_intensity = false; + assert_eq!(derive(budget(&c) * 5, &c), Intensity::Lite); +} + +#[test] +fn scale_lite_passthrough() { + let c = cfg(); + let s = scale(&c, Intensity::Lite); + assert_eq!(s.max_lines, c.max_lines); + assert_eq!(s.git_diff_max_lines, c.git_diff_max_lines); + assert_eq!(s.dedup_min, c.dedup_min); +} + +#[test] +fn scale_ultra_smaller_than_full() { + let c = cfg(); + let f = scale(&c, Intensity::Full); + let u = scale(&c, Intensity::Ultra); + assert!(u.max_lines <= f.max_lines); + assert!(u.docker_logs_max_lines <= f.docker_logs_max_lines); +} + +#[test] +fn floors_prevent_zero() { + let mut c = cfg(); + c.max_lines = 1; + c.git_diff_max_lines = 1; + c.dedup_min = 0; + let u = scale(&c, Intensity::Ultra); + assert!(u.max_lines >= 20); + assert!(u.git_diff_max_lines >= 20); + assert!(u.dedup_min >= 2); +} diff --git a/tests/test_persona.rs b/tests/test_persona.rs new file mode 100644 index 0000000..cb514f1 --- /dev/null +++ b/tests/test_persona.rs @@ -0,0 +1,49 @@ +use squeez::commands::persona::{as_str, from_str, text, Persona}; + +#[test] +fn default_is_ultra() { + assert_eq!(Persona::default(), Persona::Ultra); +} + +#[test] +fn from_str_round_trip_all_levels() { + for p in [Persona::Off, Persona::Lite, Persona::Full, Persona::Ultra] { + assert_eq!(from_str(as_str(p)), p); + } +} + +#[test] +fn from_str_case_insensitive() { + assert_eq!(from_str("ULTRA"), Persona::Ultra); + assert_eq!(from_str("Lite"), Persona::Lite); + assert_eq!(from_str("OFF"), Persona::Off); +} + +#[test] +fn from_str_unknown_falls_back_to_default() { + assert_eq!(from_str("nonsense"), Persona::default()); + assert_eq!(from_str(""), Persona::Off); +} + +#[test] +fn off_text_is_empty() { + assert_eq!(text(Persona::Off), ""); +} + +#[test] +fn ultra_text_contains_ultra_marker() { + let t = text(Persona::Ultra); + assert!(t.contains("ultra")); + assert!(t.len() > 100); +} + +#[test] +fn full_text_contains_caveman() { + let t = text(Persona::Full); + assert!(t.to_lowercase().contains("caveman")); +} + +#[test] +fn lite_text_is_shorter_than_full() { + assert!(text(Persona::Lite).len() < text(Persona::Full).len()); +} diff --git a/tests/test_redundancy.rs b/tests/test_redundancy.rs new file mode 100644 index 0000000..14703a4 --- /dev/null +++ b/tests/test_redundancy.rs @@ -0,0 +1,66 @@ +use squeez::context::cache::SessionContext; +use squeez::context::redundancy::{check, record}; + +fn lines(prefix: &str, n: usize) -> Vec { + (0..n).map(|i| format!("{}-{}", prefix, i)).collect() +} + +#[test] +fn second_identical_run_hits() { + let mut ctx = SessionContext::default(); + let out = lines("a", 10); + record(&mut ctx, "git status", &out); + let hit = check(&ctx, &out); + assert!(hit.is_some()); + let h = hit.unwrap(); + assert_eq!(h.call_n, 1); + assert_eq!(h.short_hash.len(), 8); +} + +#[test] +fn diff_by_one_line_misses() { + let mut ctx = SessionContext::default(); + let mut out = lines("a", 10); + record(&mut ctx, "ls", &out); + out[0] = "different content".to_string(); + assert!(check(&ctx, &out).is_none()); +} + +#[test] +fn outside_recent_window_misses() { + let mut ctx = SessionContext::default(); + let target = lines("first", 10); + record(&mut ctx, "first", &target); + // Push 17 more distinct calls to push target outside RECENT_WINDOW=16 + for i in 0..17 { + record(&mut ctx, &format!("c{}", i), &lines(&format!("f{}", i), 10)); + } + assert!(check(&ctx, &target).is_none()); +} + +#[test] +fn tiny_output_skipped() { + let mut ctx = SessionContext::default(); + // MIN_LINES=2: a single-line output should never match + let out = lines("x", 1); + record(&mut ctx, "echo", &out); + assert!(check(&ctx, &out).is_none()); +} + +#[test] +fn two_line_output_matches() { + // MIN_LINES=2: a 2-line output is eligible for redundancy + let mut ctx = SessionContext::default(); + let out = lines("x", 2); + record(&mut ctx, "git status", &out); + let hit = check(&ctx, &out); + assert!(hit.is_some()); +} + +#[test] +fn record_increments_call_n() { + let mut ctx = SessionContext::default(); + assert_eq!(record(&mut ctx, "a", &lines("a", 10)), 1); + assert_eq!(record(&mut ctx, "b", &lines("b", 10)), 2); + assert_eq!(record(&mut ctx, "c", &lines("c", 10)), 3); +} diff --git a/tests/test_session.rs b/tests/test_session.rs index 1d3d818..2e33314 100644 --- a/tests/test_session.rs +++ b/tests/test_session.rs @@ -99,3 +99,10 @@ fn test_unix_to_date_epoch_zero() { let date = squeez::session::unix_to_date(0); assert_eq!(date, "1970-01-01", "got: {}", date); } + +#[test] +fn test_home_dir_returns_nonempty() { + // HOME (Unix) or USERPROFILE (Windows) must be set in any real environment. + let home = squeez::session::home_dir(); + assert!(!home.is_empty(), "home_dir() returned empty string"); +} diff --git a/tests/test_summarize.rs b/tests/test_summarize.rs new file mode 100644 index 0000000..4105b13 --- /dev/null +++ b/tests/test_summarize.rs @@ -0,0 +1,70 @@ +use squeez::config::Config; +use squeez::context::summarize::{apply, should_apply}; + +fn cfg(threshold: usize) -> Config { + let mut c = Config::default(); + c.summarize_threshold_lines = threshold; + c +} + +#[test] +fn should_apply_under_threshold_false() { + let c = cfg(100); + let lines: Vec = (0..50).map(|i| format!("l{}", i)).collect(); + assert!(!should_apply(&lines, &c)); +} + +#[test] +fn should_apply_over_threshold_true() { + let c = cfg(100); + let lines: Vec = (0..200).map(|i| format!("l{}", i)).collect(); + assert!(should_apply(&lines, &c)); +} + +#[test] +fn summary_caps_total_output() { + let lines: Vec = (0..5000).map(|i| format!("line {}", i)).collect(); + let out = apply(lines, "cargo build"); + assert!(out.len() <= 40, "summary too long: {} lines", out.len()); +} + +#[test] +fn summary_preserves_tail() { + let lines: Vec = (0..1000).map(|i| format!("L{}", i)).collect(); + let out = apply(lines, "x"); + assert!(out.contains(&"L999".to_string())); + assert!(out.contains(&"L990".to_string())); +} + +#[test] +fn summary_drops_head() { + let lines: Vec = (0..1000).map(|i| format!("L{}", i)).collect(); + let out = apply(lines, "x"); + assert!(!out.contains(&"L0".to_string())); + assert!(!out.contains(&"L500".to_string())); +} + +#[test] +fn summary_extracts_top_errors() { + let mut lines: Vec = (0..600).map(|i| format!("noise {}", i)).collect(); + lines.push("error: type mismatch on line 42".to_string()); + let out = apply(lines, "cargo check"); + let joined = out.join("\n"); + assert!(joined.contains("top_errors")); + assert!(joined.contains("type mismatch")); +} + +#[test] +fn summary_includes_total_lines() { + let lines: Vec = (0..777).map(|_| "x".to_string()).collect(); + let out = apply(lines, "cmd"); + assert!(out.iter().any(|l| l == "total_lines=777")); +} + +#[test] +fn summary_starts_with_header() { + let lines: Vec = (0..600).map(|_| "x".to_string()).collect(); + let out = apply(lines, "git diff HEAD"); + assert!(out[0].starts_with("squeez:summary cmd=")); + assert!(out[0].contains("git diff HEAD")); +} diff --git a/tests/test_track_result.rs b/tests/test_track_result.rs new file mode 100644 index 0000000..d6a4d87 --- /dev/null +++ b/tests/test_track_result.rs @@ -0,0 +1,76 @@ +use squeez::commands::track_result::run_with_dir; +use squeez::context::cache::SessionContext; +use std::path::PathBuf; + +fn tmp(label: &str) -> PathBuf { + let d = std::env::temp_dir().join(format!( + "squeez_track_result_{}_{}", + label, + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .subsec_nanos() + )); + std::fs::create_dir_all(&d).unwrap(); + d +} + +#[test] +fn read_tool_records_file_path() { + let dir = tmp("read"); + let json = r#"{"tool_name":"Read","tool_input":{"file_path":"/abs/src/main.rs"},"tool_result":{"content":"fn main() {}"}}"#; + assert_eq!(run_with_dir("Read", json, &dir), 0); + let ctx = SessionContext::load(&dir); + assert!(ctx.seen_files.iter().any(|f| f.path == "/abs/src/main.rs")); + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn grep_tool_no_panic() { + let dir = tmp("grep"); + let json = r#"{"tool_name":"Grep","tool_input":{"pattern":"TODO","glob":"*.rs"},"tool_result":{"content":"src/foo.rs:42: // TODO: refactor"}}"#; + assert_eq!(run_with_dir("Grep", json, &dir), 0); + // Grep result content should still extract paths + let ctx = SessionContext::load(&dir); + // The path src/foo.rs may or may not register depending on extract heuristics + let _ = ctx; + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn malformed_json_exits_zero() { + let dir = tmp("bad"); + assert_eq!(run_with_dir("Read", "garbage", &dir), 0); + assert_eq!(run_with_dir("Read", "", &dir), 0); + assert_eq!(run_with_dir("Read", "{}", &dir), 0); + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn extracts_errors_from_content() { + let dir = tmp("err"); + let json = r#"{"tool_name":"Bash","tool_result":{"content":"error: cannot find function 'foo'\nok line"}}"#; + run_with_dir("Bash", json, &dir); + let ctx = SessionContext::load(&dir); + assert!(!ctx.seen_errors.is_empty()); + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn extracts_paths_from_content_body() { + let dir = tmp("paths"); + let json = r#"{"tool_name":"Bash","tool_result":{"content":"modified: src/main.rs\nmodified: src/lib.rs\nadded: Cargo.toml"}}"#; + run_with_dir("Bash", json, &dir); + let ctx = SessionContext::load(&dir); + let paths: Vec = ctx.seen_files.iter().map(|f| f.path.clone()).collect(); + assert!(paths.iter().any(|p| p == "src/main.rs")); + assert!(paths.iter().any(|p| p == "src/lib.rs")); + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn empty_input_no_error() { + let dir = tmp("empty"); + assert_eq!(run_with_dir("Read", " \n ", &dir), 0); + let _ = std::fs::remove_dir_all(&dir); +} diff --git a/tests/test_update.rs b/tests/test_update.rs new file mode 100644 index 0000000..4765904 --- /dev/null +++ b/tests/test_update.rs @@ -0,0 +1,97 @@ +use squeez::commands::update::{ + current_version, detect_target, find_expected_sha, install_atomic, verify_sha256, +}; + +#[test] +fn current_version_matches_cargo() { + assert_eq!(current_version(), env!("CARGO_PKG_VERSION")); +} + +#[test] +fn detect_target_returns_known_value() { + let t = detect_target(); + assert!(matches!( + t, + "macos-universal" | "linux-x86_64" | "linux-aarch64" | "windows-x86_64" + )); +} + +#[test] +fn find_expected_sha_two_column_format() { + let text = "deadbeef squeez-linux-x86_64\ncafebabe squeez-macos-universal\n"; + assert_eq!( + find_expected_sha(text, "squeez-linux-x86_64"), + Some("deadbeef".to_string()) + ); + assert_eq!( + find_expected_sha(text, "squeez-macos-universal"), + Some("cafebabe".to_string()) + ); +} + +#[test] +fn find_expected_sha_missing_returns_none() { + let text = "abc squeez-linux-x86_64\n"; + assert!(find_expected_sha(text, "squeez-windows-x86_64.exe").is_none()); +} + +#[test] +fn find_expected_sha_skips_comments_and_blank() { + let text = "# checksums\n\nabc123 squeez-x\n"; + assert_eq!( + find_expected_sha(text, "squeez-x"), + Some("abc123".to_string()) + ); +} + +#[test] +fn install_atomic_writes_target_with_content() { + let dir = std::env::temp_dir().join(format!( + "squeez_update_install_{}", + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .subsec_nanos() + )); + std::fs::create_dir_all(&dir).unwrap(); + let target = dir.join("squeez"); + install_atomic(b"binary-content", &target).unwrap(); + let read = std::fs::read(&target).unwrap(); + assert_eq!(read, b"binary-content"); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let mode = std::fs::metadata(&target).unwrap().permissions().mode(); + assert!(mode & 0o111 != 0, "binary should be executable: {:o}", mode); + } + let _ = std::fs::remove_dir_all(&dir); +} + +#[test] +fn verify_sha256_known_vector_when_hasher_present() { + // sha256("abc") + let expected = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; + let ok = verify_sha256(b"abc", expected); + // Skip silently if neither sha256sum nor shasum -a 256 is available + if which("sha256sum") || which("shasum") { + assert!(ok, "sha256(\"abc\") known vector should match"); + } +} + +#[test] +fn verify_sha256_mismatch_is_false() { + if which("sha256sum") || which("shasum") { + assert!(!verify_sha256( + b"abc", + "0000000000000000000000000000000000000000000000000000000000000000" + )); + } +} + +fn which(name: &str) -> bool { + std::process::Command::new(name) + .arg("--version") + .output() + .map(|o| o.status.success()) + .unwrap_or(false) +} diff --git a/tests/test_wrap_integration.rs b/tests/test_wrap_integration.rs index edd7cc0..032f08d 100644 --- a/tests/test_wrap_integration.rs +++ b/tests/test_wrap_integration.rs @@ -37,6 +37,7 @@ fn no_squeez_bypasses_compression() { assert_ne!(out.status.code(), None); } +#[cfg(not(windows))] #[test] fn wrap_handles_pipes_via_sh() { let out = Command::new(bin()) @@ -47,6 +48,17 @@ fn wrap_handles_pipes_via_sh() { assert!(stdout.contains("HELLO")); } +#[cfg(windows)] +#[test] +fn wrap_handles_pipes_via_cmd() { + let out = Command::new(bin()) + .args(["wrap", "echo hello | findstr hello"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(stdout.to_lowercase().contains("hello")); +} + #[test] fn wrap_bypassed_command_runs_and_exits_zero() { let out = Command::new(bin())