v0.4.0
Ops & retrieval-quality pass. Public OSS-grade hygiene.
Added
- GitHub Actions CI (
.github/workflows/ci.yml) —php -lmatrix across
PHP 8.0/8.1/8.2/8.3,msgfmtcatalog check, PHPStan informational job,
PHPUnit on PHP 8.1/8.2/8.3. - Release ZIP workflow (
.github/workflows/release.yml) — automatic
clean distribution zip attached to everyv*tag, with dev files excluded. readme.txtin the WordPress.org plugin-directory format (description,
installation, FAQ, screenshots, changelog, upgrade notice). Ready for
submission to wordpress.org.- PHPStan config at level 6 with a small WP stub bootstrap. Runs in CI
ascontinue-on-errorfor now — we publish results but don't fail PRs
until a WordPress stub package is added. - PHPUnit smoke tests — 35+ assertions across
Vector_Storehelpers
(filter compilation, score normalisation, dedup, cache key), the
Embedded_Connectionidempotency sniff, theMetricsclass, and the
Quantizationround-trip. Tests run on PHP 8.1/8.2/8.3 in CI. - Async reprocess via Action Scheduler —
MxChat_DuckDB_Async_Reprocess
enqueues one job per post in Action Scheduler (bundled with WooCommerce
and many WP plugins). Survives PHPmax_execution_timeon multi-thousand-
post catalogs; reports progress via a single non-autoloaded state option.
Falls back to the existing AJAX-batched path when Action Scheduler isn't
installed. New CLI command:wp mxchat-duckdb async-reprocess. - Pinecone → DuckDB migration tool —
MxChat_DuckDB_Pinecone_Migrator
pulls every vector + metadata directly from a Pinecone index via
/vectors/list+/vectors/fetchand writes them into DuckDB. No
re-embedding; pure vector copy. Resumable via a persisted pagination
token. CLI:wp mxchat-duckdb migrate-from-pinecone --api-key=… --host=… [--namespace=…]. - Parquet export / import —
Vector_Store::export_parquet()and
import_parquet()use DuckDB's nativeCOPY ... TO|FROM '...parquet'.
Enables moving between embedded ⇄ MotherDuck without re-embedding,
routine backups, and KB sharing. CLI:wp mxchat-duckdb export --path=…
andwp mxchat-duckdb import --path=…. - INT8 quantization (experimental) —
embedding_storageoption toggles
the embedding column type betweenFLOAT[N](default) andTINYINT[N].
Cuts vector storage 4×. For unit-normalised embeddings (OpenAI ada-002,
text-embedding-3-*, Voyage, BGE) the recall loss is < 1 %.
Score expression useslist_transformto dequantise at query time. The
storage layout is locked once the table contains rows; switch by exporting
to Parquet, wiping, flipping the option, re-importing. Vector_Store::storage_estimate()— surfaces vector count + bytes
estimate so admins can spot when INT8 would meaningfully help.- Packagist-ready
composer.json— homepage, support URLs, keywords,
dev-dep declarations for PHPUnit + PHPStan. Submission to packagist.org
is a one-time manual OAuth step on the user's side.
New filters / hooks
- No new public filters in v0.4.0 — existing extension points cover the new
features. The async path uses the existingmxchat_duckdb_post_content
andmxchat_duckdb_sync_bot_idfilters.
Notes
- Submitting to wordpress.org/plugins is a manual review process (~2–4
weeks). Thereadme.txtis now compliant; you still need to add at least
one screenshot (the settings page) and submit through the review queue. - Submitting to packagist.org requires a one-time OAuth grant on their
site.composer require paulargoud/mxchat-duckdbwill work after that.