Skip to main content
Exports land in a bucket as Parquet, CSV or JSONL, usually partitioned by date. The partition prefix doubles as a resumable watermark, and a new object landing is a natural trigger.

What you need

  • Read access to the export prefix
  • An Octave workspace API key, from Settings → Integrations
  • An AWS account to deploy into

Where this runs

A Lambda triggered by the bucket itself is the shortest path: an object lands, the function reads it, maps it and posts. Keep the backfill separate — it is a different shape of job and it will not fit in a Lambda invocation.

The prompt

Copy this into Claude Code, Cursor or any coding agent. It carries the whole flow — reading your warehouse, mapping the columns, posting to Octave, and deploying the result. Fill in section 1 with your real schema and a few sample rows (read the Parquet schema off one file with pyarrow.parquet.read_schema(), or head -5 a CSV or JSONL object). The more of your actual data it can see, the less it has to guess.
The instruction to show the mapping as a table and wait for confirmation is the part worth keeping. Without it an agent guesses at your column names and buries the guess inside a handler, where a wrong eventType looks exactly like a right one until the data is in.

Hints worth adding

These are the things that go wrong with Amazon S3 specifically. Paste whichever apply into section 1 of the prompt — an agent cannot infer them from a schema. Parquet timestamps are not milliseconds. The format stores an explicit unit, and us and ns are both common — neither is what Octave reads a large integer as. Tell the AI which unit schema_arrow reports, or ask it to convert to ISO 8601 at the mapping step rather than passing integers through. Object listing truncates at 1000 keys. Worth stating outright, because a pipeline that silently imports only the first thousand files looks like it worked. Re-running a partition is meant to be cheap. If eventId is mapped from a stable key, a replay comes back as preSkipped rather than duplicating anything. Say so, or the AI may build elaborate bookkeeping to avoid re-reads it does not need to avoid.