# Changelog of KIPRIS Patent & Trademark Status-Change Monitor (`stefano_seggio/kipris-patent-trademark-status-monitor`) Actor

- **URL**: https://apify.com/stefano\_seggio/kipris-patent-trademark-status-monitor/changelog.md
- **Full Actor documentation**: https://apify.com/stefano\_seggio/kipris-patent-trademark-status-monitor.md

## Changelog

### 1.2.0 - 2026-09-19 (not yet pushed - prepared locally pending review)

Timeout-budget fix: `watchlistApplicants`/`watchlistApplicationNumbers` have
no size cap, and every watchlist entry is walked strictly sequentially, each
with its own independent retry budget. Real worst case per entry at this
Actor's own DEFAULT settings (`maxRetries=4`, `requestTimeoutSecs=30s`) is
\~165s under a real KIPRIS Plus outage - so ~22 watchlist entries (an entirely
realistic size) already exceed this Actor's own live-confirmed
`defaultRunOptions.timeoutSecs=3600s`, at just the defaults; at
`input_schema.json`'s own allowed ceiling (`maxRetries=8`,
`requestTimeoutSecs=120s`) a single entry's own worst case is ~1155s.
`src/main.ts` now tracks the run's real remaining time budget via
`Actor.getEnv().timeoutAt` and stops starting new watchlist entries (or, mid-
entry, new items) once there isn't enough of it left to safely attempt more
within the entry's own worst-case retry window (computed from the actual
configured `maxRetries`/`requestTimeoutSecs`, via a new
`estimateWorstCaseFetchMs()` in `src/http.ts`) - exiting cleanly instead of
being hard-killed by the platform, and deferring only the unattempted tail of
the watchlist to the next scheduled run (dataset items and delta state were
already persisted per-item, so nothing already processed this run is lost).
`maxItemsPerWatchlistEntry` (previously unbounded) now has a `maximum: 1000`
in `input_schema.json` as a documented ceiling on a single entry's own item
count. 5 new unit tests for the worst-case-timing math; all 23 automated
tests, `tsc --noEmit`, `npm run build`, and `npm run lint` pass clean.

### 1.1.0 - 2026-09-11

Pricing model change (Option B, requested explicitly): `byoKiprisServiceKey`
was already required input from the first build - this pass makes that the
Actor's permanent, deliberate business model rather than a stopgap, and
drops the per-event price accordingly since this Actor now carries no
KIPRIS Plus license cost of its own to recoup. `result` $0.15 -> $0.02;
`result-summary` $0.05 -> $0.008 - now in line with this fleet's other
delta-monitor rates. No code changes; `input_schema.json`'s
`byoKiprisServiceKey` description, the top-level input description, and
README were updated to state the BYOK requirement as a design decision, not
a limitation. Not yet pushed to Apify Console, so this pricing has not yet
been entered into Console's monetization setup.

### 1.0.0 - 2026-09-11

Initial build. Watchlist-driven delta monitor for Korean patent/utility-model
filings via KIPRIS Plus's real, live-confirmed bibliographic search endpoint,
with status normalized from raw text into a FILED/PUBLISHED/REGISTERED/
REJECTED/WITHDRAWN/UNKNOWN vocabulary. Per-watchlist-entry cold-start
baselining, SHA-256 dual-fingerprint delta engine, Pay-Per-Event billing
($0.15 `result` / $0.05 `result-summary`) sized to recoup this Actor's real,
quantified KIPRIS Plus license cost ($1,783/yr, independently confirmed live).

**Disclosed limitation, not hidden:** KIPRIS Plus is a paid, registered
service this build does not have a key for. The transport layer and XML
error envelope were verified live against the real server (including a
genuine `SERVICE_KEY_IS_NOT_REGISTERED_ERROR` response); the success-path
item field names are modeled on a real but unofficial third-party reference
implementation, not independently confirmed. A test-caught, fixed-before-
shipping defect would have made every successful response misclassify as a
fatal error (`fast-xml-parser` coercing `resultCode="00"` into the number
`0`) - the most consequential bug found in this fleet-expansion batch so
far. Full account in AGENTS.md. 18 automated tests, clean build/lint. Not
yet pushed to Apify Console.
