docs: replace roadmap with project-status checklist (#20)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 302b6b3..d9e93ac 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -41,6 +41,40 @@
 protobuf schema version* below). Subsequent builds are offline — the
 `download-maven-plugin` cache under `~/.m2/repository/.cache/` satisfies them.
 
+## Build prerequisites
+
+- JDK 17 or newer.
+- Rust toolchain (stable, installed via [rustup]).
+- [`tpchgen-cli`] — only needed to generate test data for the Parquet
+  integration test (`cargo install tpchgen-cli`).
+
+Maven is bundled via the `./mvnw` wrapper; no separate Maven install required.
+
+[rustup]: https://rustup.rs/
+[`tpchgen-cli`]: https://github.com/clflushopt/tpchgen-rs
+
+## Build and test
+
+    make test
+
+This builds the native Rust crate and runs the JUnit tests. The steps can be
+run individually:
+
+    cd native && cargo build
+    ./mvnw test
+
+The native library must be built before running JVM tests.
+
+## Test data
+
+The Parquet integration test reads TPC-H SF1 data (~345 MB across 8 tables in
+Snappy-compressed Parquet). Generate it once with:
+
+    make tpch-data
+
+Tests that need this data skip cleanly if it is missing. `make clean` does
+**not** remove `tpch-data/` — delete it manually to reclaim the disk space.
+
 ## Code style
 
 - Java: run `./mvnw spotless:apply` before committing. CI fails the build if
diff --git a/README.md b/README.md
index f613008..21637cd 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,13 @@
 # Apache DataFusion Java
 
-Java bindings for [Apache DataFusion], the Rust-based query engine. SQL queries
-run in native code and results are returned to the JVM as [Apache Arrow] record
-batches via the Arrow C Data Interface — no per-row JNI calls, no row-by-row
-copies.
+Java bindings for [Apache DataFusion]. Queries run in native Rust and results
+return to the JVM as [Apache Arrow] batches via the Arrow C Data Interface.
 
 [Apache DataFusion]: https://datafusion.apache.org/
 [Apache Arrow]: https://arrow.apache.org/
 
-> **Project status: early development.** This is a brand-new project. The API
-> is small, will change without notice, and there is no published release. Do
-> not depend on it from production code yet. Bug reports, design feedback, and
-> contributions are very welcome.
+> Early development: no releases yet, API will change. Bug reports and
+> contributions welcome.
 
 ## Quickstart
 
@@ -32,97 +28,55 @@
          ArrowReader reader = df.collect(allocator)) {
         while (reader.loadNextBatch()) {
             var batch = reader.getVectorSchemaRoot();
-            // ... consume batch ...
+            // ...
         }
     }
 }
 ```
 
-The current public surface mirrors a small slice of the Rust DataFusion API:
+`SessionContext` and `DataFrame` are `AutoCloseable` and not thread-safe.
 
-- `SessionContext.sql(String query)` — parse and plan a SQL query, returning a
-  lazy `DataFrame`. No execution happens yet.
-- `DataFrame.collect(BufferAllocator allocator)` — execute the plan and return
-  the result batches as an `ArrowReader`. Consumes the DataFrame; the caller
-  closes the reader, and the allocator must outlive it.
-- `SessionContext.registerParquet(String name, String path)` — register a local
-  Parquet file as a SQL table.
+## Project status
 
-Both `SessionContext` and `DataFrame` are `AutoCloseable` and **not
-thread-safe**.
+Query interfaces:
 
-## Prerequisites
+- [x] SQL: `SessionContext.sql(String)`
+- [x] DataFrame: `select`, `filter` (other transformations TBD)
+- [x] DataFusion-Proto `LogicalPlanNode`: `SessionContext.fromProto(byte[])`.
+      The `datafusion-proto` Java classes are generated by the build.
 
-- JDK 17 or newer
-- Rust toolchain (stable, installed via [rustup])
-- [`tpchgen-cli`] — only needed to generate test data for the Parquet
-  integration test (`cargo install tpchgen-cli`)
+Data sources:
 
-Maven is bundled via the `./mvnw` wrapper; no separate Maven install required.
+- [x] Parquet via `registerParquet` / `readParquet`, with `ParquetReadOptions`
+- [ ] CSV, JSON, Avro
+- [ ] Custom catalog and table providers
 
-[rustup]: https://rustup.rs/
-[`tpchgen-cli`]: https://github.com/clflushopt/tpchgen-rs
+Results:
 
-## Build & test
+- [x] `DataFrame.collect(allocator)` — Arrow C Data Interface stream
+- [x] `DataFrame.count()`, `show()`, `show(int)`
+- [x] `SessionContext.tableSchema(String)`
 
-    make test
+Not yet:
 
-This builds the native Rust crate and runs the JUnit tests. The steps can be
-run individually:
+- [ ] `SessionConfig` / `RuntimeEnv` knobs
+- [ ] Java UDFs
+- [ ] `write_*` outputs
 
-    cd native && cargo build
-    ./mvnw test
+## Requirements
 
-The native library must be built before running JVM tests.
+JDK 17+. Building from source: see [CONTRIBUTING.md](CONTRIBUTING.md).
 
-## Test data
-
-The Parquet integration test reads TPC-H SF1 data (~345 MB across 8 tables in
-Snappy-compressed Parquet). Generate it once with:
-
-    make tpch-data
-
-Tests that need this data skip cleanly if it is missing. `make clean` does
-**not** remove `tpch-data/` — delete it manually to reclaim the disk space.
-
-## Repository layout
+## Layout
 
 - `src/` — Java sources and tests
-- `native/` — Rust crate that exposes DataFusion over JNI and the Arrow C Data
-  Interface
-
-## Roadmap
-
-Near-term priorities, roughly in order:
-
-- **Session configuration.** Expose `SessionConfig` and `RuntimeEnv` settings
-  (target partitions, batch size, memory pool, default catalog, …) so callers
-  can tune execution from the JVM.
-- **Full `SessionContext` and `DataFrame` APIs.** Expand beyond `sql` and
-  `registerParquet` to mirror the Rust API: table registration variants,
-  `read_*` / `write_*` entry points, and DataFrame transformations such as
-  `select`, `filter`, `join`, `aggregate`, `sort`, plus result-materialization
-  variants (`show`, `count`, streaming collection).
-- **JVM-side plan construction via Protobuf.** Build DataFusion logical and
-  physical plans on the JVM using the existing DataFusion Protobuf
-  representation, then ship them to the native side for execution. This lets
-  plans assembled by other JVM tools (Spark, Flink, Beam, custom planners) run
-  on DataFusion without having to go through SQL.
-- **Java-defined expressions.** Allow user expressions / UDFs to be implemented
-  in Java and invoked from the native plan, operating on Apache Arrow vectors
-  (Java side) so evaluation stays vectorized end-to-end and avoids row-by-row
-  JNI crossings.
-
-These are intentionally large items — design discussion via GitHub issues
-before implementation is welcome.
+- `native/` — Rust crate (JNI + Arrow C Data Interface)
 
 ## Contributing
 
-This project follows the Apache DataFusion contribution model. Issues and pull
-requests are welcome — please open a GitHub issue to discuss any significant
-change before sending a PR.
+Open an issue to discuss non-trivial changes before sending a PR.
+See [CONTRIBUTING.md](CONTRIBUTING.md).
 
 ## License
 
-Licensed under the [Apache License, Version 2.0](LICENSE.txt). See
-[NOTICE.txt](NOTICE.txt) for required attributions.
+Apache License 2.0. See [LICENSE.txt](LICENSE.txt) and [NOTICE.txt](NOTICE.txt).