# Changelog of Federal Contract Awards – New Winners Feed (`cce_partners/federal-contract-award-winners-feed`) Actor

- **URL**: https://apify.com/cce_partners/federal-contract-award-winners-feed/changelog.md
- **Full Actor documentation**: https://apify.com/cce_partners/federal-contract-award-winners-feed.md

## Changelog – Federal Contract Awards – New Winners Feed

### 0.1.11 (2026-10-16, beta)

- Monitors with `emitUnchanged` on no longer list some awards twice after an interrupted run. When the next run re-sends the unfinished batch free of charge and the search returns the same awards again as unchanged, each award now comes once (the free, `resentFree: true` copy) and is not charged. An award that really changed in the meantime (an amendment) still comes as its own paid row.
- Clearer message when another run holds the monitor's lock: it says "under limited permissions" only when Apify really refused to show that run's status. Other causes are named plainly (a run status the Actor doesn't know, or a failed status request).
- The same message (and the README) now says how long a run that is still running can keep the monitor: until it ends, at the latest at its own run timeout (1 hour by default). A crashed or frozen run frees it after 10 minutes.
- Start charge: a run that stops because another run holds the lock still pays Apify's start event. That event is charged by the Apify platform itself when the run starts, before the Actor's code runs, so the Actor can't skip it. The README says so; prices are unchanged.
- No change for runs without a monitor name (they never read or write the monitor storage).

### 0.1.10 (2026-10-16, beta)

- Rows re-sent free of charge after an interrupted run now come first, before the run's new rows. So at most 10 rows are ever re-sent free in one run, even when two runs in a row are cut off (0.1.9 sorted them in by date, and after two interruptions in a row up to 20 could come).
- Re-sent rows are marked `resentFree: true` in the dataset (normal rows don't have the field), and the status headline counts them separately, e.g. "15 award rows (5 new, 0 DoD newly visible, 10 re-sent free)".
- Safer monitor lock: a run checks that it still holds the monitor's lock right before every single write to the saved state, not only before groups of writes. If its own lock hasn't been refreshed for 9 minutes (for example the storage was unreachable), it stops saving, pushing and charging, and the status line says "this run's monitor lock expired, so it stopped saving, pushing and charging". The next run re-sends the unfinished batch free; nothing is lost and nothing is charged twice.
- A run that is still being aborted or timing out now keeps its monitor lock until it has really finished (where its status can be read; on Apify the 10-minute rule applies as before).
- A graceful abort or the run's own timeout stop now waits up to 20 s (was 6 s) for the batch in progress, but never past the run's timeout, so the lock is always released before the platform stops the run.
- Runs without a monitor name are unchanged: they never read or write the monitor storage.

### 0.1.9 (2026-10-16, beta)

- Monitors no longer lose rows when a run is cut off in the middle of delivering. Rows are delivered in batches of 10. If a run was killed partway through a batch (out of memory, a forced abort, a crash, a failed write to the dataset, or a graceful stop whose batch took longer than 6 s), up to 10 rows of that batch used to be skipped for good. Now the next run of the monitor sends that whole batch again (up to 10 rows), free of charge and on top of its `maxItems` (0.1.9 sorted these rows in with the run's new rows; from 0.1.10 they come first). Some of those rows may be ones you already received; none is ever charged twice.
- The status message says when this happens ("Re-sent N rows free of charge ...").
- Runs that stop normally, gracefully or at their own time limit work exactly as before: every row is delivered and charged once.
- Runs without a monitor name are unchanged (nothing saved, the newest awards in the lookback window).
- README: the "two runs of one monitor" and "crash or abort during delivery" notes now describe this, and correct an old line that said a takeover could charge a row twice (it couldn't; it could skip rows, which is what this release fixes).

### 0.1.8 (2026-10-15, beta)

- README only; no change in how the Actor runs or what it returns.
- The other GovCon suite Actors are now listed under their current Store names: SAM.gov Scraper – New Contract Opportunity Alerts, Expiring Federal Contracts – Recompete Radar, and SEC Form D Scraper – New Startup Funding Raises.
- The Limits section now links to the SAM.gov Scraper for SAM.gov award notices.

### 0.1.7 (2026-10-15, beta)

- An empty monitor name is now accepted. Tools such as n8n and Make send `"monitorName": ""` for a field left blank; that input used to be rejected and the run failed. An empty name now works exactly like no name: the newest awards in the lookback window, nothing saved. The older `stateKey` field works the same way.
- Monitor names still accept only letters, digits, `-` and `_` (up to 100 characters), and names that use the reserved record suffixes (`-SEEN-`, `-PENDING`, `-JOURNAL`) are still refused.
- The README now says plainly that only runs with a monitor name return just the new awards, and it links the other GovCon suite Actors.

### 0.1.6 (2026-10-15, beta)

- Public changelog rewritten in plain language (this file). No behavior change from 0.1.5.

### 0.1.5 (2026-10-15, beta)

- Short run time limits now still return results. The time held back before the run ends scales with the timeout (20% of the total, between 5 s and 60 s), so a 60 s run can deliver instead of returning 0 rows.
- Status notes for rows saved by an interrupted run now use the real delivered and undelivered counts, written after delivery finishes.
- Default run timeout in the Actor definition is 3,600 s (platform launch defaults are set separately).

### 0.1.4 (2026-10-15, beta)

- Stopping a run no longer double-charges or skips rows. A graceful abort or a near-timeout stop finishes the batch in progress, releases the monitor lock, and leaves undelivered rows for the next run.
- Delivery stops about 60 s before the run timeout so there is time to finish cleanly.
- Monitor names that collide with reserved record suffixes (such as `-SEEN-` or `-PENDING`) are rejected at once.
- If USAspending's agency list can't be read after retries, the run stops instead of searching with unchecked names.
- Abort and timeout status wording clarified.

### 0.1.3 (2026-10-15, beta)

- Awarding agency names are checked against USAspending before any search; unknown names stop the run with suggestions.
- Search time budget (`searchTimeBudgetSecs`) stops all searches cleanly when it runs out and saves position for the next run.
- Rows over `maxItems` that were saved by an interrupted run stay pending and come on the next run.
- On a monitor's first window, older DoD rows are recorded as seen (not charged) so they don't flood the first delivery.
- Concurrent runs that lost the monitor lock save nothing more and don't erase delivered ids.
- Spending limit is checked before each push so a run can't overcharge by one row.

### 0.1.2 (2026-10-15, beta)

- First public beta of the New Winners Feed.
- Stateless default (no `monitorName`): newest awards in the lookback window, nothing saved.
- Named monitors keep per-search position, seen awards, and pending rows across runs.
- Journaled delivery in batches of 10 so a crash mid-push doesn't double-charge.
- NAICS codes must be 2, 4 or 6 digits.
- DoD delayed awards (about 90 days) are flagged and can be included when they become visible.
- Parent company resolution and competition fields from USAspending award detail.
