How I operate · leadership and AI

Set direction. Hold the bar.

How I lead people, put agents to work, and keep responsibility clear. The rules, the fleet, and the work built under my direction.

The rules

AI helps me think better, then do more.

Start with the right question.

Before asking AI for an answer, get clear on the decision. What am I trying to achieve? What is getting in the way? What would a useful answer help me do?

Example prompt: “Help me identify the question I need to answer before I make this decision.”

Give it the context.

Explain the situation, the people involved, the outcome, and the constraints. Give the AI a role that fits the problem. Better context gives it something useful to think with.

Example prompt: “Here is the situation and what I’m trying to achieve. Act as a thought partner with experience in this kind of decision.”

Ask it to interview me.

Context, role, interview, then task. Have the AI ask questions one at a time before it recommends a path. The interview exposes what I have left out and helps me clarify my own thinking.

This site's redesign started with a ten-question interview. Two of my assumptions didn't survive it.

Challenge my thinking.

I use AI as a thought partner. Ask it to test the assumptions, find the weak argument, and make the case for another approach. Its value includes helping me see what I missed.

Example prompt: “What am I assuming? Where is my reasoning weak? What would change your recommendation?”

Turn insight into action.

Once the direction is clear, give AI a specific task and define what good looks like. It can draft, analyze, and build. I review the work against the outcome and direct the next revision.

I sent an early goals dashboard back for a rebuild because the clean screen hid broken states. Looking finished was not the standard.

Own the decision.

AI expands what I can consider and accomplish. I still bring the judgment, make the call, and take responsibility for the result. Agents draft; people decide what leaves the building.

Every send from the agent fleet waits for a person to approve it.

Influenced by Geoff Woods’ The AI-Driven Leader. These are the practices I use to think with AI and put the thinking to work.

The fleet

Seven agents run the operating work of my job.

Reporting and pipeline analysis, chief-of-staff duties, marketing and social-selling drafts, and the internal tooling I run from: wikis, dashboards, the revenue brain. Each agent is its own cloud service with its own tests, migrated into a monorepo with a documented rollback plan and a health-gated cutover.

The loop. Strategy sets the targets, the forecast, and the focus. The fleet does the work: reporting and pipeline, chief of staff, marketing and social drafts, wikis, dashboards, the brain. Every send waits at a human gate. Outcomes feed the next strategy call.

The flagship is the Rocks dashboard. I run my quarterly goals off it and twice a week it drafts the leadership standup. Spec before code, relational SQL chosen over key-value with the reasoning written down, and a Box-note sync and a spreadsheet removed so there's one source of truth.

What's public. The shared memory engine every agent builds on is open source: full git history, 75 tests, and it never touched business data. severs-agent-shared on GitHub. The rest of the fleet stays private.

Strategy targets and forecast priorities and focus 7-agent fleet reporting + pipeline chief of staff marketing + social drafts wikis, dashboards, brain cost limits + security reviews each service tested human approval every send waits Sent or shipped outcomes feed the next strategy call

Business and personal projects

Useful at work. Useful at home.

I define the problem and direct the build; agents write the code. The business work serves teams and clients. The personal work serves my family, my interests, and my own learning.

For the business

GTM knowledge base

The structured knowledge base G2i's GTM team ran on. Scattered tribal knowledge turned into something searchable and durable. Adopted by the team.

For the business. Adopted team-wide.

Internal cost-saving tool

Replaced a paid third-party service the team relied on, keeping the workflow the team already knew and cutting a recurring annual cost.

For the business. About $1,800 a year saved.

The Agent Company's CRM

A CRM set up in the first week of the engagement. Agents did the wiring and the migration off several stitched-together tools, so the team had one system of record before the first demo.

For a client. See the working notes.

Personal and family

Recruiting OS for a softball athlete

A privacy-first recruiting operating system: a private, AI-assisted command center for the family plus an unlisted athlete profile for coaches. Prospects, performance data, outreach, in one place instead of spreadsheets and text threads.

For my daughter. Next.js, Supabase, strict privacy rails.

Fastpitch scorekeeping app

A local-first iOS scorekeeping app for one team, built in six increments, the last of them crash recovery. Because the scorebook should survive a dropped phone.

For her team. Swift 6, SwiftUI. Public repo.

The Forge: how models get post-trained

A single-page explainer on post-training, written to make the seven techniques legible to a business leader. The kind of thing I'd hand a sales team before they sit with a research lab.

Personal learning. One page, one metaphor.

Save-format reverse-engineering tool

Directed the byte-by-byte reverse engineering of a closed, undocumented game save format to build a companion tool the game doesn't offer. No spec, no docs, just the file.

Personal. Parsing, editing, re-serializing.

For the technically curious

The stack, and one trust boundary.

Turborepo and Bun workspaces, TypeScript on the native compiler, and Effect Schema enforced at every trust boundary: model output, external APIs, HTTP bodies, and the shared memory engine's write path. Correctness-only lint blocks CI. A supply-chain rule sets a seven-day minimum publish age on new dependencies so a same-day-published package can't be pulled in by accident.

The snippet is the shape of every model call in the fleet: the reply is decoded against a schema before anything downstream can touch it, and a bad reply throws instead of silently propagating malformed data.

// llm.ts, fleet-shared. Parse + validate a strict-JSON model reply. // Throws on failure. Diagnostics go to the server log, never the response. export function decodeLlmJson<A, I>( schema: Schema.Schema<A, I, never>, raw: string, label: string ): A { const candidate = extractJsonCandidate(raw); if (candidate === null) throw new Error(`${label}: no JSON object found`); const result = Schema.decodeUnknownEither( Schema.parseJson(schema), { errors: 'all' } )(candidate); if (Either.isLeft(result)) { console.warn(`[llm decode] ${label}: ${formatError(result.left)}`); throw new Error(`${label}: reply failed schema validation`); } return result.right; }