Jayinaksha / Slate

Documentation agent/Rust · Python · Cloud Run

Slate

Send it anything. Ask for the document later.

Write a line, send a photo of a whiteboard, leave a voice note — Slate keeps it without asking where it belongs. Ask for a document and it writes one in your organisation’s format, cites every block, and asks you about anything it cannot support.

3Surfaces, one backend
0Models in the capture path
RLSTenancy in Postgres
1Drafting path for every surface
Slate · inbox00:00.00
Everything captured, nothing filed until it can be cited.
§ 01

The demo

One narrated take against the deployed system. Pick a chapter to jump to it.

§ 02

How a document gets written

“Write the ward handover.” Decided without a model, drafted with one, and parked as a question when the material runs out.

  1. 01

    Route it — no model

    The gateway decides deterministically whether this is a thought to keep, a question, or a document to write.

    slate_core::route()
  2. 02

    Retrieve in the gateway

    It announces the tenant, then searches material, facts and approved guidance. A chat has no session token, so retrieval cannot live in the agents.

    Cloud SQL · row-level security
  3. 03

    Draft with sources inline

    One model call returns blocks, each naming its sources; the agent searches the body for each block to compute its exact span.

    slate-ai → Vertex AI
  4. 04

    Ask, or file

    If a required section has nothing behind it, the run is parked and the question goes back on the surface you asked from — answerable later, from another device. Otherwise it is filed with its citations.

    status = awaiting · or · artifact + citations
§ 03

An agent cannot read another team’s documents

Every content table carries tenant_id under FORCEd row-level security, so a query that forgets its WHERE returns zero rows, not someone else’s. The agent service has no route to Postgres at all — it goes through the same /api/* door as the dashboard.

The policy tests run against a real Postgres as a non-superuser, because a superuser bypasses RLS and would make a broken policy look like a passing test.

slate-gatewayholds DATABASE_URL slate-aiagent token only Postgrestenant_id = slate_tenant() /api/* no route