# Changelog of 1688 SKU Normalizer & Price Change Detector (`crocheted_pipa/catalogdelta-1688-sku-normalizer`) Actor

- **URL**: https://apify.com/crocheted_pipa/catalogdelta-1688-sku-normalizer/changelog.md
- **Full Actor documentation**: https://apify.com/crocheted_pipa/catalogdelta-1688-sku-normalizer.md

## Changelog

### 0.12.12

- Corrected the HTML report's price presentation: incompatible currencies, price bases, ranges, missing metadata and unmatched history no longer appear as a comparable old-to-new price pair. The report shows the current price or range and a reason for review instead of implying a conversion or a valid delta.
- Kept exact comparable-price differences, dataset fields, engine calculations, delivery policy and event prices unchanged. Historical currency/basis are not present in the result contract, so the report does not guess them.
- Added five regression tests covering these display boundaries and escaping of supplier text; all 87 automated tests and strict TypeScript compilation pass locally.

### 0.12.11

- Added a readable supplier decision brief in `RUN_REPORT` (HTML): readiness, coverage, price and stock impact, runtime cost preview, and suggested follow-up for up to 100 delivered action rows.
- Prioritized data-quality and identity checks before business actions. Preview rows are bounded, supplier text is HTML-escaped, and the report has no scripts, tracking or external resources.
- Kept validation-only and rejected reports aggregate-only. Added report-artifact status to the existing summary contract; report failure cannot invalidate saved datasets.
- Fixed quiet actionable-only runs losing their analyzed and threshold-suppressed counts when no CSV rows were written.
- Simplified the Store first-run guide and added full-export versus actionable-only pricing examples and repeat-use instructions. Existing event prices and dataset fields are unchanged.
- Added an internal monthly contribution target model that costs all analyzed rows, including suppressed records; it is conditional planning arithmetic, not actual revenue.

### 0.12.10

- Added an optional `actionable_only` delivery mode for recurring monitoring. It analyzes all valid current rows but writes and charges only action-policy-selected rows; the default `all_valid_current` mode remains backward compatible.
- Made delivery economics auditable in `catalogdelta_actor_summary_v0_10` with separate engine candidates, delivery candidates, suppressed current rows, delivered rows, and recorded custom events.
- Kept historical-only context separate and uncharged in both delivery modes; validation-only still writes no SKU-detail rows or per-SKU events while previewing the selected delivery count.
- Added safe rejection for unsupported delivery modes before product data is read, plus integration coverage for unchanged rows, threshold-suppressed price noise, and a retained stock change.
- Added local validation-only evidence linkage to the authorized-sample custody ledger. A fresh output directory receives only aggregate `run-summary.json` and `errors.csv`; file hashes must match active authorization records.
- Updated the transitive `adm-zip` dependency from 0.6.0 to 0.6.1, removing the current high-severity decompression DoS advisory without changing the direct Apify SDK version.
- Strict TypeScript compilation and all 74 automated tests pass locally. Private customer compatibility, demand, paid usage, and revenue remain unverified.
- Published Build ID `S54ZOeftqeVellnYj` as `latest`; synthetic Run `jPaP122tULKDdWAnp` verified 3 analyzed current SKUs, 1 delivered restock row, 2 suppressed rows, 1 runtime-recorded custom event, and 0 errors. The owner run produced no accounted customer charge or revenue.

### 0.12.9

- Synchronized the public Actor description with the completed 0.12.8 default-upload cloud validation. Runtime behavior is unchanged from 0.12.8.
- Recorded the successful no-mapping validation Run and kept customer-demand, revenue, and compatibility claims explicitly bounded.

### 0.12.8

- Changed the generic field-mapping template from a UI `prefill` to a documentation-only `example`. The default file-upload form can now submit `auto_detect_v1` without also submitting an incompatible non-empty mapping.
- Added an automated schema safeguard that fixes the file-upload prefill, auto-detect default, absent mapping default/prefill, and visible mapping example as separate invariants.
- Published Build ID `lpffo43ahcyeqzAly` as `latest`; validation-only Run `ZRGLqK7RyfSxVpKvw` verified the no-mapping default upload path with one valid SKU, zero errors, zero dataset rows, and zero custom SKU events.

### 0.12.7

- Tightened generic auto-detection so a product ID plus price alone is no longer treated as a usable SKU file; a recognized SKU identity is required unless the user selects Generic and maps identity attributes explicitly.
- Added strict runtime and input-schema validation for every field-mapping key, header name, attribute mapping, default currency, and default price basis. Invalid mappings now fail before remote file download or row processing instead of being silently ignored.
- Removed raw duplicate-header values from import errors while keeping stable corrective guidance.

### 0.12.0

- Added optional exact-decimal amount and percentage thresholds for price-only action rows.
- When both thresholds are set, meeting either available threshold retains the row; an unavailable sole metric is retained for review instead of being silently discarded.
- Stock changes, new rows, and non-comparable rows always remain actionable; complete results and the existing per-current-SKU billing scope are unchanged.
- Added a privacy-minimized action-filter summary with evaluated, actionable, and suppressed counts.
- Invalid threshold types, negative values, exponent notation, and overlong decimals are rejected before product processing or billing.
- Upgraded the Actor summary contract to `catalogdelta_actor_summary_v0_9`; the complete project suite now has 66 passing tests, including the local authorized-sample custody workflow and public-task configuration safeguards.
- Improved the first-run Store experience with a file-upload UI prefill, four collapsible input sections, non-submitted timestamp examples, and a goal-to-output decision table; JSON API behavior remains explicit and unchanged.
- Hardened the three fixed-date public example tasks against misleading near-term stale-data flags while preserving the 7-day default for live supplier data.

### 0.11.0

- Added a protected action-list CSV containing only current rows whose primary outcome is not `unchanged`.
- The action list includes price changes, stock changes, new SKUs, and non-comparable rows; historical-only context remains separate.
- Local CLI now writes `actionable.csv`; Apify writes `SAFE_ACTIONABLE_RESULTS_CSV` only when at least one actionable current row exists.
- `RUN_SUMMARY.csv_artifacts` reports the action-list key and row count without product content. Billing remains based on successfully saved valid current results, not on action-list size.
- Upgraded the Actor summary contract to `catalogdelta_actor_summary_v0_8` and expanded the suite to 56 passing tests.

### 0.10.0

- Added privacy-minimized `operational_impact` to both local and Actor summaries.
- Separates price increases from decreases using exact decimal deltas, and reports an explicit unknown-direction count for invariant failures.
- Separates stock changes into newly out of stock, restocked, and other transitions; also reports new, non-comparable, and historical-not-observed counts.
- Counts may overlap when one SKU has both price and stock changes; no product IDs, SKU IDs, prices, attributes, or source locations are included.
- Upgraded the Actor summary contract to `catalogdelta_actor_summary_v0_7` and expanded the suite to 55 passing tests.

### 0.9.0

- Added CatalogDelta-generated UTF-8 CSV downloads for written current results and historical-only context, with all 26 standard fields.
- Reuses the audited local formula protection and adds a UTF-8 BOM for spreadsheet compatibility.
- Validation-only and rejected runs intentionally create no SKU-detail CSV artifacts; `RUN_SUMMARY.csv_artifacts` reports fixed status, row counts, record keys, encoding, and protection method without product content.
- Treats CSV export as a non-critical convenience layer: if an artifact write fails after dataset delivery, the summary reports `partial` or `failed` and keeps the dataset as the source of truth.
- Upgraded the Actor summary contract to `catalogdelta_actor_summary_v0_6`; all 54 automated tests pass, including Actor integration checks for artifact presence and validation-mode absence.

### 0.8.0

- Added a privacy-minimized `cost_preview` to `RUN_SUMMARY`, using the current Apify runtime price for `normalized-current-sku` when available.
- Calculates custom-event estimates with decimal-string and `BigInt` multiplication rather than binary floating-point arithmetic.
- Separates the estimate from actual billing and explicitly excludes Actor-start events, platform compute/storage, taxes, and exchange fees.
- Returns a fixed unavailable reason instead of guessing when runtime PPE pricing is absent; upgraded the summary contract to `catalogdelta_actor_summary_v0_5` and expanded the suite to 54 passing tests.

### 0.7.0

- Expanded the local CLI `result.csv` from a partial view to all 26 fields in the standard result contract.
- Serializes attribute maps, change arrays, and quality flags as JSON cells for lossless machine parsing.
- Neutralizes formula-like untrusted text beginning with `=`, `+`, `-`, or `@` in local CSV output while preserving decimal fields such as negative price deltas as numbers.
- Added full-field parity and spreadsheet-formula regression tests, increasing the suite to 53 passing tests.

### 0.6.0

- Added privacy-minimized `data_readiness` to Actor and CLI summaries.
- Reports normalization, price-comparison, and inventory readiness plus aggregate counts for missing currency, range or missing prices, missing price basis, stock coverage, identity method, historical matches, and comparable prices.
- Adds deterministic action codes so users know what to correct before producing paid SKU output.
- Upgraded the Actor summary contract to `catalogdelta_actor_summary_v0_4` and expanded the suite to 51 passing tests.

### 0.5.0

- Added strict header-fingerprint auto-detection for Gycharm normal, Shopify-target, TikTok-target, and common generic files.
- Made auto-detect the default while rejecting unknown or ambiguous formats instead of guessing.
- Rejects current and previous files when they resolve to different formats.
- Added the resolved adapter version to the privacy-minimized `RUN_SUMMARY` and expanded the suite to 50 passing tests.

### 0.4.0

- Added one-click presets for the Gycharm Shopify-target CSV and TikTok-target XLSX formats, alongside the existing normal 1688 export preset.
- Extracts stable 1688 product IDs from the Shopify handle and from the documented Gycharm TikTok sample's seller-SKU pattern.
- Imports Shopify option pairs and TikTok variation pairs as normalized SKU attributes.
- Recognizes numeric inventory with common Chinese unit suffixes such as `724套`, while leaving ambiguous inventory text unknown.
- Added a dedicated file-currency field because Shopify/TikTok target exports contain local prices but do not identify the currency.
- Verified both new presets against the publisher's complete 79-row public samples with zero rejected rows and expanded the suite to 44 passing tests.

### 0.3.0

- Added validation-only mode: inspect parsing, identities, comparison outcomes, quality flags, and errors without writing SKU rows or emitting `normalized-current-sku` events. A separately priced Actor start event can still apply.
- Added privacy-minimized outcome summaries with aggregate change types, match confidence, quality flags, and error codes.
- Added direct local CLI imports for current and optional previous CSV/TSV/XLSX files, with explicit observation times and optional field mapping.
- Tightened CSV safety checks so the 200-column limit applies to every row, not only the header.
- Expanded the regression suite from 38 to 42 passing tests.

### 0.2.1

- Published under the technical name `catalogdelta-1688-sku-normalizer` with updated Store SEO metadata and result preview.
- Completed a 1,000-current-SKU cloud run with 1,000 saved results and 1,000 custom billing events.
- Completed a cloud XLSX run using the public Gycharm normal-export sample with 151 accepted rows.
- Published and verified three standalone tasks for normalization, price comparison, and stock change detection.

### 0.2.0

- Added direct CSV, TSV, GB18030 CSV, and XLSX upload support with configurable field mapping.
- Added the source-backed `gycharm_1688_export_v1` adapter for the vendor's public normal-export workbook.
- Rejects reversed or equal snapshot times and flags materially future observations.
- Makes attribute alias collisions deterministic and treats missing stock as unknown instead of a stock change.
- Reports partial delivery when the platform spending limit prevents a result from being saved and charged.
- Added strict TypeScript checking, real-format validation evidence, and expanded regression coverage.

### 0.1.0

- Added the candidate `taobao_export_v0_1` JSON adapter.
- Added deterministic SKU matching, fixed-point price comparison, explicit non-comparable states, and duplicate conflict handling.
- Added authorization confirmation, per-snapshot 10,000 raw SKU limits, and privacy-minimized summaries.
- Added separate current-result and unbilled historical-context datasets.
- Added safe `normalized-current-sku` PPE handling with configuration and budget guards.
