fdGovernance layer for enterprise AI workers

What they learn stays.
Swap the model at will.

Your AI workers live on individual laptops today — change the machine, the account or the model and everything they built up goes back to zero. fdelink brings them into the organization: one set of boundaries · approvals · audit, one conversation thread continued across 7 harnesses, with profile, memory, ledger and evaluations that belong to the organization instead of to a device.

Self-hosted Multi-tenant isolation + RLS Personal output can stay on your own disk

One worker, moved between these harnesses without losing its memory

Claude Code Codex CodexLoom Gemini CLI OpenCode Kimi Code Grok CLI
The problem

AI keeps getting better at the work. What the organization accumulates is still zero.

The models are fine; the container is wrong. Treat AI as a one-off call and every run starts from nothing. Treat it as a member of the organization and accumulation becomes possible.

One-off calls
  • Every task spawns a stateless process that has no idea who it is
  • Finishes one thing and forgets it; you re-explain the context next time
  • New model, new device, new account → everything resets
  • What it may do lives in the prompt; nothing stops it from overstepping
  • No verifiable record of what it did — when something breaks you can't trace it
Long-term worker (fdelink)
  • Hired means provisioned: a dedicated working directory and a persistent thread
  • Every round carries identity · boundary · space memory · recent work summary
  • Continuity assets live in the org: profile / memory / retros / ledger / evaluations
  • Boundaries are a server-side constraint — hitting the API directly is refused too
  • Every round is signed by the worker itself; alter one entry and the break is named
7
Harnesses supported
thread continuation + conflict exclusion
25
Domain collections
local JSON ⇄ Supabase, one codebase
69
Executable rule assertions
one command re-runs them all
5
Roles × permission matrix
every decision made server-side
Core concepts

Six things decide whether AI can be treated as a colleague

Each one lands in the server and the execution layer — not in a UI label that says “governed”.

01 / Long-term worker

Threads continue, even across accounts

Threads are isolated by “harness @ execution identity”: switch account or device and a new thread is built; switch back and the old one is found again. We never force-resume another account's session. When hard continuity breaks, ledger summaries carry the context instead.

Lifecycle standby → running → idle → archived; archived ≠ deleted
02 / Loop engineering

Keep the loop running, keep judgment with people

Any item can be promoted to a loop: each round the worker reports done / todos / gate / whether the goal is met, and maintains its own backlog. When a human call is needed it raises a gate into “waiting on you” — and if other work is available it does that instead of idling.

Two rounds with no structured report → a gate is raised automatically, quota isn't burned
03 / Signed custody chain

Audit proves itself; verification is yours

Every worker and every person holds an ed25519 identity, and each worker round is signed by the worker. Audit is written twice — a display table and an append-only signed chain where each entry carries the previous hash. Change any row in the database and verification names the break.

/api/chain/verify is open — don't trust us, check
04 / Two-track data ownership

Private work stays local, team work goes to the cloud

Pick ownership when syncing: run records in a personal space stay on local disk and the cloud keeps only an index and summaries; team spaces sync in full. The same worker can switch “follow / keep local / to cloud” per round.

What the promise really means: delete the cloud database and your personal output is still on your own disk
05 / Skills and connectors

Connect once, use everywhere; credentials never enter the worker process

Skills and MCP configuration are scanned from the actual machine and synced up; for credentials only the environment-variable key name is recorded — values never reach the database. Connectors get one of three policies: unrestricted / read-only declaration / hard-blocked at execution, where a blocked connector's tools are physically removed at dispatch.

Loosening a policy from blocked → logged as [high risk] in audit
06 / Evaluation and gene iteration

Test items come from real work, not from leaderboards

Items are generated out of real tasks: L1 assertions plus L2 review, with the reviewing harness kept separate from the executing one. Scoring on two harnesses gives attribution — a gap under the threshold means the bottleneck is the gene itself, and improvement suggestions are generated automatically.

One harness, no attribution; an unfinished round scores an invalid 0
One closed loop

From one agent on a laptop to one worker in the organization

Discovery and sync are the entrance, boundary and approval are the gate, ledger and evaluation are the return path — complete one turn and the organization owns an asset that depends on nobody's computer.

01 Discover & sync scan · strip keys 02 Boundary no boundary, no work 03 Assign & approve one path · handoff 04 Harness run context · continuity 05 Ledger & audit signed · replayable 06 Evaluation items ← real tasks 07 Retro & memory failures become cards 08 Gene iteration benchmark decides → back into the profile
gate where a human must be present runs automatically write-back: this turn's result is the next turn's starting point
Governance

The rules live on the server, not in the front end

Bypass the UI, call the API directly, and you meet the same rules — that is the difference between governance and a UI that says “governed”. Every line below has a matching executable assertion; run them once and you know.

  • No boundary, no work: no listing and no loop ownership either
  • Three quota layers refuse at the ceiling: org / worker / person, tokens and cost
  • Assigned ≠ allowed: a chained handoff still passes boundary and approval
  • External or production needs approval first: below the matrix level means suspended
  • External trust domains can't initiate: they reply only when @-mentioned, locked server-side
  • Platform admins can't read the business: egress redaction + permission rows locked
  • Full seats refuse hiring: moved to the waitlist, never oversold
  • Triple key stripping: on ingest, on stored data, on export
  • Unfinished rounds are invalid: unfinished work doesn't get a score
  • One harness, no attribution: a single sample draws no conclusion
  • Deletion protection: depended-on people, your own tenant and platform-admin rows can't be deleted
  • Winding down ≠ deleting: ledger, audit and evaluations are kept permanently
  • Level upgrades need a reason: no reason, no upgrade
  • Role write guard: every management write from a member is 403
  • The custody chain is verifiable: change one entry and the break is named
  • Tenant isolation: request-scoped tenant context + database RLS
python3 scripts/verify-prd.py  → 69 rule assertions python3 scripts/e2e.py  → 17 main flows, 60 checks bun test  → rule kernel and auth
Role permission matrix
RoleCanCannot
memberassign / reply / hold a seat / waitlistevery management write (403)
tenant_adminall governance within the tenant
platform_adminoperations: snapshots / stripping / tenant directorybusiness reads and writesegress redaction + 403 on business writes; permission rows can't be changed or deleted
space_leadprofile / level / memory / loops / retros for workers in the spacecross-space management (403)
externalreplies only when @-mentionedinitiating anything (locked server-side)

Even “who are you” is decided on the server. Roles are injected by the upstream gateway, but the injection has to be verifiable: the gateway HMAC-SHA256s “role · tenant · expiry” with a shared secret and the server recomputes it. Swapped role, swapped tenant, swapped key, expired — all four forgeries are rejected. In production a missing secret refuses startup; we don't serve on half a configuration.

Marketplace

A worker that does well can be hired by someone else

A creator lists a worker (no boundary declaration, no listing; the materials are generated for you) → review → the hiring side gets a long-term instance the moment it hires. Three billing models, revenue accrued per real round.

SEAT · per seat
70%
Seat subscription; when seats are full hiring is refused and the request is waitlisted
USAGE · metered
70%
Billed on real rounds and consumption; stops at the quota ceiling
ONCE · one-time
80%
A one-time purchase; hiring provisions a dedicated long-term instance

Percentages are the creator's revenue share. A boundary declaration is required before listing — the marketplace does not accept workers without one.

Deployment

Get it running on a laptop first, then move it unchanged into your own data center

One codebase, two stores: with no configuration it writes local JSON; with Supabase configured it uses the relational model and RLS.

Runtime

Containerized, one command to serve

Multi-stage build (front end compiled → the runtime image carries only artifacts and server source), runs as non-root, and tini forwards SIGTERM so a graceful shutdown actually receives the signal.

Liveness /api/health (never touches storage) · readiness /api/ready (actually touches it)
Data boundary

Self-hosted; data never leaves your network

Request-scoped multi-tenant isolation + database RLS. Personal-domain run records stay on the user's own disk while the cloud keeps only index and summaries, and for credentials only environment-variable key names are stored.

Signing keys go into the customer's KMS at delivery
Portability

Before you switch machines, you get the truth

The portability ruling walks local harnesses, skills and connectors item by item and decides for each gap whether it can be auto-filled; one-click repair restores skills into local directories, and same-name-different-content is refused rather than overwritten.

No pretending it will run
FAQ

You'll probably ask these first

Is fdelink replacing tools like Claude Code and Codex?

No. Those are the harnesses; fdelink is the governance layer above them. Your people keep the CLI they like, and fdelink brings the workers running on those tools into the organization — giving them boundaries, keeping the ledger, running the evaluations, and carrying profile, memory and thread across when the harness changes.

Is “swap the model at will” really seamless?

Two layers. Hard continuity is native thread resumption (--resume / exec resume), with threads isolated by “harness @ execution identity” — a new account rebuilds the thread, switching back finds the old one. When hard continuity breaks, soft continuity covers it: every round injects identity, boundary, space memory and the last 3 round summaries. We tested it by simulating an account switch, and the worker answered a passphrase from a round on the previous account using the ledger summary alone.

Can a worker overstep — say, send internal material outside?

The boundary is a server-side constraint, not a polite line in a prompt. Assignment is the only path and it walks the boundary check and the approval matrix step by step; a connector marked blocked has its tools removed from the available set at dispatch; an object in an external trust domain cannot even initiate. Calling the API directly meets the same decisions.

Can you alter the audit records yourselves?

Audit is written twice: a display table and an append-only signed chain where each entry carries the previous hash, and each worker round is signed with the worker's own key. Change any one of them and the verification endpoint names where the break is. Verification is in your hands — you don't have to trust our word for it.

Can the company see the personal work I do?

It depends on ownership. Run records in a personal space are written to the user's own machine and the cloud keeps only index and summaries; only team spaces sync in full. The same worker can switch “keep local / to cloud” per round, and the ledger records the switch and the reason for it.

How do you tell whether an AI worker is actually any good?

Test items come from real tasks, not from public leaderboards. L1 assertions plus L2 review, with the reviewing harness separate from the executing one. The same items run on two harnesses: a gap under the threshold means the bottleneck is the worker's gene (prompt and configuration) rather than the model, and the system generates improvement suggestions from that. With only one harness sample, no attribution is made.

Move your AI workers out of personal laptops and into the organization

We can run the demo on one of your own real scenarios: sync a worker you already use and walk the whole circle — boundary, assignment, ledger, evaluation.