Filed from views-pipeline-core's epic views-platform/views-pipeline-core#339. Two small asks; the first is free.
1. Bump the pipeline-core pin — you inherit a Tier 1 fix with no code change
pipeline-core's search_files_by_metadata was unpaged: Appwrite returns 25 rows by default, and get_latest_file_id sorted those and called the result "latest" — so with more than 25 matching documents it returned the newest of the oldest 25, silently, and staler every run.
This reaches you. _ContractStorePort.latest_file_id (views_postprocessing/unfao/managers/unfao.py) feeds ADR-013 resolve_run, whose manifest lookup uses the broad HOP_A_MANIFEST_FILTERS = {"category": "forecast", "type": "sampled_forecast_manifest"} — every manifest ever published matches. Shard lookups are name-scoped and unique, so they resolve fine for whichever run was selected. Net effect: the delivery can assemble and ship a stale run rather than failing.
Because you import pipeline-core's DatastoreModule rather than keeping your own client, the fix arrives with a pin bump — no code change on your side. Tracked as views-pipeline-core C-241; fixed in #341.
Ask: bump the pin once #341 merges, and confirm a delivery selects the run you expect.
2. Declare your own appwrite dependency
You use Appwrite (5 code references) but declare it nowhere — you free-ride on pipeline-core's transitive dependency. pipeline-core is making appwrite an optional extra (#345), because three repos that never mention Appwrite currently install its SDK (CRP). Once that lands, the transitive path disappears.
Ask: declare appwrite in your own pyproject.toml, or depend on views-pipeline-core[appwrite].
Not an ask — a compliment worth recording
Your _ContractStorePort docstring — "DIP — wire/source_selection and wire/sink never see Appwrite types" — describes exactly the architecture this epic is trying to reach elsewhere. Of your ~826 Appwrite-adjacent lines, only ~130 are genuinely vendor-coupled; the rest is FAO delivery logic that belongs with you. Nothing structural is being asked of you.
Filed from views-pipeline-core's epic views-platform/views-pipeline-core#339. Two small asks; the first is free.
1. Bump the pipeline-core pin — you inherit a Tier 1 fix with no code change
pipeline-core's
search_files_by_metadatawas unpaged: Appwrite returns 25 rows by default, andget_latest_file_idsorted those and called the result "latest" — so with more than 25 matching documents it returned the newest of the oldest 25, silently, and staler every run.This reaches you.
_ContractStorePort.latest_file_id(views_postprocessing/unfao/managers/unfao.py) feeds ADR-013resolve_run, whose manifest lookup uses the broadHOP_A_MANIFEST_FILTERS = {"category": "forecast", "type": "sampled_forecast_manifest"}— every manifest ever published matches. Shard lookups are name-scoped and unique, so they resolve fine for whichever run was selected. Net effect: the delivery can assemble and ship a stale run rather than failing.Because you import pipeline-core's
DatastoreModulerather than keeping your own client, the fix arrives with a pin bump — no code change on your side. Tracked as views-pipeline-core C-241; fixed in #341.Ask: bump the pin once #341 merges, and confirm a delivery selects the run you expect.
2. Declare your own
appwritedependencyYou use Appwrite (5 code references) but declare it nowhere — you free-ride on pipeline-core's transitive dependency. pipeline-core is making
appwritean optional extra (#345), because three repos that never mention Appwrite currently install its SDK (CRP). Once that lands, the transitive path disappears.Ask: declare
appwritein your ownpyproject.toml, or depend onviews-pipeline-core[appwrite].Not an ask — a compliment worth recording
Your
_ContractStorePortdocstring — "DIP —wire/source_selectionandwire/sinknever see Appwrite types" — describes exactly the architecture this epic is trying to reach elsewhere. Of your ~826 Appwrite-adjacent lines, only ~130 are genuinely vendor-coupled; the rest is FAO delivery logic that belongs with you. Nothing structural is being asked of you.