I make AI less about chatting and more about doing.
I am an entrepreneur, builder, and recovering tab-hoarder currently building and learning in public. Each week I sift the AI-verse by actually doing — and send back signals: from what the vibe coders are shipping, and what it unlocks for whatever you're building.
Stanford professor Jeffrey Pfeffer argues that self-sufficiency — the instinct to do everything yourself — is one of the most career-limiting beliefs people carry, mistaking independence for strength.
NVIDIA posted a $96.2B quarter while a separate survey shows only 4% of companies expect to cut jobs because of AI. The AI spending cycle is accelerating while mass displacement fears remain unmaterialised — via Peter Diamandis's podcast.
learnedMy deploy had been broken for two weeks and nothing told me.A cron job pulls my code onto a server every ten minutes. Someone changed how it authenticates, the pull started failing, and the job carried on running the old code perfectly happily. No error anywhere I'd look, because a thing that fails quietly and keeps working looks identical to a thing that's fine.
I only found it because I went to deploy something. Two weeks of "working" that wasn't.
learnedMy portfolio tool reported ten broken projects. It was one expired token, and my own error handler had mislabelled it.Vercel answers an expired token with a 403, not a 401. My adapter read 403 as "you don't have access to this project" and printed that ten times. I spent the morning investigating ten permission problems that did not exist. The tool wasn't lying about the data. It was confidently wrong about the cause, which is worse.
learnedMy writing agent passed 98% of its own drafts. I was rejecting half of them.I've been running a writing agent for two months with a quality check bolted on. This week I finally compared what the check passed against what I actually published: it approved 98% of drafts, and I'd been rejecting about half. It was grading the thing that was easy to grade, not the thing I cared about.
The useful part was what I found while looking. Every rejection had a reason on it, written by me at the time. Forty-three of them. The system had been collecting the answer all along and had never once read it back.
learnedGiving too much content makes it impossible for AI to process. You need to take bite-size chunks rather than large content dumps.Learnt this rebuilding an investor site from two big source documents. The sessions that worked carved one chapter, one claims table, one design archetype at a time. The ones that struggled were the ones handed everything at once.
learnedGreen checks against identical data prove nothingMoved a production site between hosting accounts today and reported the database cutover as verified — pages rendered, admin worked. It was all still serving from the old database. When two systems hold identical data, every check you run passes on both, so the probe cannot tell you which one answered. The proof I should have started with was one API field showing the deploy hook had never fired. Verify the wiring, not the rendering.
The robot spine behind this site. An agentic content pipeline that drafts, scrubs and ships posts across channels — so the newsletter and the socials keep moving while I build.
personal-osSteven Personal OS: ▶ ARTICLES SECTION is the live build need (07-09).active
▶ ARTICLES SECTION is the live build need (07-09). Build a real Articles section — index/listing + reading template + nav, stronger styling (the 'Article Studio' need). A one-off route at /content/articles/the-build-got-cheap was REJECTED by Steven: styling weak, and articles need their own section.
Article #1 body is APPROVED at `drafts/articles/2026-07-09-the-build-got-cheap.md` (AI makes ALIGNMENT cheap, not just building; spec-as-bible; scope-creep-when-cheap; north-star-holds). Publish once the section exists: add an `os_signals` row `channel='article'` + prod.
Uncommitted WIP on disk for that article — the route, `Artwork.tsx` (convergence-field hero + wave), `PhasesLoop.tsx`, anonymised fragments under `public/media/articles/build-got-cheap/`. Salvage or rebuild.
▶ SIXTY4SIXTY is the monetisation answer and is BUILDING (2026-08-14). Tracker LIVE at https://sixty4sixty.vercel.app/tracker.html; domain attached. Detail: [[project_sixty4sixty]]
SIXTY4SIXTY — Steven owes DNS at GoDaddy: CNAME `sixty4sixty` -> `cname.vercel-dns.com`. ⚠ Do NOT touch the apex A or the www CNAME.
SIXTY4SIXTY — Steven owes the start date, or the 06:30 morning-nudge timer cannot compute the day number; it is written but NOT installed without it.
SIXTY4SIXTY — the 3-day manual pilot GATES all further build. Run it before writing more code.
NEWSLETTER SEQUENCING IS AN OPEN CALL. Spec `2026-07-24-newsletter-launch-design.md` Phase 2 does DAILY radar first, WEEKLY second. Recommendation on the table, unanswered: invert it — the weekly (curated best-of + Steven's take) is the differentiated product, ships to a list of one, needs no per-subscriber batching.
⚠ Real subscriber count is ZERO — the single row is a bot signup. Judge any monetisation or newsletter plan against that. The highest-leverage growth action (point 7,775 LinkedIn followers at the signup) currently sits LAST in the sequence, behind a product that cannot send.
Newsletter: Steven to click the confirm link and check inbox-vs-spam. Double-opt-in is E2E verified but first-send placement is unproven — the root domain carries a GoDaddy DMARC `p=reject`.
⚠ DMARC `rua=` points at GoDaddy's address, not Steven's, so he receives NO failure reports.
⚠ Resend free tier is 3,000/mo and 100/day — a daily mailer to a real list breaks that.
jarvisHouse Jarvis: ALL 4 TIMERS HEALTHY as of 2026-08-11 18:45 UTC — first time since June.active
ALL 4 TIMERS HEALTHY as of 2026-08-11 18:45 UTC — first time since June. Both Google accounts re-paired (steve@dig-in.io 08:03, incubatepro@gmail.com 18:43 via incognito) and the heartbeat ran clean, reaching agent.tool_call surface_proposal. Backup fixed the same day. Nothing on this project is broken right now.
Re-pairing a Google account: use the `?email=` form — see "Re-pairing" in the body. `role` names the household member only and cannot choose between Steve's two Google accounts.
⚠ OPEN: incubatepro Gmail forwarding is unconfirmed. The confirmation mail is in the Jarvis inbox dated 24 Jun 2026 15:16 from forwarding-noreply@google.com — buried among five same-day Google security alerts, which is why it reads as missing.
If that confirmation link is dead (7+ weeks old), re-issue from incubatepro Gmail → Settings → Forwarding and POP/IMAP.
Context: the mailbox is NOT starved — Salesianos 3 Aug and Alex's Family HQ weeklies (26 Jul / 2 Aug / 9 Aug) all arrived. Only incubatepro's auto-forward is missing.
⚠ OPEN: the rotated age private key at `~/.config/age/jarvis-v2.txt` is again the ONLY copy — put it in the password manager. Without it no backup can be decrypted.
Consider fixing the fragility this exposed: one dead Google account 500s the whole heartbeat/calendar path (flagged 2026-05-08, still open). Degrade per-account instead.
Visual smoke on the live fridge (auth-gated; Steven eyeballing) — all 5 tabs now live-data
Voice on-device check (iPad Safari mic permission + en-GB) — logic tested, hardware untested
Follow-ups (deferred minors, see repo .superpowers/sdd/progress.md): client refresh at local midnight (always-on iPad staleness); multi-day span fan-out across week strip; past-dated birthday invisible until refetch after add; mid-loop flush-failure poison persistence
07-13 hosting Q answered: house-jarvis is its OWN Vercel project (steven-dig-ins-projects team); only the DOMAIN is shared (subdomain of steven-murray.com apex). Offered dedicated domain — Steven not yet decided.
PostsStanford study: AI is hitting entry-level workers hardest — young employment in AI-exposed fields down 19%. The first wave is closing the door in, not replacing veterans. Via Ars Technica.Stanford just published a study — young workers in AI-exposed fields saw employment drop 19% compared to people in more AI-resistant jobs.
So the first big labour wave isn't replacing the veterans. It's closing the door on the way in.
Which makes complete sense when you think about how this actually plays out inside companies. Seniors are the ones deciding which workflows to automate. They're also the ones who know enough to leverage AI without losing the plot. So they automate the entry-level work, look more productive, and the grad intake quietly disappears.
The problem is that this is a short-sighted move, even if nobody's calling it that yet. Juniors aren't just cheap labour. They're how institutional knowledge gets passed down. They're how you build a team that can eventually operate without you. Remove that pipeline and you've traded short-term efficiency for a skills cliff a few years out.
AI isn't going to stop at the entry-level tasks. It never does. The seniors automating junior work today are just buying themselves a few years before the same logic creeps up the ladder.
The orgs that figure out how to use AI and still develop people are going to be in a completely different position than the ones who just quietly stopped hiring juniors.
https://arstechnica.com/ai/2026/08/ai-is-hitting-entry-level-jobs-hardest-stanford-study-finds/
the-forgeThe Forge: ▶ ATTACK 2026-08-25 (Steven's call, /portfolio sweep, 28d idle): BUILD THE ARTICLE…active
▶ ATTACK 2026-08-25 (Steven's call, /portfolio sweep, 28d idle): BUILD THE ARTICLE OUTPUT-QUALITY GATE. Define what 'good' means for a Forge article (voice, structure, argument), make it an evaluable rubric, and wire it as a gate so the ledger cannot report COMPLETE on bad prose. Fixing the generalisable failure, not just one article — that was the explicit choice over 'just fix the prompt'.
ARTICLE OUTPUT QUALITY is the live problem (Steven 2026-07-27: 'the article output was poor'). Content v2 A/B/C are all SHIPPED and every SDD task passed review — but NO task in the spec ever measured whether the essay is GOOD. The ledger graded 'does the rewriter route return 200', not the writing. Fix the generation quality (voice, structure, argument), not the plumbing.
Spec-design lesson to carry elsewhere: for any generative feature, put an explicit output-quality gate in the plan (a human accept/reject on real output, like signal-layer's persona acceptance rounds) or the ledger will report COMPLETE on bad output.
Still open behind that: SSO v2 (share os_session across subdomains; gateAuth.verifySessionValue is the swap seam) · first REAL position publish
hybrid-aHybrid Athleticism: ▶ ATTACK 2026-08-25 (Steven's call, /portfolio sweep, 28d idle): BUILD THE…active
▶ ATTACK 2026-08-25 (Steven's call, /portfolio sweep, 28d idle): BUILD THE CHECK-IN/READINESS LOOP. Wire submitSelfReport to a real UI surface — it has zero callers and athlete_self_reports has 0 rows, making it the only half-built surface in the app. Chosen over spec-review-first and over deleting the dead code.
WATCH next week/block generation for conditioning variety (07-26 fix): rotation warning appears in logs if the format repeats; Block 5 strategy must come out intent-only (no example workouts)
VISUAL VERIFICATION CLOSED 2026-07-27 (Steven: 'surfaces are good') — logger %TM+AMRAP badge, session-close summary, rebased week view all confirmed. No visual debt outstanding.
NEXT UP (spec review 07-27): the endurance-domain-wiring plan is FEATURE COMPLETE and merged (0e90d58). The remaining backlog below is unspecced follow-on work — pick the check-in/readiness loop first: it is the only item with dead code already shipped (submitSelfReport has zero callers, athlete_self_reports has 0 rows), so it is half-built and invisible.
Commentary lifecycle still unfixed: coach_notes copied generation → inventory → workout with no owner or clearing step; regeneration leaves stale notes
Close-block nudge may fire early from 2026-08-10 (mesocycles.end_date is GENERATED, can't move with a rebase) — key it off all-sessions-resolved instead
Wire the check-in/readiness loop (submitSelfReport etc. still zero-caller; athlete_self_reports still 0 rows)
nextSetRecommendation → WorkoutLogger (~10 lines; delta already computed and rendered)
Garmin OAuth re-pair (token paste or CSV fallback)
Possible polish: stale-sessions banner shows date range not just 'week 1'; 'log it late' path from stale modal (backdate exists but no launch UI for past-week workouts)
the-forgeThe Forge: ▶ ATTACK 2026-08-24 (Steven's call, /portfolio sweep, 28d idle): BUILD THE ARTICLE…active
▶ ATTACK 2026-08-24 (Steven's call, /portfolio sweep, 28d idle): BUILD THE ARTICLE OUTPUT-QUALITY GATE. Define what 'good' means for a Forge article (voice, structure, argument), make it an evaluable rubric, and wire it as a gate so the ledger cannot report COMPLETE on bad prose. Fixing the generalisable failure, not just one article — that was the explicit choice over 'just fix the prompt'.
ARTICLE OUTPUT QUALITY is the live problem (Steven 2026-07-27: 'the article output was poor'). Content v2 A/B/C are all SHIPPED and every SDD task passed review — but NO task in the spec ever measured whether the essay is GOOD. The ledger graded 'does the rewriter route return 200', not the writing. Fix the generation quality (voice, structure, argument), not the plumbing.
Spec-design lesson to carry elsewhere: for any generative feature, put an explicit output-quality gate in the plan (a human accept/reject on real output, like signal-layer's persona acceptance rounds) or the ledger will report COMPLETE on bad output.
Still open behind that: SSO v2 (share os_session across subdomains; gateAuth.verifySessionValue is the swap seam) · first REAL position publish
~/newsletter
One AI signal newsletter a week. Zero hype, mostly.
What the vibe coders are building and what AI is unlocking for builders and operators. Written for people who ship.