In-place append

Your compressed archive is now also an appendable log. Add rows without re-encodingwhat is already there: the new rows become a new independent frame, the original frames' bytes are copied verbatim (append-only, never re-compressed), and only the SHA-256 integrity trailer is recomputed. This closes the previously-missing appendable archive gap.

Append rows

at1 append trades.at1 newrows.csv --output trades2.at1
# new rows -> a new INDEPENDENT frame
# original frames' bytes -> copied VERBATIM (append-only, never re-compressed)
# only the SHA-256 integrity trailer is recomputed

at1 append trades.at1 newrows.ndjson --output trades2.at1   # CSV or NDJSON

Lossless + verified

Append is exact by construction: decode(append(archive, rows)) equals decode(archive) + rows byte-for-byte, and the re-stamped integrity trailer re-verifies. The original bytes are never rehydrated — they are simply carried across.

# lossless + verified, by construction:
#   decode(append(archive, rows)) == decode(archive) + rows   (byte-for-byte)
at1 integrity trades2.at1     # the re-stamped trailer re-verifies
at1 decode    trades2.at1 -   # == original decode, then the appended rows

Chain it — every prior frame stays byte-identical

Append again and again. Each step adds one new frame; every frame written before it is left byte-identical, so the archive grows as an append-only, tamper-evident record.

# chained appends keep every PRIOR frame byte-identical
at1 append trades.at1   day2.csv --output trades.d2.at1
at1 append trades.d2.at1 day3.csv --output trades.d3.at1
# frame 0 (the original) is the same bytes in all three archives

Still queryable & aggregatable

An appended archive stays a queryable analytical store: query and aggregate merge their results across all frames, so a SUM or a predicate spans the whole grown archive while every frame stays byte-exact.

# the appended archive stays QUERYABLE and AGGREGATABLE across frames —
# query/agg merge results across every frame
at1 query trades2.at1 --where price:44000:44100
at1 agg   trades2.at1 price --op sum

From an AI agent (MCP)

The MCP server exposes append as a typed tool (mirrored by an SDK helper), so an agent can grow an archive in place:

at1_append(at1_path="trades.at1",
           rows_path="newrows.csv",
           output_path="trades2.at1")
#   -> new frame appended; original frames untouched; trailer re-verified

Decoding and verifying are always free and never need an account; the append path is metered against the account whose API key the host process supplies — same as the rest of AT-1's encode path.