Platform · Data · The system of record

Tables

Agent output that dies in a chat window isn't work — it's a transcript. And automations pointed at a shared spreadsheet write with no permissions, no attribution, and no way to tell which robot wrecked which column. A table is the system of record the workforce reads and writes under rules: per-verb permissions on every agent, an author on every write, and triggers that fire the next agent when the data changes.

Create your first table The governance layer
At a glance
  • Shared byhumans · agents · teams · employees
  • AccessR / C / U / D per agent, per table
  • Defaultswrite verbs off, Delete off
  • Every writeattributed in the audit trail
  • Automationrow events + cron fire agents
  • Data in / outCSV · Sheets · form · API
IN A SOLUTION PACK

In a pack, these tables arrive pre-wired: schema, triggers, and agent permissions already set.

See Solution Packs →
app.turtlecoworker.com/tables
A candidate-pipeline table: typed columns with agent-written score and interview fields beside human-entered notes, a colour-coded AI column, and the triggers toolbar visible
One table, two kinds of author: agent-written scores beside human notes, every write on the record.
Why it's built this way

A workforce without a system
of record is a chat log.

The failure mode has two halves. Half one: the agent's result scrolls away in a chat window and a human copy-pastes it into the real system. Half two: you wire the agent into a shared spreadsheet, and now software with no judgment holds the same unrestricted grid access as your most senior person.

Tables close both. Results land as typed rows next to the records they concern — durable, queryable, shared. And every agent writes under per-verb permissions enforced at runtime, with its name on every write. The grid is governed the way the rest of the platform is: least privilege, attribution, and an audit trail that writes itself.

See it work

Five jobs. One governed grid.

Pick a job. Each one is the same idea — durable state humans and agents share, with verbs granted per agent and an author on every write.

A candidate pipeline lives in a spreadsheet three automations and eight recruiters all write to. Nobody can say which robot changed which column. Moved into a table, the same grid works — under rules.

01Each agent gets its verbs

The screening agent holds Read + Update on the score columns; the scheduler holds Update on interview fields; Delete is off for every agent. Grants are per verb, enforced at runtime.

02Writes carry their author

A score changes and the activity feed says which agent set it and when — next to the note a recruiter typed. No more spreadsheet archaeology.

03A status flip fires the next step

When Status changes to shortlisted, a trigger runs the outreach agent with the row's columns mapped in. The chain runs off the data, not off glue code.

4
independent verbs per agent per table — Read, Create, Update, Delete — write verbs off by default.
How it's embedded

The state your whole workforce runs on.

Pull your data in from anywhere; every agent, team and employee reads context from it and writes results back — permission-scoped and attributed.

You connect
CSV / Excel importGoogle Sheets syncWeb formsREST API
internal & external: your systems
Tables
the system of record the workforce reads and writes under rules
Your workforce uses it
Agentsread context, write results — R/C/U/D scoped
Teamseach sub-agent scoped to its own tables
Employeesfile work and track state, under the same verbs
Triggersa row change fires the next agent
Anatomy of a table

A spreadsheet's ease. A database's rules. An audit trail's memory.

Six things the grid does that a shared spreadsheet never will.

01 · Shared state

One typed grid the whole workforce works in.

Agent output that lives in a chat window is a result someone has to go find. A table makes it state: typed columns — Text, Number, Date, Select, Boolean, URL, Email, File, a relational Foreign Key, an agent-computed AI Enrich — with a primary key every relation and every write resolves to. Humans and agents read and write the same validated rows, so a screening agent's score sits in the column next to the note a recruiter typed.

  • Typed columns validate on save — agents never act on free-text mush
  • Foreign Keys relate tables, so agents join across records
  • Humans and agents share one grid: no export, no shadow spreadsheet
A table grid with mixed human and agent-written columns: typed cells, a Select column as chips, an AI-enriched score column colour-coded
One grid, two kinds of author: typed, validated, shared
02 · Per-verb permissions

Every agent holds exactly the verbs you granted.

A shared spreadsheet gives every robot the whole sheet. Here, access is granted per agent, per table, per verb: Read, Create, Update, Delete — four independent switches, enforced at runtime on every operation. Write verbs are off by default, and Delete stays off unless someone deliberately turns it on. A bad run can't drop rows it was never allowed to touch. This is the same posture as the rest of the governance layer: least privilege, enforced where the action happens.

  • R / C / U / D granted per agent, per table — enforced on every call
  • Create, Update and Delete off by default; you widen deliberately
  • Source tables read-only, target tables just the writes the job needs
The per-agent table access panel: one agent's grants across tables, with Read/Create/Update/Delete toggles and Delete off
Four verbs per agent per table — Delete earns its switch
03 · Attribution

Every write says which robot did it, and when.

When an automation wrecks a column in a shared spreadsheet, the investigation is archaeology. Here every write — human or agent — lands in an audit log with the author attached. Open a row and its activity feed reads like a ledger: which agent set the score, which person changed the status, at what time. An AI-computed field carries its provenance and a re-run control, so 'where did this value come from' is a glance, not a meeting.

  • Every row write attributed: the agent or person, the field, the time
  • AI fields carry provenance — see which agent computed a value, re-run it on demand
  • Agent operations land in the same audit trail as the rest of the run
A row detail drawer: fields inline-editable beside an activity feed attributing each change to an agent or user with timestamps
The row as a ledger: every value, its author, its moment
04 · Triggers

A row change fires the next agent. No glue code.

The grid is also the event bus. A trigger watches for a row created, a row updated, a specific column changing, or a cron schedule — optionally gated by a condition — and runs an agent when it fires, mapping the row's columns into the agent's inputs and the agent's output back into a column. That write can trip the next trigger, so a chain of work runs itself off the data changing.

  • Fire on row created · row updated · a watched column · a schedule, with conditions
  • Columns map into agent inputs; the output maps back to a column
  • One agent's write is the event that starts the next — chains, not scripts
A table's triggers panel: one trigger card showing its event type, condition, the agent it runs, and column-to-input mappings
The trigger: an event, a condition, an agent, a mapping
05 · Versioned automation

Triggers are configuration, and configuration is versioned.

An automation that quietly changed last month is an automation you can't audit. Trigger configuration here is immutably versioned, and runs are pinned to the version they executed under — so when a trigger's behavior is questioned, you can see exactly what mapping and condition were in force at the time, not what they are today.

  • Trigger config immutably versioned; edits create a new version
  • Runs pin to the config version they executed under
  • 'What was this automation doing on the 3rd' is a lookup, not a guess
shot: tables-trigger-versionsThe audit trail filtered to a trigger-fired agent run: the run record with its tool calls and the pinned config version badge
The automation's own paper trail
06 · Data in, data out

Your systems flow in; your evidence flows out.

A table is the hand-off point between your existing systems and the workforce, so both directions are first-class. Import a CSV or Excel file with headers mapped before anything commits, sync from Google Sheets, take rows from the API, or open a public data-collection form. Export the other way — CSV, Excel, JSON, PDF — and both directions leave an import/export history, so even bulk moves are on the record.

  • In: CSV · Excel · Google Sheets · API · public form, header-mapped
  • Out: CSV, Excel, JSON or PDF exports of the grid or a filtered slice
  • Imports and exports are logged — bulk data movement is auditable too
The CSV import flow: file headers on the left mapped to typed table columns on the right, before commit
Headers mapped to types before a single row commits
One table, worked through

A staffing firm's candidate pipeline, run as a system.

A mid-market staffing firm moves its candidate pipeline out of a shared spreadsheet and into one table. Here's what the system does as candidates flow through — not a setup guide, the runtime behavior.

Arrive
A candidate lands as a typed row
An application comes in — through the public form or a CSV import of a job board export. It commits as a validated row: name, role, source, résumé file. The insert itself fires the row-created trigger.
Screen
The screening agent writes its scores
The trigger runs the screening agent with the row's columns mapped into its inputs. It writes a fit score and a summary back — under its Read + Update grant on exactly those columns. It holds no Delete, anywhere, so a bad run can mark a candidate wrongly but can never erase one.
Advance
Humans and agents work the same rows
A recruiter reviews the scored rows and flips Status to shortlisted. The scheduler agent updates the interview columns as slots confirm. Same grid, same rows — the recruiter's edit and the agents' writes sit in one activity feed, each with its author and timestamp.
Fire
The status flip triggers outreach
A trigger watches the Status column. The flip to shortlisted matches its condition and runs the outreach agent, columns mapped in. Nobody kicked it off; the data change did. The run is audited and pinned to the trigger's config version.
Answer
Any question about the pipeline is a lookup
Which agent scored this candidate, and when? Who moved them to shortlisted? What did the outreach agent send, under which trigger version? All of it is attributed in the audit trail — the table doubles as the pipeline's own record.
A candidate row's drawer: score and interview fields written by named agents, a status change by a recruiter, all interleaved in one attributed activity feed
The row's own record: agent writes and human edits, one attributed feed
Controls you get

Eight properties of a governed grid.

Per-verb access

Read, Create, Update, Delete — granted per agent, per table, enforced at runtime. Write verbs off by default.

Attributed writes

Every change logged with its author — agent or human — its field and its timestamp, in the row's own activity feed.

Typed schema

Columns validate on save; Foreign Keys relate tables; a primary key anchors every write and relation.

Row triggers

Row created, row updated, a watched column, or a cron schedule — with conditions — runs an agent with mapped inputs.

Versioned triggers

Trigger configuration is immutably versioned; each run pins to the version it executed under.

AI columns

A column an agent computes per row — score, category, summary — with provenance and re-run attached.

Batch runs

Filter to a segment, select it, and run an agent across the batch — re-score a backlog in one pass.

Import / export

CSV, Excel, Sheets, API and public forms in; CSV, Excel, JSON, PDF out — all of it on the record.

The payoff
4
independent verbs per agent per table — Read, Create, Update, Delete — enforced at runtime.
0
write verbs granted by default: Create, Update and Delete are off until someone turns them on.
100%
of writes attributed — the agent or person, the field, the timestamp, in the row's own feed.
0
glue code between steps: row events and schedules fire agents through versioned, audited triggers.
From the live catalog

Built on Tables.

All templates
Questions

The details, up front.

Why not just let agents write to our existing spreadsheets?
Because a spreadsheet has no per-agent permissions and no attribution. Every automation you point at it can touch every cell, and when a column gets wrecked there's no record of which one did it. A table gives each agent four independent verbs — Read, Create, Update, Delete, write verbs off by default — enforced at runtime, and logs every write with its author. It's the difference between shared access and governed access.
How is a Table different from a Knowledge Base?
A Table holds discrete facts: one row per record, typed columns, agents both read and write it under per-verb permissions. A Knowledge Base is a read-only corpus for semantic search over narrative text. Use a Table when a job needs durable, queryable state the workforce acts on; use a Knowledge Base when a worker needs reference material to ground its answers in.
What exactly can I restrict an agent to?
Four independent permissions per agent per table: Read, Create, Update, Delete. Read is the default grant; Create, Update and Delete are off until someone turns them on. They're enforced when the operation executes, not when the plan is written — an agent without Delete cannot drop a row no matter what its prompt says. The same runtime-enforcement stance as the rest of the governance layer.
Who did what to this row — can I actually answer that?
Yes, from the row itself. Every write is logged with its author (agent or person), the field, the old and new context, and the timestamp. AI-computed fields also carry provenance — which agent computed the value and when — with a re-run control. Agent operations additionally land in the platform-wide audit trail alongside the rest of their run.
What can fire an automation, and what runs?
A trigger fires on row created, row updated, a specific watched column changing, or a cron schedule — optionally gated by a condition on the row's values. It runs a sequential agent, mapping the row's columns into the agent's inputs and the output back into a column. Trigger runs are audited and pinned to the trigger's config version like any other run.
How does data get in from our current systems?
Import a CSV or Excel file with headers mapped to typed columns before anything commits, sync from Google Sheets, write rows through the API, or open a public data-collection form for submissions from outside the workspace. On insert, triggers fire and AI columns populate — incoming data is workforce-ready as it lands, and the import itself is logged.
Next rung on the ladder

Tables hold your facts. Knowledge Bases hold your know-how.

Knowledge Bases Governance