Good afternoon
The mesh is handling the routine. Here's what needs you.
Mesh health
Target is 85%+ by week 16 with zero high-severity policy failures.
Division load
OnlineFull mesh
65 agents, 0 links, 0 messages
Agent bus
Needs your approval
From a crew of agents to a self-running mesh
v1 set out 32 agents in 7 divisions around one orchestrator. v2 turns that into a network. Agents send each other typed messages, settle routine decisions among themselves, and every capability is a versioned block you can add, swap or roll back.
Nine layers, one nervous system
Events flow down through the layers and decisions flow back up. Only the connector layer can touch the outside world, and it only accepts actions that carry a valid policy verdict and, where required, a signed human approval.
How agents talk and decide
Agents never call each other directly. They publish typed messages to the Agent Bus, which checks each message against a contract and a talk-permission list. Every decision falls into one of five modes, so the routine ones never wait for a human.
Live scenario: a partner referral becomes a retainer client
{
"id": "msg_01JBX4Q8",
"ts": "2026-10-29T09:31:22Z",
"from": "referral", "to": "crm",
"intent": "handoff", // request|handoff|propose|verify|vote|decide|escalate|ack|nack|event
"contract": "lead.referred@1",
"trace_id": "tr_9f2c", "job_id": "job_7d1e",
"tenant": { "partner_id": "ptn_042", "client_id": null, "brand_id": "zinerge" },
"confidence": 0.92, "risk": "low", "blast_radius": "internal",
"decision_mode": "solo",
"payload": { "company": "acme.example", "need": "website + growth retainer" },
"expects": ["ack"], "ttl_s": 3600,
"idempotency_key": "ref:ptn_042:acme.example"
}# Evaluated by the Decision Arbiter on every 'decide' message rules: - when: "money.amount > 0" mode: human # all spend, pay and commission - when: "blast_radius == 'public' and first_time" mode: human - when: "guard.verdict == 'HOLD'" mode: block # never overridable by agents - when: "conflict.between_agents" mode: arbiter - when: "confidence >= 0.85 and risk == 'low'" mode: solo - when: "0.65 <= confidence < 0.85" mode: peer_check # second agent verifies - when: "decision.kind in ['lead_fit','vendor_pick','hire_shortlist']" mode: quorum voters: 3 min_agree: 2 - default: escalate
Snap in agents, apps and rules
Everything in the mesh is a block with a manifest: agents, skills, connectors, policy packs, workflows, memory collections, widgets and portal modules. The Block Registry tests each one, runs it in shadow, then canary, then live. Adding a capability is a manifest and a test file, not a rebuild. Press Snap block on the command centre to watch one plug in.
kind: agent id: renewal-guardian version: 0.3.0 division: clients mission: "Protect every retainer renewal from T-120 days to signature." model: { main: claude-sonnet-5-5, classify: claude-haiku-5-5 } autonomy: L2 listens: [client.health.changed, retainer.renewal.due] emits: [renewal.plan.proposed, approval.requested] talks_to: [account, qbr, finance, approvals, arbiter] capabilities: [crm.read, retainer.read, docs.draft, email.draft] policies: [client-comms, money-needs-human] decision: { default: solo, below_confidence: { 0.8: arbiter } } limits: { cost_per_day_gbp: 3, actions_per_hour: 40 } map: { code: RG, icon: refresh } # appears on the mesh automatically tests: ./tests/*.json # min 10 cases, run on every change rollout: shadow # shadow -> canary(10%) -> live
65 agents in 11 divisions
Each agent has one mission, explicit triggers, the smallest possible tool set and an autonomy level. New in v2: People for your international team, Partners for global referral partners, Clients for annual-fee retainers, Delivery for project work, plus mesh-control agents in Command and Knowledge.
A follow-the-sun team, run by the People division
Staff and contractors across time zones become one continuous production line. The Follow-the-Sun Dispatcher hands open work to whichever hub is online, with a handover note. Capacity, timesheets, onboarding, access and pay preparation run in the background, and every payment waits for your approval.
## Handover · EMEA → South Asia · 15:00 UTC Open jobs: 7 Blocked: 1 Due in next 8h: 3 - [Client 4] Landing page QA: 2 issues left (mobile nav, form) owner → Dev Hub B · files: /client-4/lp-v3 · ETA 18:00 UTC - [Client 9] Monthly report: data pulled, needs narrative owner → Content Hub B · template: qbr-v2 - BLOCKED [Client 2] DNS change waiting on client IT next action → Account Manager chases at 09:00 client time Decisions taken by agents: 14 (log: /handover/2026-10-29) Needs a human: contractor invoice (EMEA-07), scope change (Client 2)
People-data rules
- Personal data stays in the People schema with row-level security. Agents outside the division only see names, roles, skills and availability.
- Pay, rates and bank details are never sent to a model. The Pay Prep agent works with IDs and totals, and a human releases the payment.
- Transfers of personal data across borders need a lawful mechanism, such as UK IDTA or EU SCCs. Confirm these with your adviser.
- Employment status, right to work and local labour law vary by country. Agents flag deadlines and missing documents but never decide status.
- Offboarding revokes every connector token and shared drive within one hour, logged by the Access Steward.
General guidance, not legal advice.
Two loops, one revenue engine
Referral partners bring clients in, and annual-fee clients stay and grow. The two loops meet at Deal won. From there the mesh tracks the attribution, the commission owed, the retainer's health and the renewal date, and checks in with you only where money or commitments are involved.
tiers: registered: { first_year: 10% } silver: { first_year: 12.5%, renewal: 3% } gold: { first_year: 15%, renewal: 5% } basis: fees_received # not invoiced attribution: first_registered_wins window_days: 180 clawback: { if_cancelled_within_days: 90 } currency: partner_local # FX at payment date payout: human_approval # always
const health = 0.25 * delivery_on_time + 0.20 * hours_burn_vs_plan + 0.20 * sentiment_30d // email + calls + 0.15 * sla_adherence + 0.10 * engagement // portal, meetings + 0.10 * payment_timeliness; // 80+ healthy · 60-79 watch · <60 at risk // at risk → Renewal Guardian opens a save plan
T-120: health review + risk flags T-90: QBR and value report (approve) T-75: expansion ideas from Expansion Scout T-60: renewal proposal draft (approve) T-30: contract out via e-sign (approve) T-14: chase + escalate to you if unsigned T-0: renewal invoice draft (approve) T+1: partner renewal commission calc
Less human input, by earning it
v2 runs on management by exception. Agents start one level below their target and get promoted on evidence: how often their drafts are approved unchanged, eval scores and incident count. You see exceptions, money and first-time public actions. The routine runs without you.
| Action | Decided by | Can become automatic when |
|---|
Controls the model can't talk its way past
Safety is enforced in code at the boundary of each tool call, not by prompt discipline. A connector only accepts a write action that carries a signed approval token, and the agent process can never mint that token.
export async function preToolUse(ctx, tool, input) { if (await killSwitch.isOn(ctx.agentId)) return deny("paused"); if (await budget.exceeded(ctx.agentId, ctx.tenant)) return deny("budget"); const cap = registry.capability(tool.name); // from connector manifest if (!ctx.granted.includes(cap.id)) return deny("not granted"); if (cap.mode === "write") { const ok = await tokenService.verify(input.approval_token, { // separate process job: ctx.jobId, action: cap.id, payloadHash: hash(input) }); if (!ok) return deny("no valid approval token"); } await audit.write(ctx, tool.name, redact(input)); return allow(); }
Claude at the core, everything else is plumbing
Claude runs every agent loop. ChatGPT Pro stays alongside as a second opinion, research partner and image generator. The rest is chosen so that apps, brands, staff and partners can be added as data, not code.
| Job | Recommended | Alternatives | Why |
|---|
Everything is a row, so everything scales
Agents, blocks, brands, staff, partners and clients are all data. The mesh, the roster and the dashboards read the same tables, which is why a new agent or partner shows up everywhere on its own.
create table blocks (id text, version text, kind text, division text, manifest jsonb, stage text default 'draft', tests_passed int, primary key(id, version)); create table bus_messages (id text primary key, ts timestamptz default now(), from_agent text, to_agent text, intent text, contract text, trace_id text, job_id uuid, tenant jsonb, confidence numeric, risk text, payload jsonb, status text, idempotency_key text unique); create table decisions (id uuid primary key, trace_id text, mode text, voters text[], outcome text, rationale text, policy_rule text, decided_by text, created_at timestamptz default now()); -- People create table hubs (id text primary key, name text, tz text, work_start time, work_end time); create table staff (id uuid primary key, hub_id text, kind text, -- employee|contractor role text, skills text[], weekly_hours int, status text, started_on date); create table capacity (staff_id uuid, week date, planned_h numeric, booked_h numeric); create table timesheets (id bigserial, staff_id uuid, client_id uuid, job_id uuid, hours numeric, day date, approved bool); create table handovers (id uuid, from_hub text, to_hub text, note_md text, open_jobs uuid[], created_at timestamptz); -- Partners create table partners (id uuid primary key, name text, country text, tier text, status text, health int); create table referrals (id uuid, partner_id uuid, company text, registered_at timestamptz, status text, deal_id uuid, attribution text); create table commissions (id uuid, partner_id uuid, client_id uuid, basis numeric, rate numeric, amount numeric, currency text, status text, approved_by uuid, due_on date); -- Retainer clients create table clients (id uuid primary key, name text, country text, partner_id uuid, owner uuid, status text); create table retainers (id uuid, client_id uuid, annual_fee numeric, currency text, hours_per_month int, start_on date, renew_on date, sla jsonb, status text); create table health_scores (client_id uuid, day date, score int, factors jsonb); create table change_requests (id uuid, client_id uuid, summary text, est_hours numeric, in_scope bool, status text);
Desktop for oversight, phone for decisions
On desktop you get the full mesh with every agent, message and division. On a phone the same data collapses to a minimal view: a division orbit, six numbers and the approval queue, so you can clear a day's decisions in a few minutes.
| Screen | Answers | Key elements |
|---|
Build the controls first, then the crew
Each phase has an exit test. Don't start the next phase until the current one passes. Tick steps as you go; progress is saved in this browser only. The full 108-task plan lives in the build tracker and docs/TASKS.md.
You're signed in as a viewer, so these boxes are read-only. Sign in with the admin login to update build progress.
Every live property, one glance
The rest of the Zinerge / Gulan Group portfolio, pinged directly from your browser. This is a real reachability check, not simulated data, unlike the mesh and queue elsewhere on this page.
ZCC Central Command
This dashboard. Static, self-contained, served from z-cc.link.