Skip to content
Empire StateField Notes

How it got here

Five months, one reset.

720 commits · Apr 9 – Sep 28, 2026 · milestones curated through 2026-09-12

  1. 2026-09-12

    Reconciliation as a role

    A reconciliation-terminal charter and the git conventions now live in the repo: one live session per worktree, the main checkout never on a feature branch, shared namespaces single-writer, and a stop point to open the PR the same hour. It answers sessions colliding on one checkout, not branches failing to merge.

    inspect real statefetch · rev-parseOthers idle?at a stop pointgh pr mergeserver-sidepull --ff-onlyhold — don't actyesa tip moved
    One terminal owns convergence, and it merges rather than builds. The charter lets it act only once every other session has pushed and gone idle; a branch tip that moves between two checks means someone is still live, so it holds.
  2. 2026-09-12

    Sessions, not branches

    Three Claude sessions sharing one working checkout, caught from the inside: a reconciliation pass stashed a sibling session's uncommitted work, watched a branch tip move three times between two commands, and found the main checkout sitting on another session's feature branch. The failure was never branches refusing to merge — it was sessions colliding on one checkout, and that diagnosis is what made the reconciliation rules necessary.

    What broke · one shared checkout
    session 1session 2session 3main checkouton a feature branchstashcheckoutcommit
    The rule · a worktree per session
    session 1session 2session 3worktreeworktreeworktreemainvia PR, same hour
    The failure was never branches refusing to merge; it was three sessions sharing one checkout. A reconciliation pass stashed a sibling's uncommitted work and watched a branch tip move three times between two commands. Now each live session has its own worktree and reaches main only through a PR.
  3. 2026-09-12

    Telemetry that cannot conflict

    The build-session Stop hook writes one shard per session instead of appending every worktree to a single tracked ledger — the one file guaranteed to conflict, and fourteen churn commits a month. The legacy ledger is frozen history; readers read both.

    Before · one tracked ledger
    worktree Aworktree Bworktree Cbuild-sessions.jsonltracked · every stop appended (retired)merge conflict14 churn commits/month
    After · a shard per session, out of git
    worktree Aworktree Bworktree Ca.jsonlb.jsonlc.jsonlgitignored — nothingto mergetracked history frozen; readers read both
    Every session's Stop hook used to append to one tracked file, which made it the one change guaranteed to conflict. Each session got its own file first (a union that can't collide), and on 2026-09-28 those shards moved out of git entirely, so a Stop hook no longer produces a commit at all. The old tracked ledger and shards stay as frozen history, and readers read both.
  4. 2026-09-12

    ADR correction + extractor self-test

    The build-quality judge caught ADR-8 Increment 1 claiming a scope it had never held. The fix struck the false claim in place rather than rewriting the record, dropped the unconsumed graph edges, and added a self-test so the extractor cannot regress silently — rebuild fell from about five seconds to a fifth of one.

    ADR-8 Increment 1claimed "scope held"Sonnet seat0.55 · flaggedGemini seat1.0 · passedSplitstrike the false claimin place, still visibledelete unread edges~5s → 0.2s rebuildadd --selftestcan't regress silently
    The judge's seats split on ADR-8's first increment, and the flagging seat was right: the graph stored edge types nothing read. The fix deleted them, struck the false claim where the record still shows it rather than rewriting history, and added a self-test.
  5. 2026-09-12

    Rigor that watches itself

    A graph of the repo's own skills, commands, hooks, and decision records now rebuilds at the start and end of every session and reports any reference pointing at a file that no longer exists, so a routine rename surfaces on its own. The rigor layer had only ever recorded what was invoked; this is the first piece of it that is triggered. (Its session hooks were unregistered in the 2026-09-28 reset; the graph is now rebuilt by hand.)

    Before · invoked
    a file is renamedsomeone runs the checknobody doesbroken refs founddrift goes unseen
    After · triggered
    a file is renamedSessionStart hookno one invokes itrebuild system graphstdlib · zero tokens≤5 findingsin the next session'scontext
    Every rigor control used to be a command someone had to remember. The system graph now rebuilds on session start and stop, so an ordinary rename surfaced at the next session start naming all three files that still cited the old path, with nobody running anything.
  6. 2026-09-12

    Reference check stops misfiring

    The dangling-reference check that caps the judge's completeness score no longer mistakes path templates for missing files, and no longer hides real broken references sharing a line with a template. A self-test now asserts the judge's checker and the graph's extractor agree, where that rule had been held only by a comment.

    a line with referencesPath template?skip that token onlykeep checking the linefile exists?report if missing{slug}real path
    The first bug reported templates like evolution-log-{slug}.md as missing files, capping the judge's score over references that were never broken. The first fix over-corrected and skipped whole lines, hiding real breaks beside a template. Now only the template token is skipped, and a self-test holds the checker and the graph extractor to the same rule.
  7. 2026-09-12

    The inbox as a signal source

    Gmail became a first-class market-intelligence source: an allowlisted scan extracts company and product signals from newsletters into the graph, deduplicated on the redirect-resolved article URL so one story cited by four newsletters lands once. Resolving those links also caught two factual errors before they could reach content.

    Stage A · one-timediscoverysender · subject · frequency — no bodiesallowlistAlex curatesStage B · allowlistedbodies onlysignal filterdrops marketing · transactional · personalstructured extractionno write toolsdedup on the resolvedURLafter following redirectsapprove before writeevent rowslaunch · market · funding · exec_move
    The miner doesn't read mail bodies by default: a metadata-only pass bootstraps an allowlist, and only allowlisted senders are read. Signals are deduplicated on the article's real URL after following tracking redirects, so one story cited by four newsletters lands once — and every write waits for approval.
  8. 2026-09-11

    Event posts become one arc

    The pre-event and post-event posts became a single two-part arc: the pre-event post sets the table on the topic, the presenter's perspective, and the broader implications without resolving them, and the post-event post resolves that setup against what was actually said and argued. The research brief also became canonical as one discrete Content Draft rather than being duplicated into the Event page.

    research briefone Content Draftpre-event postmacro → micro → implicationsthe eventpost-event postresolves the setupsets the tablewhat was saidPre→Post gap
    The two per-event posts became one deliberate arc. The pre-event post frames the topic without resolving it; the post-event post cashes that setup against what was actually said and argued, mining the gap the brief recorded between expectation and the room.
  9. 2026-07-31

    Toolbox generator

    A drift-proof generator scans the live skill, agent, and command set — the counts on this site regenerate from source instead of being hand-typed. (Retired in the 2026-09-28 reset; the counts now come from the system-map generator.)

    .claude/ frontmatterskills · agents · commandspnpm gen:toolboxtoolbox.jsoncounts + cataloghome page stats/architecture counts/ops/toolboxscanswrites
    The counts on this site aren't typed by hand. A generator scans the live skill, agent, and command files and writes one JSON file that every page reads, so the numbers can't drift from what actually exists.
  10. 2026-07-30

    Live operator dashboards

    A dedicated telemetry project now backs the /ops surfaces: build-rigor on /ops/rigor and the market-intelligence feed on /ops/market-intel. (Both dashboards were retired in the 2026-09-28 reset.)

    build hooksMI producersPostHog projectbuild telemetry onlyMI graphSupabase/ops/rigor/ops/market-intelwrite keyread key
    Build telemetry moved to its own PostHog project so delivery signal never mixes with product analytics, with write and read keys split by scope. Each /ops surface reads exactly one system.
  11. 2026-07-17

    Cross-provider judge

    The build-quality judge became a two-provider quorum — a Claude seat plus an independent Gemini seat — so it can't just prefer its own family's work. (Pared back to one on-demand Sonnet reviewer in the 2026-09-28 reset.)

    SAME RUBRICartifactmechanized checksdangling refs · skeletonClaude seatSonnetGemini seatProAgree?auto passseats agreeAlex breaks the tiesplit · interactivefail-safe FLAGsplit · autonomous
    Two model families score every build against one versioned rubric. Agreement passes; a split escalates to Alex, or becomes a non-destructive FLAG when he isn't present — a disputing model never gets to break its own tie.
  12. 2026-06-25

    Build-rigor + measurement layer

    A definition-of-done gate and build-session telemetry: every non-trivial build leaves a durable trace instead of shipping on green checks. (Retired in the 2026-09-28 reset: the gate, the weekly /rigor-review and the value-action registry are gone; build discipline now lives in the PR template.)

    Before · rigor in optional docs
    buildgreen checksrigor docsskippableshipno traceoptional
    After · in the execution path
    buildjudge quorumadvisoryDoD gatemet or waived + reasonStop hookbuild_session rowHub /ops/rigor
    The diagnosed failure was structural: rigor lived in documents a memory-less agent could skip, so builds shipped on green checks and left no trace. The fix puts each check in the path every build already runs through.
  13. 2026-06-12

    Empire State Hub

    This site — a dual-lens portfolio and live operator cockpit, built on the pipeline's own data.

    SYSTEMS OF RECORDSERVER-ONLY READ LAYERTWO AUDIENCESMI graphSupabasetelemetryPostHogcontent draftsNotionbacklogLineargenerated JSONjournal · toolboxtyped clientssecrets stay server-side/ops cockpitpassword gatepublic portfolioeditorial ⇄ technicalread-onlyPII designed out of public
    The hub never writes. It reads its systems of record through server-only clients and serves one set of content two ways: a password-gated cockpit, and a public portfolio with contact data designed out.
  14. 2026-06-11

    Execution-focus window closed

    Retired the no-build rule once it inverted, and replaced it with a steering bias: build only what removes real publishing friction.

    No-build rule
    a build ideablocked by the rulepublishing frictionstays
    Steering bias
    a build ideaRemoves realpublishing friction?build itpark ityesno
    The no-build rule protected execution until it started blocking the fixes execution needed. It was retired for a steering bias: build only what removes real publishing friction, and park the rest.
  15. 2026-05-30

    Voice system v0.5

    Stance must be earned by space and expertise; decenter the self; the weekly roundup sets the table, it doesn't take a side.

    a stance in a draftEarned by space andexpertise?take the sidereport the roominsteadyesno
    Voice v0.5 made stance something a post has to earn: a draft takes a side only when the space and Alex's expertise support it, and otherwise reports what the room said. The weekly roundup sets the table and takes no side at all.
  16. 2026-05-28

    Post-event brief as canonical store

    Every post-event run now produces one browsable brief that all downstream content references.

    post-event runpost-event briefone per eventpostsoutreach notescross-event synthesisproduces
    Every post-event run produces one browsable brief, and everything downstream references it rather than each piece re-reading the transcript on its own.
  17. 2026-05-26

    Visual briefs + source discipline

    Gamma as the default infographic generator; any firm- or person-level thesis claim needs a cited source before it goes public.

    a thesis about a firmor personCited source?can go publichold and verifyyesno
    Any public claim about a named firm or person needs a cited source before it ships; without one the draft holds for verification. The same batch made a visual brief standard alongside every post.
  18. 2026-05-21

    /post-event-content

    Manual transcript → conditioning → a brief → drafted content and outreach.

    transcriptpasted manuallyconditioningpost-event briefdrafted postsoutreach notes
    Workflow B's first version: a manually pasted transcript is conditioned, synthesized into a post-event brief, and drafted into posts and outreach. Automatic capture was left out because the recording integration wasn't working.
  19. 2026-05-20

    /check-new-events

    The calendar invite becomes the structured intake — a PIPELINE block added at acceptance time.

    Going to Eventscalendarnext 14 daysPIPELINE block?/event-deep-researchone event at a timepre-event-contentskippedyesno
    The calendar invite became the structured intake: accepting an event means adding a PIPELINE block naming the speakers, host, and topics. The command finds those invites, drops any already in Notion, and runs research and pre-event content one event at a time.
  20. 2026-05-13

    Systems-thinking harness

    A Meadows-grounded diagnostic agent, and Linear as the single source of truth for what's open.

    a recurring failuresystems-analyst8-phase Meadows diagnosticarchetype namedleverage pointsLinearthe one list of what's open
    Chronic problems go to a diagnostic agent that names the underlying archetype and where intervention has leverage, instead of patching the symptom. Linear became the single source of truth for what's open, so that work is tracked in one place.
  21. 2026-05-07

    Orchestrator → synthesizer pivot

    Resolved the SDK constraint: parent-thread fan-out plus a synthesis-only subagent.

    Tried · orchestrator subagent
    Parent threadorchestrator subagent4 specialistsdispatchno Agent tool
    Built · parent-thread fan-out
    Parent threadcompanypersontopicsignalsynthesizertext in, text outone brief
    A subagent can't dispatch its own subagents, so an orchestrator agent dead-ends (tested across five agents on 2026-05-07). The parent conversation launches all four specialists in one message and hands their returns to a synthesis-only agent.
  22. 2026-05-04

    Multi-agent rebuild

    /event-deep-research — parallel research specialists replacing the monolithic skill.

    Before · one monolithic skill
    inviteevent-research skillevery step, one contextbrief
    After · parallel specialists
    invitecompanypersontopicsignalsynthesizerbrief
    /event-deep-research replaced a single skill that did everything with four specialists researching in parallel, each deep on one kind of entity, and a synthesizer that converges what they return.
  23. 2026-04-09

    Pipeline, take 3

    Skill-first architecture with direct MCP writes — no n8n, no middleware. The reset that worked.

    Earlier takes · middleware
    Clauden8n workflowsmiddlewareNotion
    Take 3 · skill-first
    Claude skillsdirect MCP writesNotionHubSpot
    Take 3 removed the middleware layer: skills write to Notion and HubSpot directly over MCP, so nothing sits between the agent and the systems of record.