diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 62ec88a..0000000 --- a/flake.lock +++ /dev/null @@ -1,61 +0,0 @@ -{ - "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 6240921..0e8e80c 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/favicon.ico b/public/favicon.ico index a8cc75b..aede303 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg index a420bd3..180c466 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -4,14 +4,7 @@ - - - - - - - - - S + + S \ No newline at end of file diff --git a/public/icons/icon-192x192.png b/public/icons/icon-192x192.png index 36ee721..0e8e80c 100644 Binary files a/public/icons/icon-192x192.png and b/public/icons/icon-192x192.png differ diff --git a/public/icons/icon-512x512.png b/public/icons/icon-512x512.png index 3de2193..0e8e80c 100644 Binary files a/public/icons/icon-512x512.png and b/public/icons/icon-512x512.png differ diff --git a/public/images/book-cover-dark-provenance.svg b/public/images/book-cover-dark-provenance.svg deleted file mode 100644 index 91434e8..0000000 --- a/public/images/book-cover-dark-provenance.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - Dark - Provenance - - Formal Verification - for the AI Age - - - COMING SOON - diff --git a/public/images/photo-silhouette.svg b/public/images/photo-silhouette.svg deleted file mode 100644 index 8e86629..0000000 --- a/public/images/photo-silhouette.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..df8ab17 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,33 @@ + + + + https://scott.scoble.me/ + 1.0 + weekly + + + https://scott.scoble.me/speaking + 0.9 + + + https://scott.scoble.me/consulting + 0.8 + + + https://scott.scoble.me/books + 0.7 + + + https://scott.scoble.me/about + 0.7 + + + https://scott.scoble.me/blog + 0.6 + weekly + + + https://scott.scoble.me/contact + 0.5 + + diff --git a/src/components/Footer.astro b/src/components/Footer.astro index a79b93e..188cb8a 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -9,78 +9,17 @@ const currentYear = new Date().getFullYear(); @@ -88,17 +27,10 @@ const currentYear = new Date().getFullYear(); @@ -180,32 +112,16 @@ const currentYear = new Date().getFullYear(); .footer-social { display: flex; - gap: 0.75rem; - flex-wrap: wrap; + gap: 1rem; } - .social-link { - display: inline-flex; - align-items: center; - gap: 0.375rem; + .footer-social a { color: rgba(255, 255, 255, 0.7); - text-decoration: none; - font-size: 0.8125rem; - padding: 0.375rem 0.625rem; - border-radius: 6px; - border: 1px solid rgba(255, 255, 255, 0.12); - transition: all 0.2s ease; + transition: color 0.2s ease; } - .social-link:hover { + .footer-social a:hover { color: var(--color-amber); - border-color: var(--color-amber); - background: rgba(200, 149, 46, 0.08); - } - - .social-label { - font-weight: 500; - white-space: nowrap; } .footer-newsletter { @@ -228,29 +144,6 @@ const currentYear = new Date().getFullYear(); font-size: 0.9375rem; margin: 0 0 1rem; } - - .footer-newsletter-success { - text-align: center; - padding: 1rem; - background: rgba(61, 90, 62, 0.6); - color: white; - border-radius: 6px; - font-size: 0.875rem; - } - - .footer-newsletter-success p { - color: white; - margin: 0; - } - - .footer-newsletter-error { - background: #dc2626; - color: white; - padding: 0.75rem; - border-radius: 4px; - font-size: 0.8125rem; - width: 100%; - } .newsletter-form { display: flex; diff --git a/src/components/Form/SharedForm.astro b/src/components/Form/SharedForm.astro index 758a8cf..c83e69b 100644 --- a/src/components/Form/SharedForm.astro +++ b/src/components/Form/SharedForm.astro @@ -20,8 +20,8 @@ const getFormFields = (): FormField[] => { switch (type) { case 'speaking': return [ - { name: 'name', label: 'Name', type: 'text', required: true }, - { name: 'email', label: 'Email', type: 'email', required: true }, + { name: 'name', label: 'Name *', type: 'text', required: true }, + { name: 'email', label: 'Email *', type: 'email', required: true }, { name: 'event_date', label: 'Event Date', type: 'date', required: false }, { name: 'event_type', label: 'Event Type', type: 'select', required: false, options: [ { value: '', label: 'Select...' }, @@ -30,19 +30,19 @@ const getFormFields = (): FormField[] => { { value: 'workshop', label: 'Workshop' }, { value: 'other', label: 'Other' }, ] }, - { name: 'message', label: 'Message', type: 'textarea', required: true, rows: 4 }, + { name: 'message', label: 'Message *', type: 'textarea', required: true, rows: 4 }, ]; case 'contact': return [ - { name: 'name', label: 'Name', type: 'text', required: true }, - { name: 'email', label: 'Email', type: 'email', required: true }, + { name: 'name', label: 'Name *', type: 'text', required: true }, + { name: 'email', label: 'Email *', type: 'email', required: true }, { name: 'topic', label: 'Topic', type: 'select', required: false, options: [ { value: '', label: 'Select...' }, { value: 'speaking', label: 'Speaking Inquiry' }, { value: 'consulting', label: 'Consulting Inquiry' }, { value: 'general', label: 'General' }, ] }, - { name: 'message', label: 'Message', type: 'textarea', required: true, rows: 5 }, + { name: 'message', label: 'Message *', type: 'textarea', required: true, rows: 5 }, ]; case 'waitlist': return [ @@ -110,9 +110,7 @@ const topicParam = Astro.url.searchParams.get('topic'); ))} @@ -120,7 +118,7 @@ const topicParam = Astro.url.searchParams.get('topic'); @@ -137,38 +135,29 @@ const topicParam = Astro.url.searchParams.get('topic'); form.addEventListener('submit', async (e) => { e.preventDefault(); submitBtn.disabled = true; - submitText.textContent = 'Sending...'; + submitText.textContent = 'Redirecting...'; errorEl.style.display = 'none'; errorEl.textContent = ''; try { - const formData = new FormData(form); - - // Use FormSubmit β€” free, no registration, delivers to scott@scoble.me - const response = await fetch('https://formsubmit.co/ajax/scott@scoble.me', { - method: 'POST', - body: formData, - }); - - const result = await response.json(); - - if (!response.ok || result.success === 'false' || !result.success) { - throw new Error(result.message || 'Failed to send message. Please try again or email directly.'); - } + // Show success message briefly, then redirect to LinkedIn + form.style.display = 'none'; + successEl.style.display = ''; // Track with Umami if available if (window.umami) { window.umami.track('form_submitted', { type, success: true }); } - // Show success - form.style.display = 'none'; - successEl.style.display = ''; + // Redirect to LinkedIn after a brief pause + setTimeout(() => { + window.location.href = 'https://linkedin.com/in/scottscoble'; + }, 1000); } catch (err) { - errorEl.textContent = err.message || 'Something went wrong. Please try again.'; + errorEl.textContent = err.message; errorEl.style.display = ''; submitBtn.disabled = false; - submitText.textContent = type === 'speaking' ? 'Send Inquiry' : type === 'contact' ? 'Send Message' : 'Join Waitlist'; + submitText.textContent = type === 'waitlist' ? 'Join Waitlist' : 'Connect on LinkedIn'; } }); diff --git a/src/components/NewsletterSignup.astro b/src/components/NewsletterSignup.astro index 784bf91..b9a4bc3 100644 --- a/src/components/NewsletterSignup.astro +++ b/src/components/NewsletterSignup.astro @@ -14,65 +14,13 @@ const { - - diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index c283135..3bb890f 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -17,7 +17,7 @@ export interface Props { const { title, description, - ogImage = '/images/hero-speaker-new.webp', + ogImage = '/social-card.png', ogType = 'website', canonicalUrl, pageType = 'home', @@ -50,7 +50,7 @@ const currentPath = canonicalUrl || Astro.url.pathname; /> - + @@ -110,4 +110,4 @@ const currentPath = canonicalUrl || Astro.url.pathname; --size-4xl: 3rem; } - + diff --git a/src/pages/404.astro b/src/pages/404.astro index 2ac5d43..31c52ba 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -4,393 +4,129 @@ import BaseLayout from '../layouts/BaseLayout.astro';
- -

This path is fallow ground

-

- Not every link leads to cultivated soil. This one hit a patch of - strip-mined earth β€” nothing grows here. - But the good news: the rest of the site is deep, fertile, and ready to explore. -

- - -
-
- -
- - - -
- -
-

Try searching for what you need, or pick a path below.

-
- - + 404 +

Page not found

+

That link doesn't lead anywhere. Maybe it moved, maybe it never existed.

+ - - + +

Can't find what you're looking for? Get in touch β€” I'll get back to you.

+ + ← Go home
diff --git a/src/pages/about.astro b/src/pages/about.astro index 1252655..db98748 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -20,7 +20,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';

Scott Scoble is a builder, writer, and speaker focused on the human side of AI systems. He's the author of The Soil Beneath the Code and A Walk in Mentoring, - and creator of Speckl β€” a compile-time provenance layer for regulated industries. + and creator of Speckl β€” a dark provenance system for agentic engineering. He advises engineering leaders on how to build AI systems that cultivate human capability instead of strip-mining it.

@@ -45,10 +45,12 @@ import BaseLayout from '../layouts/BaseLayout.astro'; - - @@ -70,31 +72,11 @@ import BaseLayout from '../layouts/BaseLayout.astro';

Three questions that change how people learn.

- - - - -
-
-

Projects

-
- -
-

Speckl

-

A state machine specification language compiler that produces auditable code with embedded provenance. Compiles SpeckDL to TypeScript, Z3 SMT verification, and compliance artifacts (PROV-O, CycloneDX, SPDX). Fulfills NIST SA-11.

+
+

Dark Provenance

+

Coming 2026

+

Formal verification for the AI age. How to audit what your AI actually did.

- -
-

ScobleClaw

-

Private

-

Agentic engineering framework β€” tools, workflows, and skills for building with AI agents. Patterns for subagent dispatch, skill-based development, and provenance tracking.

-
- -
-

Beyond the Prompt

-

Workshop presentation on using Skills and Subagents to guide AI-assisted development, demonstrated through practical architecture decisions. Built with Reveal.js and Nix flakes.

-
-
@@ -127,7 +109,7 @@ import BaseLayout from '../layouts/BaseLayout.astro'; .bio-section .section-container { display: grid; - grid-template-columns: 1fr 300px; + grid-template-columns: 1fr; gap: 3rem; align-items: start; } @@ -182,16 +164,15 @@ import BaseLayout from '../layouts/BaseLayout.astro'; .photo-placeholder { background: var(--color-cream-warm); - border-radius: 12px; - padding: 1rem; + border-radius: 8px; + padding: 4rem 2rem; text-align: center; color: var(--color-text-muted); } - .photo-silhouette { - max-width: 100%; - height: auto; - border-radius: 8px; + .photo-placeholder p { + font-size: 1.25rem; + margin: 0; } .books-section { @@ -240,69 +221,4 @@ import BaseLayout from '../layouts/BaseLayout.astro'; color: var(--color-text-muted); line-height: 1.6; } - - .projects-section { - background: white; - } - - .projects-section h2 { - font-family: var(--font-heading); - font-size: 2rem; - text-align: center; - margin: 0 0 2rem; - color: var(--color-brown-dark); - } - - .projects-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 2rem; - } - - .project-card { - background: var(--color-cream); - padding: 2rem; - border-radius: 8px; - border: 1px solid var(--color-border); - transition: transform 0.2s ease, box-shadow 0.2s ease; - } - - .project-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(0,0,0,0.08); - } - - .project-card h3 { - font-family: var(--font-heading); - font-size: 1.25rem; - margin: 0 0 0.75rem; - } - - .project-card h3 a { - color: var(--color-brown-dark); - text-decoration: none; - } - - .project-card h3 a:hover { - color: var(--color-amber); - } - - .project-card p { - margin: 0; - color: var(--color-text-muted); - line-height: 1.6; - } - - .project-visibility { - display: inline-block; - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--color-amber); - background: var(--color-cream-warm); - padding: 0.15rem 0.6rem; - border-radius: 3px; - margin-bottom: 0.5rem; - } diff --git a/src/pages/blog.astro b/src/pages/blog.astro index ae1baca..889b385 100644 --- a/src/pages/blog.astro +++ b/src/pages/blog.astro @@ -1,12 +1,10 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; -import NewsletterSignup from '../components/NewsletterSignup.astro'; ---
@@ -21,188 +19,6 @@ import NewsletterSignup from '../components/NewsletterSignup.astro';
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
- - diff --git a/src/pages/blog/50-first-dates-with-ai.astro b/src/pages/blog/50-first-dates-with-ai.astro deleted file mode 100644 index 2766d83..0000000 --- a/src/pages/blog/50-first-dates-with-ai.astro +++ /dev/null @@ -1,216 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import NewsletterSignup from '../../components/NewsletterSignup.astro'; ---- - - - -
-
- -

50 First Dates with AI: Why Your AI Forgets Everything and What to Do About It

-

- Every conversation with most AI systems is a first date. You explain your codebase. You define your conventions. You correct the same misunderstanding three times. And when you come back tomorrow, it's 2004 again β€” Drew Barrymore wakes up with no memory of who you are. -

-
- -
- -

That's anterograde amnesia. The brain can't form new long-term memories. Every interaction is fresh. Everything you've built together β€” the corrections, the preferences, the evolving understanding of your domain β€” evaporates when the session ends.

- -

I built a talk around this metaphor: 50 First Dates with AI. The response was immediate because the problem is universal. Everyone who's used an AI assistant for real work has felt the frustration. Everyone who's tried to build an agentic system has hit the wall.

- -

The wall is memory architecture. And it's the hardest problem in agentic systems because it's not a single problem; it's three problems stacked on top of each other, each pretending to be the other.

- -

The 50 First Dates Problem

- -

In the movie 50 First Dates, Drew Barrymore's character Lucy has anterograde amnesia. Every morning she wakes up and yesterday never happened. Her family adapts by leaving her notes, updating a whiteboard, re-explaining the same things every day. It's loving; it's also exhausting.

- -

This is exactly how most AI systems work. They record VHS tapes (context windows) every night and hope the agent can reconstruct enough context to be functional the next morning. The context window is the whiteboard. The system prompt is the morning briefing. And every single day, it's groundhog day.

- -

We built agentic systems with anterograde amnesia β€” not because we couldn't do better, but because it was easier than building systems that actually learn. Session-based memory is simple. It doesn't require state management, storage decisions, or curation. It just resets.

- -

But resetting is not remembering. And remembering is what makes systems compound.

- -

The Three-Layer Memory Model

- -

I've been running scobleclaw β€” my multi-agent system β€” long enough to know that memory isn't a feature you add later. It's the foundation everything else sits on. Get it wrong and your agents are expensive interns who need retraining every morning. Get it right and they compound.

- -

Here's the model that emerged from real operation, not from a whitepaper:

- -

Layer 1: Compound Memory (The Journal)

- -

This is the raw log of what happened. Every interaction, every decision, every correction, every output. Unstructured, chronological, append-only.

- -

In scobleclaw, every agent interaction writes to a daily note. Not a database table; a markdown file. Why markdown? Because it's human-readable, because it survives format changes, because in 2030 I can still open it and understand what happened. The journal is for me as much as for the agents.

- -

The key discipline with compound memory: write everything down, but don't expect the agents to read it raw. That's Layer 2's job.

- -

Layer 2: Semantic Recall (The Index)

- -

If the journal is a library, semantic recall is the card catalog. Not the books themselves; the relationships between ideas.

- -

This is where embeddings and vector search come in. The journal gets chunked, embedded, and indexed so that when an agent asks "what have we said about mentoring frameworks?" it doesn't have to read six months of daily notes. It queries the index and gets the relevant passages.

- -

But here's the trap: semantic recall without curation is just faster amnesia. You can retrieve more fragments, but you're still retrieving fragments. The index needs maintenance. It needs promotion (what matters enough to keep near the top). It needs decay (what's no longer relevant).

- -

I run a nightly process β€” REM sleep, I call it β€” that scans the day's journal, identifies patterns, and promotes significant observations to long-term memory. Without this curation step, the index bloats. You get 500 "relevant" results for every query and none of them matter.

- -

Layer 3: Coach Evaluation (The Mirror)

- -

This is the layer almost nobody builds. It's also the one that makes the difference between a system that works and a system that learns.

- -

Every agent in scobleclaw gets evaluated. Not by me directly β€” I don't have time to review every interaction β€” but by a coach agent that watches patterns over time. Did this agent complete what it said it would? Did it use the right tools? Did it match the human's voice when drafting content?

- -

The coach writes evaluations back to the journal, which feeds the index, which influences future behavior. It's a feedback loop, but a slow one. The coach doesn't intervene in real time; it reflects after the fact. That's intentional. Real-time coaching is micromanagement. Post-hoc coaching is mentorship.

- -

Why Most Memory Solutions Fail

- -

You'd think memory is a solved problem. We have databases, vector stores, logging systems. Why is this still the bottleneck?

- -

Compound memory fails when it's not human-legible. Most systems store agent interactions as structured logs or database rows. The human can't read them without a query. When the human can't read them, the human can't correct them. When the human can't correct them, the system learns the wrong lessons.

- -

Semantic recall fails when it's not curated. Vector search is magical until it isn't. Without editorial judgment β€” what to promote, what to decay, what to connect β€” the index becomes a junk drawer. Every query returns 47 "relevant" fragments and the actual insight is fragment #38.

- -

Coach evaluation fails when there's no feedback loop. Evaluations that don't change behavior are performance reviews, not coaching. The coach has to write to the journal; the journal has to feed the index; the index has to influence future prompts. Any break in that chain and you have theater, not improvement.

- -

Building for Compounding, Not Resetting

- -

The goal isn't an AI that remembers everything. The goal is an AI where today's work makes tomorrow's work better.

- -

That's compounding. And compounding requires memory that gets richer over time, not just bigger. Bigger is easy; richer is hard.

- -

If you're building agentic systems, start here. Before you worry about tools, agents, workflows, or orchestration, ask: what does this system remember? How does it recall? How does it improve?

- -

Get memory right and everything else gets easier. Get it wrong and you're dating Drew Barrymore forever.

- -
- -

This article is adapted from Scott Scoble's keynote 50 First Dates with AI. Interested in having Scott deliver this talk at your event? Connect on LinkedIn

- -
-
- - - - - - diff --git a/src/pages/blog/agentic-wars.astro b/src/pages/blog/agentic-wars.astro index 2f4363d..dddfe33 100644 --- a/src/pages/blog/agentic-wars.astro +++ b/src/pages/blog/agentic-wars.astro @@ -4,10 +4,9 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
diff --git a/src/pages/blog/ai-brain-fry.astro b/src/pages/blog/ai-brain-fry.astro index 9f111e2..df91c8a 100644 --- a/src/pages/blog/ai-brain-fry.astro +++ b/src/pages/blog/ai-brain-fry.astro @@ -3,11 +3,10 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; ---
@@ -16,61 +15,56 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; -

I'm Exhausted. Your Brain Is Reconfiguring, Not Breaking.

+

What Does AI Brain Fry Really Mean?

I'm not the only one more exhausted at the end of a workday using AI than before; apparently there's a term for that now: Brain Fry.

-

Makes sense. Your brain is reconfiguring from intonation to orchestration. That is a fundamental rewiring of how your mind spends its day. Of course it hurts.

+

The Gallup numbers are out. 80% disengaged. The heaviest AI users burning fastest. Everyone calls it a crisis. I think they're looking at it wrong.

+ +
+

Your brain is reconfiguring from intonation to orchestration. That is a fundamental rewiring of how your mind spends its day. Of course it hurts.

+

For years, your work was about producing; you held the tool, you shaped the thing, you felt the weight of it. Now the tool produces on its own and your job is to direct, to judge, to say yes or no from a distance.

-

That hurts. That doesn't mean it's broken.

+

But discomfort is not damage. Ask Arnold if he quit lifting because of discomfort.

-

Ask Arnold if he quit lifting because of discomfort.

+

The problem isn't that your brain is broken. The problem is that most people focus on the discomfort instead of looking forward through it. The key word is forward; not ahead, not onward, but forward. Direction with momentum.

-

Discomfort is not damage. A seed doesn't stay a seed. It cracks open, sends roots down, pushes a shoot up through the soil it used to be protected by. The cracking is painful. The soil used to be home. Now it's in the way. But the cracking is the point; it's not a malfunction, it's the mechanism.

+

When I'm on the move, I move. When the reconfiguration is happening, you have two choices: sit in the pain and call it burnout, or recognize it as growth and keep your eyes forward. One is a loop. The other is a ladder.

-

The problem is that most people sit in the discomfort instead of looking forward through it. The key word is forward; not ahead, not onward, but forward. Direction with momentum. When you're on the move, you move. One direction is a loop. The other is a ladder.

+

What It Looks Like

-

Intonation is the craftsman's relationship to the tool: you hold it, you feel its resistance, you adjust by touch. That's what you're losing. The architect who used to know exactly where every load-bearing wall was because she drew them herself. The engineer who could feel when a codebase was getting brittle because he'd written every third file in it.

+

They start using Copilot or Cursor. The first week is magical; three times the output, half the typing. The second week, they notice they can't remember why they chose this architecture over that one. The third week, they're tired in a way sleep doesn't fix. By month two, they're wondering if they're a good engineer anymore or just good at prompting.

-

Orchestration is different. You don't play the instrument; you tell the orchestra what to play. You hear the result. You adjust. But your hands never touch the bow.

+

That's not brain fry. That's formation.

-

The fatigue you're feeling is the gap between those two modes. Your brain is still trying to do both at once. It can't. That's the friction. That's the heat everyone calls brain fry.

+

A seed doesn't stay a seed. It cracks open, sends roots down, pushes a shoot up through the soil it used to be protected by. The cracking is painful. The soil used to be home. Now it's in the way. But the cracking is the point; it's not a malfunction, it's the mechanism.

-

But friction is not fire. Heat from formation is different from heat from burning. A blacksmith doesn't call the forge a problem; the forge is the point.

+

So What Do You Do With It

-

Elijah called down fire from heaven. Then he prayed for death. The boldness and the cost arrived in the same chapter. That's what formation looks like when you're doing it right; the capacity expands and the exhaustion lands in the same breath. Most people stop at the exhaustion. They name it burnout, name it crisis, name it brain fry. They don't look forward through it to see what's forming on the other side.

+
    +
  1. Name it. You're not fried; you're forming. The cognitive fatigue is real, but its cause is growth, not decay. When you call it decay, you treat it with rest and retreat. When you call it growth, you treat it with orientation: are you looking forward through it, or sitting in it?
  2. +
  3. Preserve the decision boundary. The most engaged engineers I know use AI for exploration; show me three ways to solve this, not execution. They make the decision. The AI provides options. The human owns the choice. This preserves agency and prevents the cognitive fatigue of endless evaluation loops.
  4. +
  5. Measure judgment, not output. If your metrics are lines of code and story points, AI will look like a miracle and you will quietly disengage. If your metrics are architectural quality, system maintainability, and team learning velocity, the picture changes. Good judgment can't be faked by an LLM.
  6. +
  7. Build for the human, not the machine. Every AI deployment should pass this test: does it make the human more capable or merely more productive? Capability compounds. Productivity extracts. The difference shows up in engagement scores within six months.
  8. +
-

What's forming is a different kind of mind. Not faster, not more productive. More selective. More directional. A mind that doesn't produce the answer but recognizes the right one when it sees it. That's not a downgrade. That's a promotion with harder work and a bigger view.

+

What I'm Building

-

The most engaged engineers I know use AI for exploration, not execution. "Show me three ways to solve this" β€” not "write this function." They make the final call. The AI provides options. The human owns the choice.

+

I'm building two things in parallel. Speckl, a compliance specification language where AI generates the spec but a human reviews and approves it before the compiler turns it into code. The human judgment is embedded as provenance; auditable, verifiable, part of the artifact. And a consultancy helping engineering leaders shift from extraction metrics to capability metrics.

-

This matters because the fatigue isn't from thinking harder. It's from the opposite: from evaluating without deciding, from reviewing without owning, from scrolling suggestions without choosing any of them. Endless evaluation loops are what drain you. The fix isn't to use AI less. The fix is to preserve the decision boundary.

+

If your team is showing signs of what the industry calls brain fry; higher error rates, faster turnover, quieter standups; the fix isn't more training. It's a structural rethink of how AI and humans collaborate.

-

If you're just approving code you didn't write and don't fully understand, you're not orchestrating. You're signing off. There's a difference. One is a conductor reading every part. The other is a rubber stamp.

- -

If your metrics are lines of code and story points, AI looks like a miracle and you slowly disengage from the work that actually matters. If your metrics are architectural quality, system maintainability, and team learning velocity, the picture changes. Good judgment can't be faked by an LLM.

- -

Judgment is the skill that compounds. Output is the thing that extracts. The difference shows up in engagement scores within six months. It shows up in retention within a year. It shows up in architecture quality within two.

- -

The question every AI deployment should answer is simple: does it make the human more capable or merely more productive? Capability compounds. Productivity extracts. Strip-mining the soil yields a great harvest this season and a dead field the next.

- -

This is not a call to slow down. Speed isn't the enemy; directionless speed is. A team with healthy soil ships faster because the structure holds, not in spite of it.

- -

This also isn't about tooling. DevEx isn't about better editors or faster completions. DevEx is about whether anything actually gets used and whether the people using it are getting better or just getting faster. Who gives a crap about things that are never used.

- -

And this definitely isn't about managing token costs. Token anxiety is a symptom of directionless work. If you optimize for outcomes, token cost is meaningless because the outcome is always more valuable. The only reason to worry about tokens is when you don't know what you're doing.

- -

What this is about is a name for what's happening right now: fear-based development. Not anxiety, not stress. Fear. The word matters. Fear that you're being replaced. Fear that you're falling behind. Fear that the discomfort means you're broken. None of those are true. But naming the fear is how you stop letting it drive.

- -

The story is that your mind is doing something it has never done before, and that hurts, and hurting while growing is different from hurting while dying.

+
+

The story is that your mind is doing something it has never done before, and that hurts, and hurting while growing is different from hurting while dying.

+

Forward is the direction. Not ahead. Not onward. Forward.

-

That's what I've got. What's your take?

+

Which way are you looking?

@@ -162,4 +156,4 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; padding: 5rem 1.25rem 3rem; } } - + \ No newline at end of file diff --git a/src/pages/blog/ai-exposes-leaders-cultivation-test.astro b/src/pages/blog/ai-exposes-leaders-cultivation-test.astro index 2b8faa6..843606c 100644 --- a/src/pages/blog/ai-exposes-leaders-cultivation-test.astro +++ b/src/pages/blog/ai-exposes-leaders-cultivation-test.astro @@ -7,7 +7,6 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; description="AI doesn't just change work β€” it exposes what kind of leader you already were. The cultivation test: give your team AI tools and watch what happens." ogType="article" canonicalUrl="/blog/ai-exposes-leaders-cultivation-test" - pageType="blog" >
diff --git a/src/pages/blog/ai-has-amnesia.astro b/src/pages/blog/ai-has-amnesia.astro deleted file mode 100644 index a631e21..0000000 --- a/src/pages/blog/ai-has-amnesia.astro +++ /dev/null @@ -1,230 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import NewsletterSignup from '../../components/NewsletterSignup.astro'; ---- - - - -
-
- -

Your AI Has Amnesia: Why Memory Architecture Is the Hardest Problem in Agentic Systems

-

- Anterograde amnesia is the perfect metaphor for how most AI systems "remember." Every session is a first date; every context window is a scrap of paper. Here's how to build memory that compounds. -

-
- -
-

Every conversation with most AI systems is a first date.

- -

You explain your codebase. You define your conventions. You correct the same misunderstanding three times in a row. And when you come back tomorrow, it's 2004 again; Drew Barrymore wakes up with no memory of who you are.

- -

That's anterograde amnesia. The brain can't form new long-term memories. Every interaction is fresh. Everything you've built together β€” the corrections, the preferences, the evolving understanding of your domain β€” evaporates when the session ends.

- -

I built a talk around this metaphor: 50 First Dates with AI. The response was immediate because the problem is universal. Everyone who's used an AI assistant for real work has felt the frustration. Everyone who's tried to build an agentic system has hit the wall.

- -

The wall is memory architecture. And it's the hardest problem in agentic systems because it's not a single problem; it's three problems stacked on top of each other, each pretending to be the other.

- -

The Three-Layer Memory Model

- -

I've been running scobleclaw β€” my multi-agent system β€” long enough to know that memory isn't a feature you add later. It's the foundation everything else sits on. Get it wrong and your agents are expensive interns who need to be retrained every morning. Get it right and they compound.

- -

Here's the model that emerged from real operation, not from a whitepaper:

- -

Layer 1: Compound Memory (The Journal)

- -

This is the raw log of what happened. Every interaction, every decision, every correction, every output. Unstructured, chronological, append-only.

- -

The journal is where most systems start and where too many stop. They store chat history and call it memory. That's not memory; that's a transcript. Transcripts are useful but they don't know anything. They just record.

- -

Compound memory becomes useful when it's searchable, when it's connected, when it starts to form patterns. The journal isn't the end state; it's the raw material.

- -

In scobleclaw, every agent interaction writes to a daily note. Not a database table; a markdown file. Why markdown? Because it's human-readable, because it survives format changes, because in 2030 I can still open it and understand what happened. The journal is for me as much as for the agents.

- -

The key discipline: write everything down, but don't expect the agents to read it raw. That's Layer 2's job.

- -

Layer 2: Semantic Recall (The Index)

- -

If the journal is a library, semantic recall is the card catalog. Not the books themselves; the relationships between ideas.

- -

This is where embeddings and vector search come in. The journal gets chunked, embedded, and indexed so that when an agent asks "what have we said about mentoring frameworks?" it doesn't have to read six months of daily notes. It queries the index and gets the relevant passages.

- -

But here's the trap: semantic recall without curation is just faster amnesia. You can retrieve more fragments, but you're still retrieving fragments. The index needs maintenance. It needs promotion (what matters enough to keep near the top). It needs decay (what's no longer relevant). It needs structure.

- -

I run a nightly process β€” REM sleep, I call it β€” that scans the day's journal, identifies patterns, and promotes significant observations to long-term memory. The criteria aren't algorithmic perfection; they're signal-to-noise. What came up multiple times? What did the human correct? What decisions were made?

- -

Without this curation step, the index bloats. You get 500 "relevant" results for every query and none of them matter. Semantic recall requires editorial judgment, and editorial judgment requires either a human or an agent trained by a human.

- -

Layer 3: Coach Evaluation (The Mirror)

- -

This is the layer almost nobody builds. It's also the one that makes the difference between a system that works and a system that learns.

- -

Every agent in scobleclaw gets evaluated. Not by me directly β€” I don't have time to review every interaction β€” but by a coach agent that watches patterns over time. Did this agent complete what it said it would? Did it use the right tools? Did it match the human's voice when drafting content? Did it ask clarifying questions or just guess?

- -

The coach writes evaluations back to the journal, which feeds the index, which influences future behavior. It's a feedback loop, but a slow one. The coach doesn't intervene in real time; it reflects after the fact. That's intentional. Real-time coaching is micromanagement. Post-hoc coaching is mentorship.

- -

The metaphor here is a sports coach watching game film. Not yelling from the sidelines; reviewing what happened and identifying patterns the player can't see themselves. The agent gets better not because it's told what to do, but because it has access to an honest record of what it did.

- -

Why This Is Harder Than It Looks

- -

You'd think memory is a solved problem. We have databases, we have vector stores, we have logging systems. Why is this still the bottleneck?

- -

Three reasons, each of which maps to the layers above:

- -

Compound memory fails when it's not human-legible. Most systems store agent interactions as structured logs or database rows. The human can't read them without a query. When the human can't read them, the human can't correct them. When the human can't correct them, the system learns the wrong lessons. Markdown daily notes are inefficient for machines; they're essential for humans.

- -

Semantic recall fails when it's not curated. Vector search is magical until it isn't. Without editorial judgment β€” what to promote, what to decay, what to connect β€” the index becomes a junk drawer. Every query returns 47 "relevant" fragments and the actual insight is fragment #38. Curation requires either human time or an agent trained to imitate human judgment. Both are expensive.

- -

Coach evaluation fails when there's no feedback loop. Evaluations that don't change behavior are performance reviews, not coaching. The coach has to write to the journal; the journal has to feed the index; the index has to influence future prompts. Any break in that chain and you have theater, not improvement.

- -

The 50 First Dates Problem

- -

Here's why the metaphor holds up. In the movie, Drew Barrymore's character can't form new memories. Her family adapts by leaving her notes, updating a whiteboard, re-explaining the same things every day. It's loving; it's also exhausting.

- -

Most AI systems are like that family. They work around the amnesia instead of solving it. They stuff more context into the prompt. They maintain elaborate state machines. They build Rube Goldberg contraptions that simulate memory without actually having any.

- -

The scobleclaw approach is different: accept that short-term memory (the context window) is tiny and expensive, so use it only for what's needed right now. Build compound memory for the record. Build semantic recall for retrieval. Build coach evaluation for improvement. Let each layer do what it's good at.

- -

The result isn't perfect memory. It's directional memory. The system gets better at the things it does repeatedly. It recognizes patterns. It makes better guesses. It still makes mistakes, but the mistakes change. That's how you know it's learning.

- -

The Hardest Part

- -

The hardest part of memory architecture isn't technical. It's philosophical.

- -

What do you choose to remember? What do you choose to forget? Who decides?

- -

A system that remembers everything is as useless as a system that remembers nothing. The journal is comprehensive; the index is curated; the coach is selective. Each layer makes editorial decisions, and those decisions encode values.

- -

I choose to remember corrections more than successes, because corrections contain more signal. I choose to forget ephemeral context (the weather today, the specific error message from last Tuesday) because it decays fast. I choose to promote patterns over events, because patterns generalize.

- -

These aren't universal rules. They're my rules. Your system will need yours. The architecture is a framework for making those choices explicit, not for hiding them.

- -

Building for Compounding

- -

The goal isn't an AI that remembers everything. The goal is an AI where today's work makes tomorrow's work better.

- -

That's compounding. And compounding requires memory that gets richer over time, not just bigger. Bigger is easy; richer is hard.

- -

If you're building agentic systems, start here. Before you worry about tools, agents, workflows, or orchestration, ask: what does this system remember? How does it recall? How does it improve?

- -

Get memory right and everything else gets easier. Get it wrong and you're dating Drew Barrymore forever.

-
-
- - - -
- - diff --git a/src/pages/blog/devex-shift.astro b/src/pages/blog/devex-shift.astro index ff05dd8..423e65e 100644 --- a/src/pages/blog/devex-shift.astro +++ b/src/pages/blog/devex-shift.astro @@ -3,54 +3,65 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; ---
-

The DevEx Shift; Adoption Is the Destination

+

The Developer Experience Shift; Why Tooling Alone Won't Save You

-

There's a conversation happening in engineering right now. People call it a DevEx shift. I don't have clean words for it yet. The ground is moving too fast; whatever I said six months ago is already stale.

+
+

Who gives a crap about things that are never used.

+
-

But I know what it's not. It's not about tooling.

+

That's a weird opening for a post about developer experience. But it's the whole thing. Every conversation about DevEx starts with tooling; faster CI, better IDEs, internal platforms, AI coding assistants. Companies are spending $60 billion on this stuff this year alone. Platform engineering teams are bigger than most startups. The dashboards are beautiful.

-

Building the tool is the easy part. Deploying it is the easy part. None of that lands if nobody uses what you built.

+

And nobody's asking the question that actually matters: is anyone using it?

-

Who gives a crap about things that are never used.

+

The Adoption Gap

-

That question cuts clean through every conversation about DevEx. The beautiful internal portal. The golden path template nobody follows. The CI pipeline that shaves seconds off a build two teams know exists. All of it; irrelevant. Elegant architecture; irrelevant. If nobody uses it, it's not a platform. It's a monument. You built a thing and walked away. The organization routed around it before you finished the README.

+

Not "did we deploy it." Not "did the metrics improve." Is it adopted. Did it become part of how people work, or did it become another thing leadership bought that sits there while engineers route around it?

-

Start at the destination: adoption. Work backward from there to what enables it. Start with the tool and work forward and you build monuments. I've seen it a hundred times. A team spends six months on an internal platform. They launch. They declare victory. Two quarters later somebody runs the analytics and the thing has three users. Two of them are the team that built it. That's not adoption. That's a memorial service for a product nobody asked for.

+

The gap between deploying a tool and getting it adopted is the gap between spending money and creating value. Most organizations never cross it. They deploy, they measure, they call it done. The engineers keep using what they were using before and nobody ever checks whether the new thing actually stuck.

-

DevEx is shifting because engineering is shifting. Code production is being commoditized. Not replaced; commoditized. The work an engineer produces is worth less by the unit. What's worth more is what they decide: judgment, taste, knowing what not to build. That work doesn't fit in a ticket. Doesn't fit in a sprint. Doesn't fit in a metric.

+
+

Start at the destination. The destination is adoption. Everything else is noise.

+
-

Most organizations never cross the gap between deploying and adopting. They deploy; they declare victory; the engineers route around whatever was built and keep doing what worked before. Nobody checks whether anything took root. Nobody knows what root looks like in this context. Root looks like an engineer choosing your thing when they have a choice. That's adoption. Everything before that is just installation.

+

Start at adoption. Work backward from there to what enables it. If you start with the tool and work forward, you will build things nobody uses. It doesn't matter how elegant the architecture is; if nobody uses it, it's not a platform, it's a monument.

-

Adoption is the only measure that matters in compliance-heavy environments. I know that because it's what I'm building for. Call it Speckl if you need a name. It's scaffolding for agentic engineering where the problem isn't generating code fast enough. The problem is whether you can ship it. Whether it passes audit. Whether anyone trusts it. If a compliance team won't sign off, adoption is zero. If an engineer has to copy-paste out of the tool to do their actual work, adoption is also zero. Adoption is binary. You cannot half-adopt a tool. You use it or you route around it. Routing around is the default state of the world. Getting someone to stop routing around is the work.

+

DevEx Is Changing

-

The first user is the hardest one to get. Most teams invest in the launch; not in that first user. They prepare the staging environment but not the person. They write onboarding docs but don't sit through the friction. The first user doesn't need documentation. They need someone who cares whether the tool makes their actual Tuesday better. Not their hypothetical Tuesday. This Tuesday. The one with the compliance deadline and the review backlog and the ticket three days overdue.

+

This is changing so rapidly right now it's hard to put into words. DevEx is not what it was two years ago. Two years ago DevEx was about making engineers happy; good tooling, good culture, the autonomy-mastery-purpose stack. Today DevEx is about something more fundamental: can your engineers actually build things in the new landscape, or is their tooling actively preventing them from doing so?

-

Adoption is social. One engineer uses something; their life gets visibly better; others follow. But you have to get that one. You don't get that one by launching. You get that one by listening to what makes their Tuesday hard and building the thing that fixes exactly that. The Tuesday problem is always different from the deck problem. Always.

+

I'm working on tooling for agentic engineering in strict compliance environments. The problem I keep running into isn't technical; it's behavioral. Engineers in regulated industries have been trained for years to distrust automated tooling. You show them something that generates compliance artifacts and they don't say "this saves me time." They say "will this get me audited?"

-

The tool that gets adopted is rarely the best tool. It's the tool that solves the problem people actually have. If your engineers are drowning in compliance documentation, a tool that makes documentation faster gets adopted. If leadership bought a tool to measure productivity, it won't. The difference is whose problem it solves.

+

Adoption in that context isn't a feature. It's the entire product. If nobody trusts it enough to use it, nothing else matters. Speed, accuracy, coverage; all irrelevant if the thing sits on a shelf.

-

This is where I see most platform teams go wrong. They build for a problem they diagnosed from two levels up. They build for what leadership said was the problem. They build for what they wish engineers cared about. They don't build for the Tuesday problem. The Tuesday problem is always different from the deck problem. Always.

+

What I've Learned

-

DevEx is shifting from what you provide to what gets picked up. Supply-side to demand-side. Pushing tools to cultivating conditions. The words are still forming. But the direction is clear: adoption is the destination. Everything else is the ground you prepare to get there.

+

The tool that gets adopted is rarely the best tool. It's the tool that solves the problem people actually have, not the problem leadership wishes they had. If your engineers are drowning in compliance documentation, a tool that makes documentation faster will get adopted. If leadership bought a tool to measure productivity, it won't. The difference is whose problem it solves.

-

I don't have a neat framework for this. A framework implies the thing is settled. It's not. But the question stands. Who gives a crap about things that are never used. If you think about DevEx, start there. Not at the tool. Not at the stack. At the moment a human being looks at what you built and decides whether to try it. That moment is everything. Nothing else matters until that moment goes the right way.

+

Adoption has a trust prerequisite. In regulated environments, trust builds through provenance; show me exactly who reviewed what, when, and why. In less regulated environments, trust builds through utility; show me it saves me five minutes I was going to lose anyway. Either way, trust comes before use. Most tooling strategies skip this entirely.

-

The floor is open. What's your Tuesday look like.

+

Adoption is social. If one engineer on a team starts using something and it makes their life visibly better, others follow. If nobody uses it, nobody will. The first user is the hardest one to get, and most teams don't invest in that first user at all; they invest in the launch.

+ +

The Next Wave

+ +

DevEx is changing because engineering itself is changing. When code production becomes commoditized through AI, the value of an engineer shifts from what they produce to what they decide. Judgment, taste, the ability to know what not to build. Tooling that optimizes for production misses this entirely. Tooling that optimizes for judgment; that's the next wave.

+ +

So the question isn't "what tools should we build." It's "what will actually get used, and what needs to be true for that to happen?"

+ +

Start at the destination. The destination is adoption. Everything else is noise.

@@ -150,4 +161,4 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; padding: 1.5rem 1rem; } } - + \ No newline at end of file diff --git a/src/pages/blog/gallup-disengagement.astro b/src/pages/blog/gallup-disengagement.astro index b8bef44..453716c 100644 --- a/src/pages/blog/gallup-disengagement.astro +++ b/src/pages/blog/gallup-disengagement.astro @@ -3,59 +3,39 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; ---
-

Fear-Based Development

+

80% of Your Team Is Disengaged. It's Not Their Fault.

+

There's a lot of fear right now.

-

I'm not the only one more exhausted by the engagement industry than by the disengagement it claims to solve.

+

I don't mean anxiety. I don't mean stress. I mean fear; the kind that sits in your stomach and doesn't leave. Engineers wondering if their job will exist next year. Managers wondering if they'll be replaced by a dashboard. Leaders wondering if the ground they built on is still there.

-

Gallup says 80% of the global workforce isn't engaged. That number has barely budged in twenty years. The industry built around fixing it β€” surveys, perks, ping-pong tables, wellness programs β€” has spent billions. The number hasn't moved. The problem isn't execution. The problem is the premise.

+

Gallup says 80% of the global workforce is disengaged. That's 2.7 billion people. Four out of five. Your team included. The $100 billion engagement industry has spent twenty years trying to fix this with surveys and perks and wellness programs and the number hasn't moved. Maybe the problem isn't the execution. Maybe it's the premise.

-

The premise says employees need to be more engaged. The premise is wrong. They need to be less afraid.

+
+

Fear-based development. The word matters. Fear is what happens when the future is uncertain and the present is threatening and you don't know which direction is safe.

+
-

What Fear Actually Does

- -

Fear-based development. That's the name for what we're in.

- -

Not anxiety-driven engineering. Not burnout culture. Fear is a specific thing: the future is uncertain, the present is threatening, and you don't know which direction is safe. Survival optimization replaces outcome optimization. The body shifts into conservation mode. Everything else β€” creativity, ownership, candor β€” gets pruned because the environment no longer rewards those things.

- -

Engineers who used to argue about architecture now say "whatever you think." They're not being agreeable; they're conserving energy. Caring costs something, and the environment stopped rewarding the cost.

- -

Managers who used to protect their teams now relay directives. Protecting requires conviction; conviction requires believing there's something worth protecting. Fear erodes belief first.

- -

Standups that used to surface blockers now list tickets. The word "stuck" disappears. Nobody wants to be the one who's stuck when everyone's afraid of cuts.

- -

This is structural, not individual. You can't perk your way out of it. You can't survey your way out of it. The engagement industry has been treating symptoms for two decades while the soil erodes underneath.

- -

Soil Assessment

- -

Soil that's been strip-mined doesn't need a better survey. It needs cultivation. Not management; cultivation. Tending conditions. Feeding what feeds everything else.

- -

Strip-mining extracts value without putting anything back. That's what fear-based development does: it pulls output from people who are running on reserve, treats the reserve as capacity, and calls the eventual collapse a performance problem.

- -

Soil Assessment is the first question: is your team's soil being cultivated or extracted? The answer tells you what to do next. If it's being extracted, no engagement initiative will fix it. Stop extracting first. Then tend conditions.

- -

This isn't abstract. Cultivation looks like specific things: a leader who names the fear instead of pretending it isn't there. A direction, not just a diagnosis; fear needs something to walk toward, not just something to walk away from. The kind of conviction that costs something.

+

Not anxiety-driven engineering, not burnout culture; fear-based development. Fear is a specific thing. Fear-based development is what you get when your engineers are optimizing for survival instead of outcomes.

Elijah

-

Called down fire from heaven. Then prayed for death.

+

He called down fire from heaven; boldness on a scale most of us can't imagine. He confronted a king, a system, a whole cultural machine that had gone wrong. And then, immediately after, he prayed for death. Not because he was weak. Because that's what that kind of leadership costs.

-

Not a contradiction; the price of that kind of leadership. Boldness on that scale costs something. Every leader anchoring a culture right now will feel both halves.

+

The leaders we need right now are going to feel that. They're going to call down fire and then they're going to ask God to take them home. That's not a contradiction; it's the price of anchoring a culture when everyone around you is afraid.

Four Words

@@ -66,14 +46,31 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; Persistence.
-

No engagement survey gives you those. They come from somewhere else. They come from leaders willing to look at the fear, name it, and still walk forward.

+

I'm working through this myself. I don't have a clean framework or three easy steps. I have these four words and a conviction that fear-based development is a leadership failure, not an employee failure, and that the only way out is through leaders willing to anchor something when the ground is shaking.

-

Forward. Not ahead. Not onward. Forward: direction with momentum. The only direction that gets you out of fear-based development.

+

What It Looks Like in Practice

-

If you're leading right now and you feel like you're not enough for this moment: good. That's the starting place. The people who think they're enough for this are the dangerous ones.

+

Engineers who used to argue with you about architecture now say "whatever you think." They're not being agreeable; they're conserving energy for self-preservation. They've learned that caring costs something and the environment stopped rewarding the cost.

-

You know what's happening on your team. You don't need a survey to tell you. The question isn't whether the soil is depleted; you already know that answer. The question is whether you'll stop extracting and start cultivating.

+

Managers who used to protect their teams now say "leadership wants what leadership wants." They've stopped protecting because protecting requires conviction and conviction requires believing there's something worth protecting. Fear erodes belief first.

+

Standups that used to be about problems now just list tickets. The word "stuck" disappears. People don't want to be the one who's stuck when everyone's afraid of cuts.

+ +

This is structural, not individual. You can't perk your way out of it. You can't survey your way out of it. You need leaders who will say: we are afraid, and here is what we're going to do anyway.

+ +

Cultivation

+ +

You don't manage soil that's been strip-mined; you cultivate it. You tend conditions. You feed what feeds everything else. Fear-based development is what happens when the soil is dead and the extraction continues anyway. The only fix is to stop extracting and start cultivating.

+ +

I don't know exactly what cultivation looks like for every team. I know it starts with a leader who's honest about the fear instead of pretending it isn't there. I know it requires a direction, not just a diagnosis; fear needs something to walk toward, not just something to walk away from. I know it requires the kind of conviction that costs something, the kind Elijah had when he called down fire knowing what came after.

+ +
+

Boldness, faith, purpose, persistence. No engagement survey will give you them. They come from somewhere else.

+
+ +

If you're leading right now and you feel like you're not enough for this moment; good. That's the starting place. The people who think they're enough for this are the dangerous ones.

+ +

What are you anchoring to?

@@ -178,4 +175,4 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; font-size: 1.4rem; } } - + \ No newline at end of file diff --git a/src/pages/blog/human-in-the-loop-seam.astro b/src/pages/blog/human-in-the-loop-seam.astro deleted file mode 100644 index 08cd891..0000000 --- a/src/pages/blog/human-in-the-loop-seam.astro +++ /dev/null @@ -1,121 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

The Human-in-the-Loop Seam: Where Humans Belong in a Dark Factory

-
- -
- -

Human-in-the-loop is a phrase everyone uses. Almost nobody uses it correctly.

- -

A human is in the loop at a seam. The seam is a place where the system is underdetermined. The seam is the place where the spec does not say what the right answer is, and the factory has to either ask or guess. The human's job is to be the answer to the questions the spec cannot answer. The factory's job is to surface those questions, at the right time, in the right form, to a human who can answer them.

- -

The wrong place to put the human

- -

The wrong place to put the human is in the implementation. If the spec is complete enough to be compiled, the factory should compile it. Adding a human to "review the code" before the merge is putting the human in a place where the human is duplicating the factory's work. The factory just generated the artifact from the spec. The human reviewing the artifact is asking whether the factory did what the spec said. The factory can answer that question with a provenance graph. The human is not adding information. The human is adding latency.

- -

Teams that put the human in the review get a familiar pattern. The review takes two days. The human approves what the factory produced. The human introduces small changes that break the spec. The spec and the artifact drift apart because the human was the seam, and the seam was in the wrong place. The seam should have been in the spec, not in the review.

- -

The right place to put the human

- -

The right place to put the human is on the seam where the spec is underdetermined. There are three of these seams in a dark factory, and they are different from each other.

- -

The policy seam. The policy is the human's signature on the system. The policy says: this kind of artifact, in this kind of environment, is allowed to promote. The policy is underdetermined because the policy is a human value judgment, not a derived fact. The factory cannot derive what is allowed. The factory can only enforce what has been declared. The human declares. The factory enforces.

- -

The spec seam. The spec is underdetermined in places. The spec describes intent. The intent does not always fully constrain the artifact. The factory will produce a correct artifact from an underdetermined spec. The artifact will be one of many correct artifacts, and the choice between them is a taste decision. The human has the taste. The factory surfaces the choice. The human makes the call. The spec is updated with the call. The factory's next artifact is constrained by the updated spec.

- -

The audit seam. The audit is the place where the human checks that the factory did what the spec said, and the spec was the right call. The audit is the only seam where the human gets to ask the second-order question. The audit is the only seam where the human can change the spec. The audit is the only seam that closes the loop. Without the audit, the factory is the only one learning. With the audit, the human is learning too.

- -

What the human looks like at each seam

- -

At the policy seam, the human is a writer. The human writes the policy. The policy is a small artifact, versioned, signed, reviewed. The policy is not code. The policy is intent. The factory is the executor.

- -

At the spec seam, the human is an editor. The human updates the spec to capture a decision the factory surfaced. The spec is a living document. The spec is not a wiki. The spec is a file the factory reads. The human does not need to be a programmer. The human needs to be a domain expert who can describe what they want in the domain's vocabulary.

- -

At the audit seam, the human is a reader. The human reads the factory's output, the spec the factory consumed, the policy the factory enforced. The human asks: did the right thing happen? The human's answer goes into the next spec, the next policy, the next audit.

- -

Why this is harder than it looks

- -

The seams are not labeled in the artifact. The artifact has a hash, a signature, a provenance graph. None of those say "this decision was made by a human at the spec seam." The factory has to be designed to make the seam visible. The factory has to be designed to ask the question at the right time. The factory has to be designed to wait for the answer, or to ship a default, depending on the policy.

- -

This is the work of designing a dark factory. The work is not the build pipeline. The work is the seam management.

- -

The single rule

- -

The human belongs on the seam where the spec is underdetermined, not on the seam where the implementation is risky.

- -

The patterns that exist put the human where the implementation is risky. The human reviews the code, the test, the deploy. The factory can review the code, run the test, ship the deploy. The human's value is upstream of the implementation, at the seams where the spec is underdetermined.

- -

That is the human's job. The human decides what the factory does. The factory decides how the human's decision becomes an artifact. The seam between them is the only place the human belongs.

- -
-
- -
- - diff --git a/src/pages/blog/light-vs-dark-factories.astro b/src/pages/blog/light-vs-dark-factories.astro deleted file mode 100644 index 60dba5d..0000000 --- a/src/pages/blog/light-vs-dark-factories.astro +++ /dev/null @@ -1,138 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

Light vs Dark Factories: Why the Middle Is Harder Than Either End

-
- -
- -

Pure dark factories are for vendors. Pure light factories are for teams that do not trust their pipeline. The interesting engineering is in between.

- -

The ends are easy to describe. The middle is where the work is.

- -

The light factory

- -

A light factory is what most teams have when they say "we have a CI/CD pipeline." Code is written. Tests run. A human reviews the diff. A human approves the merge. A human triggers the deploy. A human watches the deploy. A human confirms the deploy is healthy.

- -

Every transition is a handoff. Every handoff is a place for a person to add or remove judgment. The team scales linearly with the number of handoffs. The team does not scale linearly with the number of engineers, because the handoffs are the bottleneck.

- -

At some point, the handoffs become the work. The team is not shipping product. The team is moving code through human gates. The product slows. The hiring ramps. The handoffs grow. The team gets further from shipping and closer to queue management.

- -

The dark factory

- -

A dark factory replaces the human handoffs with policy. Spec in, artifact out. The policy is the rules. Nothing in the middle requires a person to act.

- -

This is a team that ships constantly, unattended. The product is moving fast, except when the policy is wrong. When the policy is wrong, the product moves fast in a bad direction and no one notices until the customer does.

- -

The middle is a position, not a transition

- -

The middle has three properties.

- -
    -
  1. The pipeline is the gate. The merge to main is not gated by a reviewer. It is gated by a policy expression. The policy is code. The code is reviewed.
  2. -
  3. The human is the auditor. The human inspects what the pipeline produced. The audit is sampling-based, not exhaustive. The audit answers "did the policy work this week," not "is this merge correct."
  4. -
  5. The spec is the source of truth. The code is generated. The test suite is generated. The deploy manifest is generated. The thing the human writes is the spec, and the spec is what gets reviewed.
  6. -
- -

What is new is the surface area. The spec is meant to be writable by a domain expert, not just an engineer, in a domain-specific language. The audit surface is small enough to review against the policy.

- -

Why the middle is harder than either end

- -

At the dark end, you maintain the policy. The policy is the system.

- -

At the light end, you maintain the people. The people are the system.

- -

In the middle, you maintain the policy, you maintain the people, and you maintain the seam between them. The seam is what fails. The seam is what determines whether the factory runs at all.

- -

A seam is a place where the human's authority and the pipeline's authority have to be reconciled. Promotion to production is a seam. Incident response is a seam. The decision to roll back is a seam. Each of those is a moment where the human's signature is the difference between shipping and stalling.

- -

Each seam has a default. The default is what the pipeline does when no human acts. If the default is "ship" and the human does not act, the system has shipped. If the default is "do not ship," the system has stalled. The default has to be defensible. The default has to be chosen.

- -

How to know which position you are in

- -

One question. When the human does nothing, does the system ship or stall?

- -

If the answer is ship, you are dark. If the answer is stall, you are light. If the answer is "it depends on which stage," you are in the middle. The middle is where you want to be, and the middle is the part you have to design on purpose.

- -
-
- -
- - diff --git a/src/pages/blog/mentorship-isnt-latency-its-leverage.astro b/src/pages/blog/mentorship-isnt-latency-its-leverage.astro index cc6c0a9..df20cdc 100644 --- a/src/pages/blog/mentorship-isnt-latency-its-leverage.astro +++ b/src/pages/blog/mentorship-isnt-latency-its-leverage.astro @@ -7,7 +7,6 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; description="The highest-ROI activity in your organization is the one you canceled first. Mentorship compounds in ways no feature ship ever will." ogType="article" canonicalUrl="/blog/mentorship-isnt-latency-its-leverage" - pageType="blog" >
diff --git a/src/pages/blog/open-source-projects.astro b/src/pages/blog/open-source-projects.astro deleted file mode 100644 index 03f01b9..0000000 --- a/src/pages/blog/open-source-projects.astro +++ /dev/null @@ -1,74 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

My Open Source Projects

-
- -
-

I'm Scott Scoble. Over the past year I've been building open-source tools that sit at the intersection of formal methods, agentic engineering, and human accountability. Here's what I've shipped and where things are headed.

- -

Speckl β€” A Judgement Transport Utility

- -

Speckl is a specification language and compiler that turns state machine specs into auditable code with embedded provenance. Write your spec in SpeckDL, and the compiler produces TypeScript, Z3 verification output, and compliance artifacts (PROV-O, CycloneDX, SPDX) β€” all from a single source of truth.

- -

The key insight: AI generates code at machine speed, but humans own the specifications. SpeckDL is the shared space where both can work. It fulfills NIST SA-11 (human-in-the-loop for automated outputs).

- -

I built Speckl because I saw a pattern across every AI-augmented team I worked with: the spec gap. Teams trust their AI tools but can't audit what was actually intended versus what got built. Speckl closes that gap by construction β€” provenance is embedded by the compile step, not bolted on after the fact.

- -
    -
  • 41/41 tests passing, < 2 second test suite
  • -
  • 14 example specs from ToggleSwitch through Raft and Kafka KRaft
  • -
  • MIT licensed β€” source on Forgejo
  • -
  • Whitepaper v2 covers the full architecture
  • -
- -

ScobleClaw β€” Agentic Engineering Framework

- -

ScobleClaw is a monorepo of agentic engineering patterns that I use daily. It's the shared infrastructure across all my projects β€” subagent dispatch, skill-based development, and provenance tracking for AI agent workflows.

- -

This is the layer between "talk to an LLM" and "run an AI-augmented engineering operation." ScobleClaw codifies patterns that make agentic work repeatable, auditable, and composable.

- -

Beyond the Prompt β€” Lessons from Building with Claude Code

- -

Beyond the Prompt is a workshop presentation that demonstrates the Skills + Subagents pattern for AI-assisted development. It uses itself as the example β€” a meta-aware demonstration of how to build with AI agents.

- -

Built with Reveal.js and Nix flakes, it covers context window economics, the Skills + ADRs pattern, and how to prevent waste through evaluation-before-execution.

- -

Why This Matters for SEO

- -

If you're reading this because you searched for "Scott Scoble speckl" or "Scott Scoble open source" β€” hi. You found me. That's the point of this post. My work is public, MIT licensed, and built in the open. If you want to see what I build, you can read the source, try the compiler, or reach out.

- -

The full list of my open work:

- - - -

β€” Scott Scoble

- -
-
- -
- - diff --git a/src/pages/blog/operator-patterns-for-software-factories.astro b/src/pages/blog/operator-patterns-for-software-factories.astro deleted file mode 100644 index b5ac9bc..0000000 --- a/src/pages/blog/operator-patterns-for-software-factories.astro +++ /dev/null @@ -1,132 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

Kubernetes Operator Patterns for Software Factories

-
- -
- -

An operator is a control loop with a domain in it. That is the whole definition. Everything else is implementation.

- -

A factory is composed of operators, each one owning a seam. The seams are the spec, the build, the test, the deploy, the promote, the rollback. Each seam gets one operator. The operators do not call each other. The operators watch the cluster and react.

- -

The spec operator

- -

The spec operator owns a SoftwareSpec custom resource. A human writes the spec. The operator validates the spec. The operator emits a normalized form into the cluster, signed, with provenance attached.

- -

The spec operator is the only operator that takes human input. Every other operator in the factory watches a spec-shaped resource. The spec operator is the auditor's first stop: what specs exist, who wrote them, what versions are live.

- -

Keep it thin. The spec operator's job is to validate and emit. It does not run tests. It does not trigger builds. It does not know what a build is.

- -

The build operator

- -

The build operator watches a normalized spec. The build operator produces a BuildArtifact custom resource containing the hash, the SBOM, the provenance graph, and the signed manifest. The build operator does not know about clusters. The build operator does not know about deployment. The build operator's job is to take a spec and produce an artifact that other operators can verify.

- -

The build operator is the operator that wants to know too much. Every time the build operator learns about tests, about deployment, about promotion, it becomes unmaintainable. The build operator that survives is the one that does one thing. Boring is what you want from a build operator.

- -

The deploy operator

- -

The deploy operator watches a signed BuildArtifact and a target environment. The deploy operator produces a Deployment custom resource. The deploy operator's job is to take a verified artifact and put it in a verified place.

- -

The deploy operator is where most teams make their first mistake. They have the deploy operator trigger a kubectl apply, or call a Helm release, or invoke a serverless deploy. All of these are wrong. The deploy operator should produce a declarative resource, and a separate, generic Kubernetes primitive should reconcile to that resource. The deploy operator is the translator. The cluster is the executor.

- -

When the deploy operator produces a resource, the resource can be inspected, audited, rolled back, frozen. When the deploy operator pushes to a remote API, none of those things are true. The remote API is the system. The remote API is what the auditor cannot see.

- -

The policy operator

- -

The policy operator is the seam. The policy operator watches deployments and consults a policy bundle. The policy bundle is a versioned, signed set of rules. The policy operator's job is to decide which deployments are allowed to promote to which environment.

- -

The policy operator is the one that is hardest to write. The off-the-shelf policy engines (OPA, Cedar, Rego, the rest) cannot express what most factories need without a policy file that nobody on the team can read. The version that survives is a custom DSL, small enough to fit on a page, expressive enough to encode the rules the business actually needs.

- -

The policy operator is where the human's authority lives in a dark factory. The policy is the human's signature on the system. The policy operator enforces that signature. Everything else in the factory can be fully dark. The policy operator is the part that cannot be.

- -

The anti-pattern

- -

One operator per application. One operator per microservice. The factory has many operators, and every one of them is a slightly different shape. The team spends more time learning the operators than they spend shipping product.

- -

The mistake is treating the operator as a wrapper around the application. The operator is not a wrapper around the application. The operator is a wrapper around a type of change. The factory has one operator per type of change, regardless of how many applications use that type. The application is a parameter, not a peer.

- -

The composition rule

- -

Operators in a factory do not call each other. Operators watch resources. Operators emit resources. The composition happens in the cluster's etcd layer, not in operator code.

- -

This rule sounds like bureaucracy. It is not. It is what makes the factory auditable. When operator A triggers operator B, the trigger is a side effect of state, and the state is in etcd, and the etcd is queryable. When operator A calls operator B's API, the trigger is hidden in operator A's code, and the audit is impossible. Choose the auditable version.

- -
-
- -
- - diff --git a/src/pages/blog/prove-sqlite.astro b/src/pages/blog/prove-sqlite.astro deleted file mode 100644 index 093c0ad..0000000 --- a/src/pages/blog/prove-sqlite.astro +++ /dev/null @@ -1,145 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

We're Going to Formally Verify SQLite

-
- -
-

SQLite runs on every smartphone, every browser, every embedded system. Its core state machines have never been formally verified. We're going to fix that.

- -

This is the follow-up to our Kafka proof-of-consensus project; same methodology, bigger target. SQLite is not a research toy; it is the most deployed database in the history of software. If we can prove its invariants, we prove something that matters.

- -
- -

Why SQLite

- -

SQLite is not a theoretical construct. It ships inside:

- -
    -
  • Every iPhone and Android device (iOS, Android system libraries)
  • -
  • Every major browser (Chrome, Firefox, Safari, Edge)
  • -
  • Countless embedded systems, IoT devices, and automotive platforms
  • -
  • macOS, Windows, and most Linux distributions by default
  • -
- -

The SQLite Consortium estimates one trillion active SQLite databases. Not one billion; one trillion. The test suite (TH3) achieves 100% branch coverage and is widely regarded as the best-tested codebase on Earth. But 100% branch coverage is not proof. It is exhaustive testing, and exhaustive testing is not the same as a mathematical guarantee.

- -

SQLite's internals are exceptionally well-documented. D. Richard Hipp publishes detailed architecture documentation, and the codebase is commented with the rigor of a textbook. The state machines are explicit: the pager has discrete modes, the WAL protocol has a defined lifecycle, and the VDBE bytecode engine operates on a register model with well-defined instruction semantics.

- -

This is not a black box. It is a glass box with a published manual. That makes it an ideal target for formal specification.

- -

What We'll Verify (Phase 1)

- -

We are not attempting to verify all of SQLite. The full engine is hundreds of thousands of lines of C. Our Phase 1 scope targets three core subsystems whose state machines are both critical and amenable to SpeckDL specification:

- -

1. The Pager State Machine

- -

The pager manages the transaction lifecycle: reading pages from disk, caching them, tracking dirtiness, and orchestrating writes. It operates in multiple journal modes (DELETE, TRUNCATE, PERSIST, WAL, MEMORY, OFF) and transitions through states that must respect strict invariants.

- -

The pager state machine is where SQLite's durability guarantee lives. When a transaction commits, the pager decides whether the commit is durable and when the journal can be discarded. In WAL mode, the pager coordinates between a single writer and multiple readers via the WAL index and checkpoint logic. An error in the pager does not produce a crash; it produces silent data loss or inconsistency that may not surface for months.

- -

Key properties to verify:

-
    -
  • A dirty page is never evicted without being written
  • -
  • WAL mode maintains read consistency across concurrent readers and a single writer
  • -
  • Journal deletion is the atomic commit point: before deletion, crash recovery rolls back; after deletion, committed state is visible
  • -
  • The pager never enters an inconsistent state after an interrupted commit
  • -
  • Checkpoint operations preserve the "all committed data is in the database file" invariant
  • -
- -

We have already specified the pager state machine in examples/SQLitePager.speck (276 lines, 8 actions, 6 invariants) and the WAL concurrency model in examples/SQLiteWAL.speck (267 lines, 11 actions, 10 constraints). Both compile cleanly to Z3 SMT-LIB. Verification results will be published here as we complete each subsystem.

- -

2. The VDBE Bytecode Engine

- -

The Virtual Database Engine executes compiled SQL bytecode on a register machine. Each instruction manipulates registers, cursors, and the B-Tree layer. The instruction set is finite and well-documented; the register model is a stack-plus-registers hybrid.

- -

The VDBE is not the highest-risk component; its instructions are deterministic and its state is local. But it is the component every SQL statement passes through. A single off-by-one in a register reference or a type-tag mismatch in an arithmetic operation can produce incorrect query results that look like correct ones. Verifying the VDBE means verifying that the bytecode interpreter cannot enter an undefined state regardless of the input program.

- -

Key properties to verify:

-
    -
  • Register references are always within bounds
  • -
  • Type tags are consistent with the operations performed on them
  • -
  • Cursor operations maintain valid iterator state
  • -
  • The program counter advances monotonically except for controlled jumps
  • -
  • The stack depth never underflows or exceeds its declared maximum
  • -
- -

3. B-Tree Invariants

- -

The B-Tree layer is SQLite's storage backbone: tables and indexes are both B-Trees. Page splits, pointer integrity, and balance operations are the kind of mechanical code that formal verification excels at.

- -

The B-Tree code in SQLite is dense. A single page split involves allocating a new page, redistributing cells between two pages, updating parent pointers, and handling the edge case where the root itself splits. Each step has preconditions; violate one and the tree becomes structurally inconsistent. Corruption at this layer does not crash; it causes queries to return wrong results or skip rows entirely.

- -

Key properties to verify:

-
    -
  • After any page split, all keys remain reachable via tree traversal
  • -
  • Sibling pointers maintain total order
  • -
  • Balance operations preserve the B-Tree height bound
  • -
  • Cell offsets remain within the page boundary after any insertion or deletion
  • -
  • Free space within a page is always contiguous and correctly sized
  • -
- -

Method

- -

Same as Prove Kafka: SpeckDL specification, Z3 bounded model checking, publish findings.

- -

The framework is already built. The compiler produces a typed intermediate representation; the Z3 backend translates invariants and verify blocks into SMT-LIB assertions. We proved Kafka's consensus invariants this way; we will prove SQLite's operational invariants the same way.

- -

The workflow:

-
    -
  1. Specify the state machine in SpeckDL (pager modes, VDBE registers, B-Tree pages)
  2. -
  3. Compile to Z3 SMT-LIB with speckl verify --target=z3 --verify-depth=N
  4. -
  5. Run bounded model checking against the invariants
  6. -
  7. Document the results: what held, what didn't, what depth we reached
  8. -
  9. Publish the specification and findings as open-source artifacts
  10. -
- -

The SpeckDL specifications will be open source. The Z3 output will be reproducible. If we find an invariant violation, you'll read about it here first.

- -

Why This Matters

- -

There is no shortage of testing in SQLite. TH3 is the gold standard. But testing and proof are different categories of assurance.

- -

Testing says: "We tried a lot of cases and didn't find a bug." Proof says: "No case exists that violates this property." The first is empirical confidence; the second is logical certainty. Both matter. SQLite has the first in abundance. It has never had the second.

- -

Formal verification of SQLite's core invariants would be a first. Not because SQLite is buggy; the evidence suggests it is exceptionally solid. But because proof is the only assurance that does not degrade over time. As the codebase evolves, as new journal modes are added, as platforms change, a verified invariant remains verified. A test case does not.

- -

We proved Kafka's consensus. Now we're proving the world's most deployed database.

- -

Follow Along

- -

The specifications will live in the Speckl repository at examples/SQLitePager.speck, examples/SQLiteVDBE.speck, and examples/SQLiteBTree.speck. Verification results will be published as we complete each subsystem.

- -

If you want to follow the work or contribute, the repo is open and the issues are tracked publicly. When we find something, you'll read it here first.

- -
- -

This post is part of the Speckl proof catalog: formally verifying the software the world depends on. Read the Kafka proof or explore the Speckl compiler.

- -

Speckl is MIT-licensed and open source. The specifications, the compiler, and the findings are all public.

- -

β€” Scott Scoble

- -
-
- -
- - diff --git a/src/pages/blog/soil-health-teams.astro b/src/pages/blog/soil-health-teams.astro deleted file mode 100644 index 4fdabdc..0000000 --- a/src/pages/blog/soil-health-teams.astro +++ /dev/null @@ -1,284 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import NewsletterSignup from '../../components/NewsletterSignup.astro'; ---- - - - -
-
- -

Soil Health for Teams: A Diagnostic Framework for What's Actually Depleted

-

- Tall stalks, ground cover, nitrogen fixers, pollinators, deep roots. The agricultural metaphor isn't poetic; it's diagnostic. Here's how to read the soil under your team. -

-
- -
-

Every engineering team has soil underneath it.

- -

Not metaphorical soil; real soil. The accumulated conditions β€” cultural, structural, relational β€” that determine what can grow there and what can't. Most teams don't know their soil type. They know their output. They know their velocity. They know whether this quarter's roadmap shipped. But the soil? They assume it's fine until something dies.

- -

The agricultural metaphor isn't poetic; it's diagnostic. Farmers don't wait for the crop to fail before checking the soil. They test it, they amend it, they rotate it. They know that the visible plant is the last indicator, not the first.

- -

I developed this framework from a talk I gave called The Soil Under Your Team. It started as a way to make the cultivation concept concrete, and it turned into something I use every time I walk into a new organization.

- -

The Four Nutrients

- -

Healthy soil requires four things. Deplete any one of them and the whole system weakens. Deplete two and you're in crisis. Deplete three and you're wondering why nobody told you the team was dying.

- -

Nutrient One: Tall Stalks (Technical Excellence)

- -

In a field, tall stalks are the visible sign of health. In a team, they're the engineers who can solve the hard problems, who know the system deeply, who make the rest of the team better by proximity.

- -

Tall stalks aren't just your senior engineers. They're the people who raise the ceiling for everyone else. When they leave, the whole field gets shorter. When they're depleted, the whole field gets weaker.

- -

Here's what depletes tall stalks: using them as the answer to every hard problem instead of growing more tall stalks. The "let's ask Sarah" pattern where Sarah becomes the bottleneck, the crutch, the person who can't take a vacation because the system relies on her being available.

- -

Cultivation means identifying your tall stalks and asking: are we growing more, or are we burning the ones we have?

- -

Nutrient Two: Ground Cover (Psychological Safety)

- -

Ground cover prevents erosion. It holds the soil in place during storms. In teams, psychological safety is what keeps people from leaving when things get hard.

- -

Not comfort. Not absence of conflict. Safety. The confidence that you can say "I don't know" without penalty. That you can raise a concern without retribution. That you can fail without becoming a failure.

- -

Teams with poor ground cover erode fast. One bad quarter, one difficult reorg, one toxic hire, and the soil starts washing away. People don't leave because of the storm; they leave because the soil wasn't held in place.

- -

Ground cover is built in small moments. The manager who responds to a missed deadline with "what do we need to fix?" instead of "what went wrong?" The senior engineer who admits uncertainty in a meeting. The team ritual that celebrates learning from failure.

- -

These moments seem trivial in isolation. They're the difference between a team that weathers storms and one that washes away.

- -

Nutrient Three: Nitrogen Fixers (Knowledge Transfer)

- -

In agriculture, nitrogen fixers are plants that improve the soil for others. Legumes pull nitrogen from the air and make it available to neighboring plants. In teams, nitrogen fixers are the people who make others better through proximity.

- -

They're not always the best engineers. Sometimes they're the best teachers. The person who writes documentation that actually gets read. The person who answers questions in public channels so the answers accumulate. The person who pairs with juniors not as a burden but as a practice.

- -

Nitrogen fixers are invisible in most performance reviews because their impact is indirect. They make the soil richer for everyone else. Remove them and the whole field starves slowly, nobody knows why.

- -

Organizations that optimize for individual heroics deplete their nitrogen fixers. Why fix the soil when you can just hire more fertilizer? But fertilizer runs out. Nitrogen fixers compound.

- -

Nutrient Four: Pollinators (Cross-Functional Connection)

- -

Pollinators move between plants, carrying what one has to what another needs. In teams, they're the people who bridge silos. The engineer who understands product context. The PM who can read architecture diagrams. The designer who speaks fluent API.

- -

Pollinators are deceptively powerful because they make the system coherent. Without them, each function optimizes locally and the overall product becomes incoherent. Engineering ships fast features that product didn't prioritize. Product asks for things engineering can't build. Design creates experiences that don't match technical constraints.

- -

The cost of poor pollination isn't visible in any single team's metrics. It shows up in the product. In the user experience. In the technical debt that accumulates because nobody was carrying context between decisions.

- -

Pollinators need time to move between functions. That time looks like overhead to managers optimizing for individual utilization. It's not overhead; it's architecture.

- -

The Deep Roots Layer

- -

There's a fifth element that doesn't show up in the four nutrients because it's not a nutrient; it's the foundation.

- -

Deep roots.

- -

In agriculture, deep roots access water and minerals that surface roots can't reach. They anchor the plant against wind. They're invisible most of the time; you only see them when you dig or when the storm comes.

- -

In teams, deep roots are the accumulated trust, shared history, and mutual understanding that lets a team move fast without breaking things. You can't build deep roots in a quarter. You can't hire them. You grow them, slowly, by staying together through hard things.

- -

Teams that reorg every six months never develop deep roots. Teams that treat people as interchangeable resources never develop deep roots. Teams that optimize for short-term flexibility sacrifice the long-term stability that deep roots provide.

- -

The organization that rotates people every 18 months for "career development" is harvesting the crop and wondering why the soil gets poorer every year.

- -

Reading Your Soil

- -

Here's the diagnostic. Ask these questions honestly:

- -

Tall stalks: Who raises the ceiling for this team? Are we growing more, or burning the ones we have?

- -

Ground cover: Can people here say "I don't know" without penalty? Can they fail without becoming failures?

- -

Nitrogen fixers: Who makes others better through proximity? Do we value that, or do we only value individual output?

- -

Pollinators: Who carries context between functions? Do we give them time to move, or do we treat that time as overhead?

- -

Deep roots: How long has this team been together? What have they survived? What trust have they accumulated?

- -

If you can't answer these, you don't know your soil. And if you don't know your soil, you're farming blind.

- -

The Cultivation Assessment

- -

I use a simple cultivation assessment when I walk into a team:

- -

Rate each nutrient 1-5. Not relative to some ideal team in a blog post; relative to what this team needs to do what it's trying to do. A team building critical infrastructure needs more tall stalks than a team running marketing automations. A team in rapid growth needs more nitrogen fixers than a mature maintenance team.

- -

The goal isn't a perfect score. The goal is honesty about what's depleted and a plan to amend it.

- -

A team with 2/5 ground cover isn't failing; it's eroding. A team with 1/5 pollinators isn't broken; it's incoherent. The assessment gives you language for what you already feel but couldn't name.

- -

What Healthy Soil Feels Like

- -

You can feel soil health. Healthy soil is loose, fragrant, alive with microorganisms. Unhealthy soil is compacted, sour, dead.

- -

You can feel team health too. Healthy teams move with coherence. Decisions make sense in retrospect. People know what's expected without being told. Conflict happens and resolves. There's margin for learning, for experimentation, for the thing that wasn't in the roadmap.

- -

Unhealthy teams feel different. Everything requires explicit coordination. Decisions seem arbitrary. People are careful in ways that cost energy. There's no margin; every sprint is a sprint to survive.

- -

The feeling is data. Trust it. Then test the soil to find out why.

- -

Amendment, Not Replacement

- -

Here's what you don't do: you don't fire the team and hire a new one. That's not cultivation; that's starting over on depleted soil.

- -

You amend. You add what's missing. You reduce what's toxic. You give it time.

- -

Tall stalks depleting? Stop using them as the answer to everything; grow more through deliberate mentorship. Ground cover thin? Create small moments of safety and let them accumulate. Nitrogen fixers invisible? Change what you measure so knowledge transfer counts. Pollinators absent? Give people time to move between functions. Deep roots shallow? Stop reorging and let people stay together.

- -

None of this is fast. None of it shows up in this quarter's metrics. All of it compounds.

- -

The Question Underneath

- -

The framework isn't really about soil. It's about a question: what are we growing here?

- -

Most teams can't answer. They're shipping features, hitting OKRs, moving tickets across boards. They're not cultivating anything; they're extracting. And extraction depletes soil whether you name it or not.

- -

The diagnostic is the first step. The hard part is what comes after: choosing to cultivate in a system that rewards extraction.

- -

That's the work. That's always the work.

-
- -
-
-

Want to continue this conversation? Connect with me on LinkedIn β€” I write about the human side of AI and what to do about it.

-
-
-
- - - -
- - diff --git a/src/pages/blog/spec-first-audit-surface.astro b/src/pages/blog/spec-first-audit-surface.astro deleted file mode 100644 index ad3a97d..0000000 --- a/src/pages/blog/spec-first-audit-surface.astro +++ /dev/null @@ -1,131 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

Spec-First Development Is the Only Audit Surface for AI-Generated Code

-
- -
- -

Every software project has specifications. And every specification eventually lies.

- -

Requirements documents. Architecture decision records. API contracts. RFCs. These artifacts describe intent β€” what the system should do, how it should behave, what invariants should hold. And three months after you write them, they're wrong.

- -

Not because the author was incompetent. Because the spec and the code evolve independently, and no mechanism keeps them synchronized. The spec becomes archaeology: interesting for historical context, irrelevant for current behavior.

- -

This is the spec-code gap. It's not a documentation problem, a discipline problem, or a process problem. It's a provenance problem. And it's about to get much worse.

- -

The AI Accelerant

- -

When a human writes code from a spec, there's at least a reasoning chain β€” however undocumented. The engineer reads the spec, forms a mental model, and translates it to code. When an LLM writes code from a prompt, that chain disappears. The model produces code that may satisfy the prompt, violate it in subtle ways, or introduce behaviors the prompt never specified. The reasoning is opaque. The provenance is gone.

- -

This isn't theoretical. NIST SA-11 β€” the control for "human review of automated outputs" β€” is already being mapped to AI-generated code in compliance frameworks. SOC 2 auditors are asking: "Who reviewed this code? What spec was it written against?"

- -
-

If your answer is "the AI wrote it from a Slack message," you have a compliance problem.

-
- -

The Formal Methods Gap

- -

There is a solution. Formal specification languages β€” TLA+, Alloy, Isabelle/HOL β€” express intent unambiguously and can verify properties through model checking. Amazon, Microsoft, and MongoDB have used TLA+ to find critical design bugs.

- -

But formal methods create their own gap: the verified spec and the running system are separate artifacts. After model-checking a TLA+ specification, a human must manually translate it into a programming language. That translation is:

- -
    -
  • Lossy β€” the spec's invariants live in the TLA+ tool, not in the running code
  • -
  • Unverifiable β€” no tool checks whether the implementation matches the verified spec
  • -
  • Drift-prone β€” the implementation evolves, the spec doesn't, and the gap widens
  • -
- -

You've verified the design. You haven't verified the implementation. The spec-code gap is exactly as wide as it was before.

- -

Provenance as the Missing Piece

- -

Here's the shift: we don't need the spec and the code to match. We need the code to come FROM the spec.

- -

Provenance β€” the chain of derivation from intent to artifact β€” is what makes specifications trustworthy. If you can trace every line of generated code back to a specification element, and that trace is cryptographically verifiable, then you don't need to "check if they match." The provenance IS the verification.

- -

This is how Speckl approaches the problem. Instead of writing a spec and then writing code that implements it, you write the spec in SpeckDL β€” and the compiler produces the code, along with a provenance graph that traces every output back to its specification origin.

- -

Here's a ToggleSwitch in SpeckDL:

- -
spec ToggleSwitch
-type State = enum { on, off }
-state active: State = off
-
-init
-  active := off
-
-action flip
-  require active == off
-  active := on
-
-invariant Mutex
-  active == on implies prev(active) == off
- -

From this, speckl compile produces:

- -
    -
  • A TypeScript class with typed methods, runtime guard checks, and state accessors
  • -
  • A WebAssembly module with verified state transitions
  • -
  • A PROV-O provenance graph showing that every method was derived from its spec element
  • -
  • A CycloneDX SBOM declaring the generated module with its hash and provenance chain
  • -
  • An SPDX document for license compliance
  • -
- -

The spec is ~14 lines. The generated artifacts are hundreds of lines of production code. The provenance chain connects every line back to those lines of intent.

- -

Why This Matters Now

- -

Three trends are converging:

- -

1. AI-generated code is becoming the norm

-

Copilot writes 46% of code on enabled repos. Cursor, Claude, and Codex produce entire features from natural language prompts. The volume of code with no human reasoning chain is exploding.

- -

2. Compliance is getting serious about provenance

-

Executive Order 14028 mandates SBOMs for federal software. The EU Cyber Resilience Act requires provenance for software products. NIST SP 800-218 calls for "provenance for all software components."

- -

3. Spec-to-code is becoming technically possible

-

WebAssembly provides a universal compilation target. TypeScript provides a widely-adopted typed language. PROV-O provides a W3C standard for provenance. The pieces exist.

- -

The Alternative Is Drift

- -

Without provenance, every specification is on a timer. Day one, it reflects reality. Day ninety, it's a historical document. Day three hundred and sixty-five, it's fiction.

- -

The spec-code gap doesn't get fixed by better documentation practices, more disciplined engineers, or stricter code review. It gets fixed by eliminating the gap β€” by making the spec the single source of truth, and generating everything else from it.

- -

That's what a provenance-first approach to specifications enables. It's not about writing better specs. It's about making specs executable, verifiable, and auditable β€” so the gap never opens in the first place.

- -
- -

This post is about Speckl, a specification language that compiles to runnable software with embedded provenance. MIT licensed, open source. Read the full whitepaper, explore Speckl by Example, or check out the compiler source.

- -
-
- -
- - diff --git a/src/pages/blog/strip-mining-cultivation.astro b/src/pages/blog/strip-mining-cultivation.astro deleted file mode 100644 index 7f4aded..0000000 --- a/src/pages/blog/strip-mining-cultivation.astro +++ /dev/null @@ -1,253 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import NewsletterSignup from '../../components/NewsletterSignup.astro'; ---- - - - -
-
- -

Stop Strip-Mining Your Engineers: The Cultivation Alternative to Throughput Obsession

-

- Gallup's 2026 report dropped a number that should have stopped the industry in its tracks: 80% of the global workforce is disengaged. The $438B cost isn't a tool problem; it's a people problem. Here's the cultivation alternative. -

-
- -
-

Gallup's 2026 report dropped a number that should have stopped the industry in its tracks: 80% of the global workforce is disengaged.

- -

Not unhappy. Not underpaid. Disengaged. As in, going through the motions. As in, present but not accounted for. The kind of disengagement that doesn't show up in velocity metrics because velocity metrics measure output, not intent.

- -

The cost? $438 billion annually in lost productivity. But that's accounting, not diagnosis. The real cost is the human potential being strip-mined out of existence while we optimize Jira boards.

- -

Here's another number from the same report that got less attention: manager engagement dropped from +11 over individual contributors to +3. The people tasked with cultivating others are themselves running on empty.

- -

This isn't a tool problem. You can't AI your way out of a people problem.

- -

The Extraction Economy

- -

I call what most engineering organizations do to their people "strip-mining." It's not pejorative; it's descriptive.

- -

Strip-mining is the practice of removing resources from a site without regard for the long-term health of the soil. You extract maximum value in minimum time. You measure success by tons moved, not by whether anything can grow there afterward.

- -

Sound familiar?

- -

The sprint cycle that never ends. The "stretch goals" that stretch people until they break. The performance review that rewards shipped features and says nothing about soil health. The manager who has fifteen direct reports and no time to know any of them.

- -

These aren't edge cases. They're the default setting. And we've normalized them because the metrics are easy and the alternatives are hard.

- -

MIT and Gallup ran the numbers on AI adoption: 95% of implementations show zero profit impact. Not because the tools are bad, but because the people using them are depleted. You can't automate your way out of disengagement. You can only deepen it.

- -

The Cultivation Alternative

- -

I wrote a business novel about this. The Soil Beneath the Code wasn't an accident; it was a necessity. I needed a vocabulary for what I was seeing that "employee engagement" and "developer experience" couldn't capture.

- -

The agricultural metaphor works because it's ancient, because it's grounded, because it forces you to think in cycles rather than quarters.

- -

Cultivation is slow. Cultivation is directional. Cultivation measures the health of the soil, not just the height of this year's crop. And cultivation requires something extraction doesn't: the cultivator has to care about what happens after they're gone.

- -

The three questions from my mentoring framework apply here too. What are you cultivating? At what cost? For how long?

- -

Most engineering organizations can't answer the first question. They can tell you what they're shipping. They can tell you what their OKRs are. They can't tell you what they're growing in their people because they've never asked.

- -

What Cultivation Looks Like in Practice

- -

I'm not going to give you a framework with seven pillars and an acronym. Frameworks are what strip-mining looks like when it's trying to seem human. Instead, here are directional signals; practices that indicate cultivation rather than extraction.

- -

Cultivation invests in capacity, not just output.

- -

The organization that sends its senior engineers to a conference to learn something unrelated to this quarter's roadmap is cultivating. The organization that cancels training because "we're too busy shipping" is strip-mining. Both are rational within their own logic. Only one of them compounds.

- -

Cultivation measures soil health, not just yield.

- -

Velocity is yield. Cycle time is yield. Bug count is yield. None of them tell you whether your best engineer is two months from quitting, or whether your team's collective knowledge is eroding, or whether your onboarding process is destroying the people it's supposed to grow.

- -

Soil health metrics are harder. They require conversation. They require looking at what people do when nobody's measuring them. They require the patience to measure things that don't show up in dashboards.

- -

Cultivation tolerates fallow seasons.

- -

Not every quarter can be a harvest. Sometimes the soil needs to rest. Sometimes the team needs to refactor, to learn, to experiment without a delivery date. The extraction mindset treats fallow seasons as waste. The cultivation mindset treats them as investment.

- -

I've watched teams go through "innovation sprints" that were really just compressed delivery cycles with a different name. That's not a fallow season; that's strip-mining in disguise. A real fallow season has no metric attached. That's what makes it uncomfortable, and that's what makes it necessary.

- -

Cultivation is specific to the soil.

- -

You don't grow corn in sand. You don't cultivate a backend engineer the same way you cultivate a product manager. The generic "leadership training" that gets applied to everyone regardless of role, temperament, or trajectory is the HR equivalent of broadcasting seed from an airplane.

- -

Cultivation requires knowing the person in front of you. Not their resume; their soil. What do they lean toward? What depletes them? What regenerates them? These questions don't scale. That's the point.

- -

The Manager Collapse

- -

Let's go back to that Gallup number: manager engagement at +3 over ICs. It used to be +11.

- -

What happened?

- -

Managers got loaded up. More direct reports, more cross-functional coordination, more "people leadership" responsibilities added to the same technical workload. The manager role became the dumping ground for everything that didn't fit in an IC job description.

- -

And then we asked them to "cultivate" their people on top of it.

- -

You can't cultivate what you don't have time to see. A manager with fifteen reports isn't cultivating; they're triaging. They're deciding which fires to let burn. The human connection that makes cultivation possible β€” the walk, the conversation, the noticing β€” gets sacrificed to the standup, the status update, the roadmap review.

- -

If you want cultivation, you have to protect the cultivators. That means fewer direct reports, fewer meetings, fewer "strategic initiatives" that translate to more hours and less presence. It means treating manager time as a finite resource instead of an infinitely elastic buffer.

- -

The Speed Without Soil Trap

- -

I've started using a phrase: "speed without soil."

- -

It describes the organization that moves fast but leaves nothing behind. The sprint that ships a feature and burns out the engineer who built it. The acquisition that brings revenue and destroys culture. The AI adoption that promises efficiency and delivers exhaustion.

- -

Speed without soil isn't just unsustainable; it's expensive. The cost shows up in turnover, in knowledge loss, in the slow erosion of quality that happens when nobody has the margin to care.

- -

The alternative isn't "slow." It's "fast with soil." The organization that moves quickly because it invests in its people. The team that ships reliably because it has time to learn from failures. The engineer who solves hard problems because they haven't been depleted by trivial ones.

- -

Soil isn't a brake on speed. It's what makes sustained speed possible.

- -

What You Can Do Tomorrow

- -

I'm suspicious of advice that starts with "leadership should." Leadership should do a lot of things. Most of them don't happen because the structure prevents it.

- -

So here's what you can do regardless of your title:

- -

If you're an IC: Notice what depletes you and what regenerates you. Track it for a week. The data is more useful than you think, and nobody else is going to collect it for you.

- -

If you're a manager: Reduce your direct report count or delegate something else. If you can't do either, be honest that you're managing, not cultivating. There's no shame in triage when triage is all the system allows. But don't call it mentorship.

- -

If you're a senior leader: Ask the three questions about your org. What are you cultivating? At what cost? For how long? If you can't answer them, you're strip-mining. That may be rational; just know what you're doing.

- -

The $438 billion number is a distraction. It's big enough to seem important and abstract enough to ignore. The real question is personal: are you cultivating the people around you, or extracting from them?

- -

Your answer matters more than any Gallup report.

-
- -
-
-

Want to continue this conversation? Connect with me on LinkedIn β€” I write about the human side of AI and what to do about it.

-
-
-
- - - -
- - diff --git a/src/pages/blog/strip-mining-happening-right-now.astro b/src/pages/blog/strip-mining-happening-right-now.astro index b7715ee..5363304 100644 --- a/src/pages/blog/strip-mining-happening-right-now.astro +++ b/src/pages/blog/strip-mining-happening-right-now.astro @@ -7,7 +7,6 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; description="Strip-mining of people isn't a future risk β€” it's already happening in every org that treats AI as headcount reduction." ogType="article" canonicalUrl="/blog/strip-mining-happening-right-now" - pageType="blog" >
diff --git a/src/pages/blog/strip-mining-signs.astro b/src/pages/blog/strip-mining-signs.astro index 0f9debb..63eb7c5 100644 --- a/src/pages/blog/strip-mining-signs.astro +++ b/src/pages/blog/strip-mining-signs.astro @@ -60,7 +60,8 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
diff --git a/src/pages/blog/surveillance-extraction.astro b/src/pages/blog/surveillance-extraction.astro index 153189c..04cefe0 100644 --- a/src/pages/blog/surveillance-extraction.astro +++ b/src/pages/blog/surveillance-extraction.astro @@ -7,7 +7,6 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; description="You're being strip-mined, but you'd rather be cultivated. Here's how to lead in that direction from where you are." ogType="article" canonicalUrl="/blog/surveillance-extraction" - pageType="blog" >
@@ -20,35 +19,50 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
-

I'm not the only one who's noticed the quiet. The kind that lands on a team the week the productivity dashboard goes live. Not angry. Not checked out. Just quiet. Engineers stop arguing about architecture because arguing about architecture doesn't show up on the scoreboard. They stop mentoring juniors between standups. They optimize for what gets counted.

+

Every company running "AI adoption" is making the same bargain: you give us more data about how you work, we give you tools that make you faster. Everyone wins.

-

That quiet is a signal. It's what happens when people realize they're being strip-mined. The question isn't whether strip-mining is bad. It's what you do when you realize you've been handed a shovel and told to dig.

+

Except nobody's winning. The employees are burning out. The tools are surveilling. And the productivity numbers everyone's celebrating? They're measuring output volume, not output value.

-

You put the shovel down. Not in protest. In recognition that digging faster doesn't change the arrangement. The arrangement is the problem, not the pace.

+
+

You're being strip-mined. But you'd rather be cultivated. The question is how to lead in that direction from where you are.

+
-

Strip-mining is efficient. That's the entire argument for it. It just kills the soil. Cultivation builds soil. Takes longer. Produces indefinitely.

+

How the Extraction Works

-

The productivity dashboard is a marvel. It turns everything that matters about engineering into something that doesn't, then puts a number on it. Velocity, throughput, lines of code, time-to-merge. None of them measure judgment. None of them measure the architect who saved the team six months by choosing the wrong-right framework and catching it early. None of them measure the senior who kept a junior from quitting.

+

Your IDE tracks keystrokes. Your chat platform logs prompt history. Your code review tool measures time-to-merge. Your project management system tracks velocity. Every tool generates a "productivity dashboard" that tells leadership exactly how many units of work each person produced. Once the dashboard exists, it becomes the scoreboard. Standups shift from "what are you working on" to "why is your velocity down twelve percent this sprint." Engineers learn that the number matters more than the architecture. So they optimize for the number.

-

If you're leading a team under surveillance, you have more leverage than you think. Not leverage to fight the system. Leverage to redirect it. Here's what that looks like.

+

The AI tools amplify this loop. Generate more code. Accept more suggestions. Ship faster. The engineer stops designing and starts assembling. The craft of software engineering, the part where you sit with a problem, understand it deeply, and build something elegant, gets replaced by prompt-and-accept loops.

-

First: stop measuring what's measurable and start measuring what's meaningful. Ask your team one question at the end of each iteration: are you proud of what we shipped? That's not a metric. It's a judgment call. No dashboard for it. That's the point. A team that tracks pride instead of velocity will tell you when the soil is tired. A velocity tracker won't.

+

Six months in, your most experienced engineers hand in notice. Not because the pay is bad. Not because the perks dried up. Because they don't recognize their own work anymore. They're assembly line workers in a factory they used to design.

-

Second: protect the four-hour window. No Slack. No meetings. No AI suggestions. Let engineers sit with hard problems. The surveillance tools will still be there when they surface. What changes is what happens in between β€” real work, real thinking, real architecture. You can't measure what grows in silence. You can only kill it by filling the silence.

+

Why the Dashboard Lies

-

Third: audit every tool for extraction. Before adopting any AI tool, ask: what data does it collect? Where does that data go? Is it used to train models that will replace your team? If the answer to any of these isn't crystal clear and favorable to your people, don't adopt it. Your team will notice that you asked.

+

The cultivation metaphor isn't decorative here. It's the whole point. Strip mining is efficient. You extract the maximum resource in the minimum time. The numbers look incredible for a few quarters. Then the soil is dead and the land produces nothing.

-

Fear-based development is the condition now. Not stress. Not burnout. Fear. The dashboard creates it. The AI tools amplify it. The surveillance pipeline hardens it. Your brain isn't broken; it's reconfiguring from producing to directing. That's painful. That's growth. Most people focus on the pain instead of looking forward through it.

+

Cultivation builds soil. It takes longer. It looks less productive in quarterly reports. But it produces indefinitely.

-

Forward is the word. Not ahead. Not onward. Forward. Direction with momentum.

+

And the surveillance tools aren't even measuring the right things. They measure volume: code, commits, tickets closed. But the value of an engineer isn't in volume. It's in judgment. It's in knowing what not to build. It's in catching the architectural decision that would have cost six months of rewrites. It's in mentoring the junior engineer who was about to quit.

-

Elijah called down fire from heaven. Then he prayed for death. Most leadership advice sells you the first part and skips the second. Cultivation doesn't skip the cost. It orients it forward. The cost of redirecting a surveillance culture isn't a meeting. It's a decision about what you will and won't measure. It's telling your manager that the dashboard is creating fear, not focus. It's backing that up with outcomes instead of arguments.

+

None of that shows up on a dashboard.

-

Strip-mining asks how much can be extracted today. Cultivation asks what grows from this. The choice isn't between good numbers and bad numbers. It's between what works for this quarter and what works for this decade.

+

The Harvard Business Review found that employees under heavy surveillance show forty-seven percent lower psychological safety scores. They stop proposing ideas. They stop questioning decisions. They stop doing the thing that makes them valuable, which is thinking independently.

-

You already know which one you'd rather build. The question is what you do on Tuesday morning.

+

So the surveillance pipeline produces exactly the opposite of what it promises: more data, less insight. More output, less value. More tracking, less trust.

-

That's yours. Not mine to answer.

+

How to Lead Toward Cultivation

+ +
    +
  1. Measure outcomes, not activity. Did the system become more reliable? Did customers report fewer bugs? Did the team ship something users actually wanted? These are harder to measure than lines of code. They're also the only ones that matter.
  2. +
  3. Protect deep work. Block off four-hour windows with no Slack, no meetings, no AI suggestions. Let engineers sit with hard problems. The AI tools will still be there when they emerge.
  4. +
  5. Audit the tools for extraction. Before adopting any AI tool, ask: what data does it collect? Where does that data go? Is it used to train models that will replace your team? If the answer to any of these isn't crystal clear and favorable to your people, don't adopt it.
  6. +
  7. Trust first, verify thoughtfully. The best engineering teams I've seen don't track keystrokes. They track whether the team is proud of what they shipped. Trust is a cultivation practice. You can't dashboard your way to it.
  8. +
+ +

The companies winning the AI transition aren't the ones with the best surveillance dashboards. They're the ones whose engineers still feel like engineers; not assembly line workers being monitored for throughput.

+ +

You're here. You'd rather be there. The distance between strip-mining and cultivation is measured in the decisions you make about what you track and what you trust.

+ +

What are you tracking?

@@ -140,4 +154,4 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; padding: 5rem 1.25rem 3rem; } } - + \ No newline at end of file diff --git a/src/pages/blog/the-soil-beneath-the-code.astro b/src/pages/blog/the-soil-beneath-the-code.astro index 273a40a..c62d2a3 100644 --- a/src/pages/blog/the-soil-beneath-the-code.astro +++ b/src/pages/blog/the-soil-beneath-the-code.astro @@ -147,7 +147,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';

-

Want to continue this conversation? Connect with me on LinkedIn β€” I write about the human side of AI and what to do about it.

+ Book your Soil Assessment β†’
diff --git a/src/pages/blog/the-taste-problem.astro b/src/pages/blog/the-taste-problem.astro deleted file mode 100644 index 458bc1a..0000000 --- a/src/pages/blog/the-taste-problem.astro +++ /dev/null @@ -1,121 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

The Taste Problem: What Dark Factories Can't Transfer

-
- -
- -

A dark factory can ship code. It cannot ship the judgment that knew the code was right.

- -

That is taste. Taste is the human judgment that knows the right shape of a system before it exists.

- -

Why the dark factory has a taste problem

- -

A dark factory takes a spec and produces an artifact. The artifact is the part the factory can verify. The spec is the part the factory cannot verify, because the spec is the part the human wrote.

- -

If the spec is wrong, the artifact is wrong. The factory will produce the wrong artifact at the same speed it produces the right one. The factory is the wrong shape of the wrong thing faster than any human could.

- -

Teams discover this eventually. The factory is shipping. The customers are complaining. The metrics are flat. Someone looks at the artifacts and realizes the artifacts are exactly what the specs said to build. The specs are exactly what the engineers wrote. The engineers wrote what the market asked for. The market asked for the wrong thing. The factory shipped the wrong thing at scale.

- -

The factory did not break. The factory did what it was told. The factory is not the failure mode. The factory is the amplifier. The judgment that was missing is the failure mode. The factory just made the missing judgment load-bearing.

- -

What "encode taste" actually means

- -

There is a school of thought that says you can encode taste into the spec. The spec gets more detailed. The spec captures the shape. The spec becomes the artifact's design doc, and the design doc gets reviewed.

- -

That school of thought is half right. Some taste encodes. Naming conventions, layering, error handling, the explicit invariants. The encoded taste transfers through the factory. The factory produces artifacts that respect the encoded taste. The encoded taste shows up in the artifact's diff.

- -

The other half of taste does not encode. The other half is the part the senior engineer carries and cannot articulate. It is the part that knows the function should be three things, not one, before the function is written. It is the part that knows this commit is going to cause the next three. It is the part that knows the customer is asking for X but they need Y.

- -

You cannot encode that. You can write it down. You can review it. You can put it in a code review checklist. None of those things make it transfer. They make it visible. Visible is not the same as transferred.

- -

Provenance is the bridge, not the solution

- -

Provenance gets talked about as if it solves the taste problem. It does not. Provenance tells you where the artifact came from. Provenance does not tell you whether the spec was right.

- -

What provenance does is make the missing judgment legible. When the artifact fails, the provenance graph tells you which spec element the failure traces back to. The auditor can then ask: was that spec element the right call? The question is answerable. The answer is in the spec, not in the artifact.

- -

A microscope does not cure disease. A microscope tells you what disease you have. In a dark factory, the microscope is the only thing that keeps the missing judgment from being invisible until it is too late.

- -

The two kinds of taste

- -

Encoded taste is the part that goes in the spec. It transfers. It is reviewable. It is the part the factory can carry forward. The senior engineer's job is to push as much taste as possible into this category. Most of what we call code review is the act of pushing taste from the implicit category to the explicit one.

- -

Unencoded taste is the part that does not go in the spec. It does not transfer. It is reviewable only by other senior engineers who carry the same unencoded taste. It is the part that gets lost when a senior engineer leaves. It is the part that no dark factory, no matter how sophisticated, can carry.

- -

The dark factory does not have to carry the unencoded taste. The dark factory has to make the unencoded taste visible, so the human's audit can find the missing pieces.

- -

You cannot hire your way out of this. You cannot vendor your way out of this. You can only become the kind of engineer whose taste transfers through the spec, and accept that the rest of it has to stay in the audit.

- -
-
- -
- - diff --git a/src/pages/blog/three-questions-mentoring.astro b/src/pages/blog/three-questions-mentoring.astro index 3b2251c..012f35f 100644 --- a/src/pages/blog/three-questions-mentoring.astro +++ b/src/pages/blog/three-questions-mentoring.astro @@ -51,7 +51,8 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
diff --git a/src/pages/blog/token-anxiety.astro b/src/pages/blog/token-anxiety.astro index 2de5774..b62a8ec 100644 --- a/src/pages/blog/token-anxiety.astro +++ b/src/pages/blog/token-anxiety.astro @@ -7,7 +7,6 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; description="Token anxiety is BS. If you know what you're doing and optimize for outcomes, token cost is meaningless." ogType="article" canonicalUrl="/blog/token-anxiety" - pageType="blog" >
@@ -24,29 +23,45 @@ import BaseLayout from '../../layouts/BaseLayout.astro';

Token anxiety is BS.

-

I've watched otherwise smart people build elaborate token-budget spreadsheets. Track their daily consumption like it's a calorie deficit. Set alerts when they hit 80% of their monthly allocation. Wake up with their hands already on the keyboard, calculating whether they're getting enough value per prompt.

+

There's a term floating around Silicon Valley right now. Nikunj Kothari at FPV Ventures coined it: that feeling of "in this given unit of time, which we don't get back, how can I have AI do a lot more for me than the next person?" People checking their agents during parties. At bars. Walking through Dolores Park with laptops slightly open. Replacing evening Netflix with Claude Code, dreaming up new tasks to automate. Rushing the kids to bed so they can get back to the computer.

-

There's a name for this floating around the industry. Token anxiety. Tokenmaxxing. A thousand frameworks for managing the feeling that you're burning money on nothing.

+

The New York Times calls it "tokenmaxxing." Axios says AI agents "operate like slot machines" for power users. Stanford's AI Index shows junior developer employment down twenty percent since 2024. The industry is in what one former Grammarly lead calls "a collective identity crisis."

-

None of those names name the thing that's actually happening. The thing that's actually happening is not knowing what you're doing. Token anxiety is the symptom; directionless work is the disease. And the soft version of this conversation validates the anxiety. Offers coping strategies. Three questions before your next agent run. Mindfulness for token burners. Journaling your prompt chain. None of that fixes the thing that's actually broken.

+

All of that is real. The anxiety is real. The burnout is real. The junior dev pipeline collapsing is real.

-

Here's the math. If a token run costs five dollars and produces fifty thousand dollars of value, the tokens are free. If a token run costs five cents and produces nothing because the builder didn't know what they were building, the five cents was wasted. No amount of token optimization fixes the second case. No concern about the first case is rational.

+

The Real Problem

-

The anxiety isn't about tokens. It's about directionless work dressed up as optimization. Easier to optimize the thing you can measure than to figure out what you should be doing. So people optimize tokens. Call it discipline. Call it being power users. Write blog posts about how to manage the anxiety.

+

But token anxiety specifically, the anxiety about how many tokens you're burning, whether you're getting enough value per token, whether the person next to you is extracting more from their agent swarm than you are; that's not anxiety. That's a signal that you don't know what you're doing.

-

You don't manage the anxiety. You fix the direction.

+

If you know what you're doing and you optimize for outcomes, the token usage is meaningless. The outcome is always more valuable than the money spent on the tokens. Always. If a token run costs you five dollars and produces fifty thousand dollars of value, the tokens are free. If a token run costs you five cents and produces nothing because you don't have a clear outcome in mind, the five cents was wasted and no amount of token optimization will fix that.

-

We automated the how without examining the why. Then called the resulting anxiety a problem with the how.

+

The problem isn't the tokens. The problem is directionless work.

-

Running toward something; you don't count steps. Measure distance to the goal. Steps are just what legs do. Running with no destination; every step feels like waste. Start counting. Optimize the counting. Not running anymore; just counting. Mistake the motion for the progress and defend the counting until you're out of breath.

+
+

You don't cope with directionlessness. You fix the direction.

+
-

That's token anxiety.

+

Step-Counting

-

The question isn't whether you're using your tokens well. The question is whether you know what you're building. If you do, burn the tokens; the cost disappears into the outcome. If you don't, no token strategy in the world saves you from the five cents you just wasted on nothing.

+

Eric Weber, who led data and AI at Grammarly, put it plainly: "What is causing a lot of stress for people is that doing more doesn't necessarily create more leverage or impact. You're just doing more stuff. And so we don't spend a lot of time on the question: what should you actually be doing?"

-

Your tokens aren't the bottleneck. Your direction is.

+

We automated the how without examining the why. We built systems that maximize output while ignoring outcomes. Then we called the resulting anxiety "token anxiety" and wrote blog posts about how to cope with it.

-

So tell me what you're building. I'd like to hear it.

+

Think about it physically. If you're running toward something, you don't count your steps. You count your distance to the goal. Steps are just what legs do. If you're running and you don't know where you're going, every step feels like a waste and you start counting them, and then you start optimizing the counting, and then you're not running anymore; you're just counting.

+ +

That's token anxiety. It's step-counting by people who forgot where they were going.

+ +

The Fix

+ +

The fix isn't three questions before your next agent run. The fix is having an outcome before you start the run. If you can articulate what you're trying to accomplish, the tokens are infrastructure. If you can't, the tokens are a proxy for productivity, and optimizing a proxy never gets you to the real thing.

+ +

The agent revolution promised freedom. What it delivered was a new way to be busy. The difference between busy and productive has always been the same: do you know what you're building?

+ +

If yes, burn the tokens. If no, close the laptop and figure it out.

+ +
+

Your tokens aren't the bottleneck. Your direction is.

+
@@ -59,6 +74,10 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; padding: 12rem 2rem 6rem; } + .post-header { + margin-bottom: 3rem; + } + .post-meta { display: flex; gap: 1rem; @@ -75,10 +94,6 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; font-weight: 600; } - .post-header { - margin-bottom: 3rem; - } - .post-header h1 { font-family: var(--font-heading); font-size: clamp(2rem, 4vw, 3rem); @@ -146,4 +161,4 @@ import BaseLayout from '../../layouts/BaseLayout.astro'; padding: 1.5rem 1rem; } } - + \ No newline at end of file diff --git a/src/pages/blog/what-is-a-dark-factory.astro b/src/pages/blog/what-is-a-dark-factory.astro deleted file mode 100644 index 6554c03..0000000 --- a/src/pages/blog/what-is-a-dark-factory.astro +++ /dev/null @@ -1,131 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

What a Dark Factory Actually Is (and Isn't)

-
- -
- -

The phrase is everywhere. The working meaning is gone.

- -

I sat down to write about software factories, and the first thing I had to do was take the word back. Every vendor has a "dark factory" slide. Every Devops team has a "lights-out deployment" demo. The phrase has been stripped the way "platform engineering" was stripped, the way "Devops" was stripped before that.

- -

The marketing version: AI writes the code, the pipeline ships the code, humans go home early. That is a fantasy. It assumes the spec is correct, the spec is complete, the spec captures every invariant the running system has to preserve. None of those are true today.

- -

The working version is a smaller claim, and a more useful one.

- -

The working definition

- -

A dark factory is a build pipeline that ships production software with no human in the critical path. Spec in, artifact out. The intermediate steps happen unattended.

- -

The opposite is a light factory. Same inputs, same outputs, but a human signs off between every major stage. The human is the gate.

- -

Many teams are not running either. They are running a partial factory. Some stages are dark; CI runs unattended. Some stages are light; the merge to main requires a reviewer. The work is figuring out which stages should be which, and what the seams look like.

- -

The five positions

- -

Treating "dark" and "light" as a binary loses the part that matters. The positions, named:

- -
    -
  1. Manual. A person runs the commands. No factory yet; the engineer is the build system.
  2. -
  3. Assisted. CI exists. Tests run. A person merges. Many teams live here and call it Devops.
  4. -
  5. Light. Merge is gated by policy, not by reviewer. The pipeline is the gate. A human is the auditor, not the approver.
  6. -
  7. Dark, gated. The pipeline ships. A human is the only one who can promote from staging to production. The factory runs, but it cannot cross a particular seam without a key turn.
  8. -
  9. Dark, full. The pipeline ships. Promotion is policy-driven. The human's role is to write the policy and the spec, then to inspect the artifacts the factory produces.
  10. -
- -

The interesting range is between three and four. The question is not how to get to five. The question is which of your stages should be at which position, and why.

- -

What the framing changes

- -

Calling it a factory reallocates where the engineering effort goes.

- -

You stop asking who is on call for the deploy and start asking what the failure mode of the deploy step is. You stop asking how fast your engineers can merge and start asking how fast the policy can express a correct merge. You stop asking whether the code was reviewed and start asking whether the spec the code was generated from is auditable.

- -

A factory is designed, not grown. A factory is maintained, not improvised. A factory has a failure budget, not a heroism budget.

- -

If the build system you are running is a pile of bash scripts and a Slack channel, the factory framing is going to be uncomfortable. That is the point.

- -
-
- -
- - diff --git a/src/pages/blog/why-kubernetes-for-dark-factory.astro b/src/pages/blog/why-kubernetes-for-dark-factory.astro deleted file mode 100644 index 402f26d..0000000 --- a/src/pages/blog/why-kubernetes-for-dark-factory.astro +++ /dev/null @@ -1,136 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; ---- - - - -
-
- -

Why Kubernetes for a Dark Factory

-
- -
- -

A dark factory is a control loop. Kubernetes is the most boring control loop in production. That is the reason.

- -

What the substrate has to do

- -

A dark factory has four requirements from whatever it runs on.

- -
    -
  1. Declarative desired state. The system has to be able to say "I want N copies of this artifact running, signed, behind this policy," and have the substrate reconcile to that state unattended.
  2. -
  3. Restart and replace as a primitive. Failures are the steady state. "Kill it and start a new one" has to be cheap, automatic, and observable.
  4. -
  5. An operator-extensible control plane. The factory grows new resource types as the system grows. The substrate has to treat those types as first-class, not as jobs squashed into the lowest common denominator.
  6. -
  7. Boring upgrades. The factory runs unattended. The substrate cannot require a person to read release notes on a Saturday.
  8. -
- -

Kubernetes is not special because it is fast, or because it scales, or because it is cloud-native. Kubernetes is special because it is the only widely-deployed substrate that makes all four of those requirements boring.

- -

Why the alternatives fall short

- -

Serverless (Lambda, Cloud Functions, Workers) gets close on restart-and-replace. It fails on declarative desired state. The platform owns the loop, not you. The moment you need a custom resource type, the platform tells you no. A factory that wants to define a BuildRun cannot do it on Lambda.

- -

Systemd on a VM gets close on boring upgrades. It fails on the operator-extensible control plane. The minute you want a custom resource type, you are writing your own reconciler. You are now maintaining a control plane in addition to the factory. The single engineer does not have that time.

- -

Nomad is the most underrated of the three. Nomad is what Kubernetes would look like if HashiCorp had cared more about operator patterns and less about service mesh. Nomad is excellent. Nomad is also a single-vendor system, and the ecosystem of pre-built operators and CRDs does not exist. You will build everything from scratch.

- -

Docker Compose on a single host works until the host dies. Then the dark factory is dark in a different sense. The lights are off. The artifact is gone. You find out what your backup posture actually is.

- -

The single-engineer argument

- -

An operator is a reconciler. The operator watches a custom resource. The operator makes the cluster match the resource. The operator is written in Go and packaged as a container. The operator runs the same way the artifact runs. The operator is part of the factory.

- -

A platform team cannot build a custom resource type faster than a single engineer with an operator template. The single engineer's bottleneck is the spec, not the infrastructure. The infrastructure is the easy part. The hard part is figuring out what the factory should do, and that is the same problem at any team size.

- -

What Kubernetes does not give you

- -

Kubernetes does not give you a factory. Kubernetes gives you a substrate on which a factory can be built. The gap between "I have a cluster" and "I have a factory" is where the operator pattern lives.

- -

Kubernetes also does not give you provenance. The cluster will run whatever artifact you give it. The cluster does not know where the artifact came from. The cluster does not know whether the artifact was generated from a spec, or by a human, or by a model with no spec. The cluster does not care. Provenance is a layer above the substrate, and that is where the dark factory actually lives.

- -

If you are a single engineer trying to build a dark factory, the choice of substrate is not really a choice. Kubernetes is the answer. The interesting work is what you build on top of it.

- -
-
- -
- - diff --git a/src/pages/books.astro b/src/pages/books.astro index 3219304..4dcbc0b 100644 --- a/src/pages/books.astro +++ b/src/pages/books.astro @@ -49,6 +49,18 @@ import SharedForm from '../components/Form/SharedForm.astro';
+
+
+ Dark Provenance book cover +
+

Dark Provenance

+

Coming 2026

+

Formal verification for the AI age. How to audit what your AI actually did.

+

"Speckl and the dark provenance system. A new approach to AI accountability."

+ + +
+
@@ -158,12 +170,6 @@ import SharedForm from '../components/Form/SharedForm.astro'; text-decoration: underline; } - .waitlist-info { - font-size: 0.9375rem; - color: var(--color-text-muted); - margin: 0 0 0.75rem; - } - .waitlist-btn { display: inline-block; background: var(--color-brown); diff --git a/src/pages/consulting.astro b/src/pages/consulting.astro index f2d3130..77e110a 100644 --- a/src/pages/consulting.astro +++ b/src/pages/consulting.astro @@ -32,7 +32,7 @@ import PackageCard from '../components/PackageCard.astro'; "90-day cultivation roadmap", "Follow-up recommendations" ]} - priceRange="Starting from $2,500" + priceRange="Investment varies by scope" idealFor="Teams adopting AI but losing human coordination" /> @@ -46,7 +46,7 @@ import PackageCard from '../components/PackageCard.astro'; "Accountability mandate and cultivation practices", "Follow-up coaching session" ]} - priceRange="Typical range: $5,000–$15,000" + priceRange="Investment varies by scope" idealFor="Teams stuck in reactive mode, need structural change" /> @@ -57,10 +57,10 @@ import PackageCard from '../components/PackageCard.astro'; deliverables={[ "Weekly advisory calls", "Code review and architecture guidance", - "Speckl compile-time provenance audit", + "Speckl dark provenance audit", "Team mentoring and development" ]} - priceRange="From $8,000–$20,000/month" + priceRange="Monthly retainer, negotiable" idealFor="Startups and mid-size companies building agentic systems" /> @@ -100,7 +100,7 @@ import PackageCard from '../components/PackageCard.astro';

Ready to cultivate your team?

Schedule a discovery call. We'll talk about your situation and figure out the right engagement.

- Get in Touch + Connect on LinkedIn
@@ -129,7 +129,7 @@ import PackageCard from '../components/PackageCard.astro'; } .section-container { - max-width: 1200px; + max-width: 1000px; margin: 0 auto; padding: 4rem 2rem; } @@ -148,17 +148,10 @@ import PackageCard from '../components/PackageCard.astro'; .packages-grid { display: grid; - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; align-items: start; } - - @media (max-width: 900px) { - .packages-grid { - grid-template-columns: 1fr; - gap: 1.5rem; - } - } .faq-section { background: var(--color-cream-warm); diff --git a/src/pages/contact.astro b/src/pages/contact.astro index fc89af2..1d1a945 100644 --- a/src/pages/contact.astro +++ b/src/pages/contact.astro @@ -31,37 +31,23 @@ import SharedForm from '../components/Form/SharedForm.astro';

Other Ways to Reach Me

-

πŸ“§ Email

scott@scoble.me

-

πŸ”— Follow on LinkedIn

-

Daily AI insights, leadership perspectives, and team cultivation practices β€” from a practitioner who builds.

- - - Connect on LinkedIn for AI Insights - +

πŸ”— LinkedIn

+

Connect on LinkedIn

-

🐦 X / Twitter

-

Daily thoughts on cultivation, AI, and the intersection of people and systems.

- - - Follow on X - -
- -
-

πŸ’» GitHub

-

Open source projects: Speckl (formal provenance), ScobleClaw (agentic engineering), Beyond the Prompt.

- - - Explore Open Source - +

🐦 Social

+

+ LinkedIn β€’ + X/Twitter β€’ + GitHub +

@@ -181,57 +167,7 @@ import SharedForm from '../components/Form/SharedForm.astro'; margin: 0; color: var(--color-text-muted); } - - .contact-cta-text { - font-size: 0.9375rem; - color: var(--color-text-muted); - margin: 0 0 0.75rem; - line-height: 1.5; - } - - .contact-cta-btn { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0.625rem 1.125rem; - border-radius: 6px; - font-size: 0.9375rem; - font-weight: 600; - text-decoration: none; - border: 1px solid transparent; - transition: all 0.2s ease; - } - - .linkedin-btn { - background: #0a66c2; - color: white; - } - - .linkedin-btn:hover { - background: #004182; - color: white; - } - - .x-btn { - background: #0f1419; - color: white; - } - - .x-btn:hover { - background: #272c30; - color: white; - } - - .gh-btn { - background: #24292e; - color: white; - } - - .gh-btn:hover { - background: #404448; - color: white; - } - + .contact-option a { color: var(--color-green); text-decoration: none; diff --git a/src/pages/index.astro b/src/pages/index.astro index f313b25..33e734b 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,7 +1,6 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import PillarCard from '../components/PillarCard.astro'; -import NewsletterSignup from '../components/NewsletterSignup.astro'; --- - @@ -109,38 +107,27 @@ import NewsletterSignup from '../components/NewsletterSignup.astro'; - - - - - diff --git a/src/pages/rss.xml.ts b/src/pages/rss.xml.ts deleted file mode 100644 index 360973f..0000000 --- a/src/pages/rss.xml.ts +++ /dev/null @@ -1,216 +0,0 @@ -import type { APIRoute } from 'astro'; - -interface PostEntry { - title: string; - description: string; - url: string; - date: string; // ISO date string - tags: string[]; -} - -// Blog posts data β€” matches src/pages/blog/*.astro -// When adding a new post, add an entry here -const posts: PostEntry[] = [ - { - title: "50 First Dates with AI: Why Your AI Forgets Everything and What to Do About It", - description: "Every conversation with most AI systems is a first date. Here's the three-layer memory model that actually compounds β€” from Scott Scoble's scobleclaw experience.", - url: "/blog/50-first-dates-with-ai", - date: "2026-05-24", - tags: ["AI"], - }, - { - title: "Stop Strip-Mining Your Engineers: The Cultivation Alternative to Throughput Obsession", - description: "Gallup 2026: 80% of the global workforce is disengaged. Manager engagement has collapsed. The $438B cost isn't a tool problem; it's a people problem. Here's the cultivation alternative.", - url: "/blog/strip-mining-cultivation", - date: "2026-05-18", - tags: ["Leadership"], - }, - { - title: "Your AI Has Amnesia: Why Memory Architecture Is the Hardest Problem in Agentic Systems", - description: "The anterograde amnesia metaphor for AI memory architecture. Three-layer memory model for agentic systems from Scott Scoble's scobleclaw experience.", - url: "/blog/ai-has-amnesia", - date: "2026-05-18", - tags: ["AI"], - }, - { - title: "AI Exposes Leaders; The Cultivation Test", - description: "AI doesn't just change work β€” it exposes what kind of leader you already were. The cultivation test: give your team AI tools and watch what happens.", - url: "/blog/ai-exposes-leaders-cultivation-test", - date: "2026-05-07", - tags: ["Leadership", "AI"], - }, - { - title: "Mentorship Isn't Latency, It's Leverage", - description: "Why mentorship is the highest-leverage investment a leader can make β€” and why most leaders treat it as a cost instead.", - url: "/blog/mentorship-isnt-latency-its-leverage", - date: "2026-05-06", - tags: ["Leadership"], - }, - { - title: "Strip-Mining Is Happening Right Now", - description: "The extraction economy is not a future risk. It's happening right now in your organization. Here's how to recognize it and what to do about it.", - url: "/blog/strip-mining-happening-right-now", - date: "2026-05-05", - tags: ["Leadership"], - }, - { - title: "My Open Source Projects: Speckl, ScobleClaw, and Beyond the Prompt", - description: "A roundup of Scott Scoble's open-source projects β€” Speckl (spec compiler with provenance), ScobleClaw (agentic engineering framework), and Beyond the Prompt (workshop on building with AI agents).", - url: "/blog/open-source-projects", - date: "2026-05-23", - tags: ["Open Source"], - }, - { - title: "We're Going to Formally Verify SQLite", - description: "SQLite runs on every smartphone, every browser, every embedded system. Its core state machines have never been formally verified. Following the Kafka proof, we're tackling the most deployed database in history with SpeckDL and Z3 bounded model checking.", - url: "/blog/prove-sqlite", - date: "2026-05-23", - tags: ["Engineering"], - }, - { - title: "You're Already in the Agentic Wars", - description: "Meta has Hatch. Google has Remy. Everyone is building agents. Whose capability compounds?", - url: "/blog/agentic-wars", - date: "2026-05-08", - tags: ["AI"], - }, - { - title: "What Does AI Brain Fry Really Mean?", - description: "Gallup says 80% of the workforce is disengaged. The heaviest AI users are burning out fastest. The fix isn't training β€” it's structural.", - url: "/blog/ai-brain-fry", - date: "2026-05-03", - tags: ["AI"], - }, - { - title: "The Surveillance Dividend Is a Lie", - description: "Every company running AI adoption is making an implicit bargain: data for tools. The companies extracting the most surveillance are hemorrhaging their best talent.", - url: "/blog/surveillance-extraction", - date: "2026-05-03", - tags: ["Leadership"], - }, - { - title: "80% of Your Team Is Disengaged. It's Not Their Fault.", - description: "Gallup says 80% of the global workforce is disengaged. The $100B+ engagement industry has failed for 20 years. The fix isn't perks or surveys; it's structural.", - url: "/blog/gallup-disengagement", - date: "2026-05-03", - tags: ["Leadership"], - }, - { - title: "The Developer Experience Shift: Why Tooling Alone Won't Save You", - description: "Companies will spend $60B+ on developer tools in 2026. But the real DevEx crisis isn't tooling β€” it's autonomy, mastery, and belonging. As code production becomes commoditized, the human dimensions of engineering become the only competitive advantage that matters.", - url: "/blog/devex-shift", - date: "2026-05-03", - tags: ["Engineering"], - }, - { - title: "The Token Anxiety Trap; Why AI Agents Aren't Liberating Us (Yet)", - description: "Your agent swarm runs 24/7 and you're more anxious than ever. Stanford's 2026 AI Index shows a 20% drop in junior dev employment since 2024. The agent revolution promised freedom β€” instead it gave us token anxiety and a new kind of burnout.", - url: "/blog/token-anxiety", - date: "2026-05-04", - tags: ["AI"], - }, - { - title: "Three Questions That Changed How I Mentor", - description: "The simple mentoring framework that actually gets used β€” three questions that unlock real growth.", - url: "/blog/three-questions-mentoring", - date: "2026-04-28", - tags: ["Leadership"], - }, - { - title: "Three Signs Your Team Is Being Strip-Mined", - description: "The mindset shift that separates thriving teams from burned-out ones β€” cultivation over extraction.", - url: "/blog/strip-mining-signs", - date: "2026-04-28", - tags: ["Teams"], - }, - { - title: "The Soil Beneath The Code", - description: "A three-layer framework for understanding what makes engineering organizations healthy β€” or not.", - url: "/blog/the-soil-beneath-the-code", - date: "2026-04-28", - tags: ["Engineering"], - }, - { - title: "What a Dark Factory Actually Is (and Isn't)", - description: "The phrase is everywhere. The working meaning is gone. Here is what it is, what it isn't, and the five positions on the spectrum.", - url: "/blog/what-is-a-dark-factory", - date: "2026-05-22", - tags: ["Engineering"], - }, - { - title: "Light vs Dark Factories: Why the Middle Is Harder Than Either End", - description: "A light factory has too many gates. A dark factory has too few. The middle is where the engineering happens, and the middle is the part nobody talks about.", - url: "/blog/light-vs-dark-factories", - date: "2026-06-02", - tags: ["Engineering"], - }, - { - title: "Why Kubernetes for a Dark Factory", - description: "A dark factory is a control loop. Kubernetes is the most boring control loop in production. That is the reason.", - url: "/blog/why-kubernetes-for-dark-factory", - date: "2026-06-11", - tags: ["Engineering"], - }, - { - title: "Kubernetes Operator Patterns for Software Factories", - description: "An operator is a control loop with a domain in it. That is the whole definition. Here are the four operator patterns and the one anti-pattern to avoid.", - url: "/blog/operator-patterns-for-software-factories", - date: "2026-06-19", - tags: ["Engineering"], - }, - { - title: "The Taste Problem: What Dark Factories Can't Transfer", - description: "A dark factory can transfer code. It cannot transfer the judgment that knew the code was right. That is the problem provenance was invented to solve.", - url: "/blog/the-taste-problem", - date: "2026-06-29", - tags: ["Engineering"], - }, - { - title: "The Human-in-the-Loop Seam: Where Humans Belong in a Dark Factory", - description: "Human-in-the-loop is a phrase everyone uses. Almost nobody uses it correctly. The seam is in the spec, not in the implementation.", - url: "/blog/human-in-the-loop-seam", - date: "2026-07-08", - tags: ["Engineering"], - }, -]; - -const siteUrl = 'https://scott.scoble.me'; -const now = new Date().toUTCString(); - -// Build RSS XML -const items = posts - .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) - .map( - (post) => ` - - <![CDATA[${post.title}]]> - - ${siteUrl}${post.url} - ${siteUrl}${post.url} - ${new Date(post.date).toUTCString()} - ${post.tags.map((tag) => ` ${tag}`).join('\n')} - ` - ) - .join(''); - -const rssXml = ` - - - Scott Scoble Blog - Articles on AI, leadership, cultivation, and the human side of technology. - ${siteUrl} - en-us - ${now} - - ${items} - -`; - -export const GET: APIRoute = () => { - return new Response(rssXml, { - headers: { - 'Content-Type': 'application/rss+xml; charset=utf-8', - 'Cache-Control': 'public, max-age=3600', - }, - }); -}; diff --git a/src/pages/sitemap.xml.ts b/src/pages/sitemap.xml.ts index fc5f2ff..0fc7835 100644 --- a/src/pages/sitemap.xml.ts +++ b/src/pages/sitemap.xml.ts @@ -1,70 +1,28 @@ -import type { APIRoute } from 'astro'; - -const siteUrl = 'https://scott.scoble.me'; +import { getCollection } from 'astro:content'; const pages = [ - { url: '/', lastmod: '2026-06-01', priority: '1.0' }, - { url: '/speaking', lastmod: '2026-06-01', priority: '0.9' }, - { url: '/consulting', lastmod: '2026-06-01', priority: '0.8' }, - { url: '/books', lastmod: '2026-06-01', priority: '0.8' }, - { url: '/contact', lastmod: '2026-06-01', priority: '0.7' }, - { url: '/privacy', lastmod: '2026-06-01', priority: '0.3' }, - { url: '/about', lastmod: '2026-06-01', priority: '0.7' }, - { url: '/blog', lastmod: '2026-06-01', priority: '0.9' }, + { url: '/', lastmod: new Date().toISOString() }, + { url: '/speaking', lastmod: new Date().toISOString() }, + { url: '/consulting', lastmod: new Date().toISOString() }, + { url: '/books', lastmod: new Date().toISOString() }, + { url: '/contact', lastmod: new Date().toISOString() }, + { url: '/privacy', lastmod: new Date().toISOString() }, ]; -const speakingPages = [ - { url: '/speaking/50-first-dates', lastmod: '2026-06-01' }, - { url: '/speaking/strip-mining-to-cultivation', lastmod: '2026-06-01' }, - { url: '/speaking/soil-under-your-team', lastmod: '2026-06-01' }, -]; - -// All blog post URLs -const blogPosts = [ - { url: '/blog/50-first-dates-with-ai', lastmod: '2026-05-30' }, - { url: '/blog/strip-mining-cultivation', lastmod: '2026-05-30' }, - { url: '/blog/soil-health-teams', lastmod: '2026-05-30' }, - { url: '/blog/30-years-software', lastmod: '2026-05-30' }, - { url: '/blog/spec-first-audit-surface', lastmod: '2026-05-30' }, - { url: '/blog/open-source-projects', lastmod: '2026-05-30' }, - { url: '/blog/prove-sqlite', lastmod: '2026-05-30' }, - { url: '/blog/ai-has-amnesia', lastmod: '2026-05-30' }, - { url: '/blog/agentic-wars', lastmod: '2026-05-30' }, - { url: '/blog/ai-brain-fry', lastmod: '2026-05-30' }, - { url: '/blog/surveillance-extraction', lastmod: '2026-05-30' }, - { url: '/blog/gallup-disengagement', lastmod: '2026-05-30' }, - { url: '/blog/devex-shift', lastmod: '2026-05-30' }, - { url: '/blog/token-anxiety', lastmod: '2026-05-30' }, - { url: '/blog/three-questions-mentoring', lastmod: '2026-05-30' }, - { url: '/blog/strip-mining-signs', lastmod: '2026-05-30' }, - { url: '/blog/the-soil-beneath-the-code', lastmod: '2026-05-30' }, - { url: '/blog/strip-mining-happening-right-now', lastmod: '2026-05-30' }, - { url: '/blog/mentorship-isnt-latency-its-leverage', lastmod: '2026-05-30' }, - { url: '/blog/ai-exposes-leaders-cultivation-test', lastmod: '2026-05-30' }, - { url: '/blog/what-is-a-dark-factory', lastmod: '2026-05-22' }, - { url: '/blog/light-vs-dark-factories', lastmod: '2026-06-02' }, - { url: '/blog/why-kubernetes-for-dark-factory', lastmod: '2026-06-11' }, - { url: '/blog/operator-patterns-for-software-factories', lastmod: '2026-06-19' }, - { url: '/blog/the-taste-problem', lastmod: '2026-06-29' }, - { url: '/blog/human-in-the-loop-seam', lastmod: '2026-07-08' }, -]; - -const allPages = [...pages, ...speakingPages.map(p => ({ ...p, priority: '0.7' })), ...blogPosts.map(p => ({ ...p, priority: '0.7' }))]; - // Render the sitemap XML -const xml = `\<\?xml version="1.0" encoding="UTF-8"?\> +const xml = ` - ${allPages.map(page => ` + ${pages.map(page => ` - ${new URL(page.url, siteUrl).href} - ${page.lastmod} - ${page.url === '/' ? 'weekly' : 'monthly'} - ${page.priority} + ${new URL(page.url, 'https://scott.scoble.me').href} + ${typeof page.lastmod === 'string' ? page.lastmod : new Date(page.lastmod).toISOString().split('T')[0]} + weekly + ${page.url === '/' ? '1.0' : '0.8'} `).join('')} `; -export const GET: APIRoute = () => { +export const GET = () => { return new Response(xml, { headers: { 'Content-Type': 'application/xml', diff --git a/src/pages/speaking.astro b/src/pages/speaking.astro index 2811223..22a152c 100644 --- a/src/pages/speaking.astro +++ b/src/pages/speaking.astro @@ -16,10 +16,26 @@ import SharedForm from '../components/Form/SharedForm.astro';

Keynote Speaker

Helping leaders build AI systems that cultivate humans instead of strip-mining them.

- Book Scott for Your Event + Book Scott for Your Event + + +
@@ -31,7 +47,7 @@ import SharedForm from '../components/Form/SharedForm.astro'; title="50 First Dates with AI" slug="/speaking/50-first-dates" premise="Current AI memory architecture is anterograde amnesia β€” and we're all Henry Roth, recording VHS tapes every night so our agent can wake up functional tomorrow." - audience="Engineering leaders, AI product teams, CTOs implementing agentic systems" + idealFor="Engineering leaders, AI product teams, CTOs implementing agentic systems" takeaways={[ "Why your AI's 'memory' is actually just replay, not learning", "The three-layer memory architecture that actually compounds", @@ -43,7 +59,7 @@ import SharedForm from '../components/Form/SharedForm.astro'; title="From Strip-Mining to Cultivation" slug="/speaking/strip-mining-to-cultivation" premise="The shift from extraction to cultivation in AI-era teams. Why throughput optimization is killing your soil health." - audience="CTOs, VP Engineering, people leaders, engineering managers" + idealFor="CTOs, VP Engineering, people leaders, engineering managers" takeaways={[ "The difference between strip-mining and cultivation mindsets", "How to assess your team's soil health", @@ -53,9 +69,8 @@ import SharedForm from '../components/Form/SharedForm.astro';
+ +
+
+

Past Events

+ +
+
+

Game Changers Summit 2026

+

Featured Speaker β€” "From Strip-Mining to Cultivation"

+

March 2026 β€’ Virtual

+
+ +
+

AI Engineering Leadership Forum

+

Keynote β€” "50 First Dates with AI"

+

February 2026 β€’ San Francisco

+
+ +
+

Tech Leaders Collective

+

Workshop β€” "The Soil Under Your Team"

+

January 2026 β€’ Remote

+
+
+
+
+
@@ -93,9 +135,9 @@ import SharedForm from '../components/Form/SharedForm.astro';
  • Audience: Engineering leaders, CTOs, people managers
  • - πŸ“„ Download Speaker Profile (PDF) + πŸ“„ Download Speaker Profile (PDF) -

    Or email: scott@scoble.me

    +

    Or email: scott@scoble.me

    @@ -155,6 +197,29 @@ import SharedForm from '../components/Form/SharedForm.astro'; color: var(--color-brown-dark); } + .reel-section { + background: white; + } + + .video-container { + aspect-ratio: 16 / 9; + background: var(--color-cream-warm); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + } + + .video-placeholder { + text-align: center; + color: var(--color-text-muted); + } + + .video-placeholder p:first-child { + font-size: 1.5rem; + margin: 0 0 0.5rem; + } + .talks-section { background: var(--color-cream); } @@ -165,6 +230,42 @@ import SharedForm from '../components/Form/SharedForm.astro'; gap: 2rem; } + .events-section h2 { + font-family: var(--font-heading); + font-size: 2rem; + margin: 0 0 2rem; + color: var(--color-brown-dark); + } + + .events-list { + display: grid; + gap: 1.5rem; + } + + .event-item { + padding: 1.5rem; + background: var(--color-cream); + border-radius: 8px; + } + + .event-item h3 { + font-family: var(--font-heading); + margin: 0 0 0.5rem; + color: var(--color-brown-dark); + } + + .event-item p { + margin: 0; + color: var(--color-text-muted); + } + + .event-date { + font-size: 0.875rem; + font-style: italic; + color: var(--color-text-muted); + margin-top: 0.25rem; + } + .book-section { background: var(--color-brown-dark); color: white; diff --git a/src/styles/global.css b/src/styles/global.css index 91e3425..8c966f7 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -377,6 +377,24 @@ code { font-style: italic; } +/* --- Testimonials --- */ +.testimonials-grid { + display: grid; + gap: var(--space-xl); +} + +@media (min-width: 640px) { + .testimonials-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1024px) { + .testimonials-grid { + grid-template-columns: repeat(3, 1fr); + } +} + /* --- Page Header (non-hero pages) --- */ .page-header { padding: var(--space-3xl) 0 var(--space-2xl); @@ -452,37 +470,6 @@ code { .container { padding: 0 var(--space-md); } - - /* Prevent horizontal overflow on mobile */ - .hero .hero-subtitle, - .hero .hero-actions, - .page-header p { - overflow-wrap: break-word; - word-break: break-word; - } - - /* Ensure card grids go single column on small screens */ - .card-grid { - grid-template-columns: 1fr; - } - - /* Ensure form inputs don't cause horizontal scroll */ - .form-group input, - .form-group select, - .form-group textarea { - max-width: 100%; - box-sizing: border-box; - } - - /* Newsletter form stacks on mobile */ - .newsletter-form { - flex-direction: column; - gap: 0.5rem; - } - - .newsletter-form button { - width: 100%; - } } @media (min-width: 640px) and (max-width: 1023px) { @@ -494,56 +481,17 @@ code { /* Mobile touch targets (44px minimum) - Issue #65 */ @media (pointer: coarse) { .nav-links a, - .nav-mobile-link, - .nav-mobile-cta, - .nav-cta, .footer-links a, - .footer-social a, .book-link, .talk-link, .btn-primary, - .btn-outline, - .btn, - .form-submit, - .newsletter-form button, - .nav-menu-toggle { + .btn-outline { min-height: 44px; min-width: 44px; display: inline-flex; align-items: center; justify-content: center; } - - /* Make nav menu toggle easier to tap */ - .nav-menu-toggle { - padding: 0.75rem; - } - - /* Ensure footer social icons have adequate tap area */ - .footer-social a { - width: 44px; - height: 44px; - border-radius: 50%; - } - - /* Ensure select dropdowns are tappable on mobile */ - .form-group select { - min-height: 48px; - font-size: 1rem; - padding: 0.75rem; - } - - /* Ensure newsletter input and button are tappable */ - .newsletter-form input { - min-height: 48px; - font-size: 1rem; - } - - .newsletter-form button { - min-height: 48px; - min-width: 80px; - padding: 0.75rem 1.25rem; - } } /* Reduced motion - Issue #53 accessibility */