Last active
September 16, 2026 13:41
-
-
Save ulfaslak/438bdd8cb902f2af288fd221fdf76d95 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!doctype html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <title>Coding Agents & Context Engineering — IDA course deck</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com"> | |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..700;1,9..144,300..700&family=IBM+Plex+Sans:ital,wght@0,300;0,400;0,500;0,600;1,400&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet"> | |
| <style> | |
| /* ===================================================================== | |
| DECK ENGINE STYLES | |
| Sections (grep for "== "): | |
| == tokens colour / type tokens, light + dark | |
| == base reset, body layout (toc + stage) | |
| == chrome silent progress: top label, harness label, n/N, hairline | |
| == toc slide-out contents panel | |
| == slide slide container + generic layout classes; cover slides | |
| == type headings, kicker, statement, lists (grid: marker | text ; detail) | |
| == components cards, pills, tables, code, tree, timeline, layers, mocks | |
| == frag fragment reveal | |
| == tooltip hover tips on [data-tip] | |
| == widgets shared widget chrome, then one block per widget | |
| == overlays notes / file / help modals | |
| == misc cursor hide, motion, small screens | |
| ===================================================================== */ | |
| /* == tokens ========================================================= */ | |
| :root { | |
| --bg: #f5f0e7; --bg-2: #ece5d7; --bg-3: #e2d9c8; | |
| --ink: #1d1a16; --ink-2: #4a443c; --mute: #8b8377; --line: #d6cdbd; | |
| --accent: #c94f1d; --accent-soft: #f2dccd; | |
| --harness: #2f5f8c; --harness-soft: #d5e2ee; | |
| --ok: #3d7a57; --ok-soft: #d7e8dc; | |
| --warn: #b0791a; --warn-soft: #f0e3c3; | |
| --bad: #b8332a; --bad-soft: #f1d4d0; | |
| --font-display: "Fraunces", "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif; | |
| --font-body: "IBM Plex Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; | |
| --font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; | |
| --radius: 6px; --toc-w: 340px; --ease: cubic-bezier(.2,.7,.2,1); | |
| } | |
| [data-theme="dark"] { | |
| --bg: #171512; --bg-2: #1f1c18; --bg-3: #2a2621; | |
| --ink: #efe9dd; --ink-2: #cfc7b9; --mute: #8d857a; --line: #36302a; | |
| --accent: #ea7a45; --accent-soft: #3d2416; | |
| --harness: #7cb0e0; --harness-soft: #1b2f42; | |
| --ok: #6fbf8a; --ok-soft: #1c2f24; | |
| --warn: #d9a53a; --warn-soft: #3a2f14; | |
| --bad: #e0685e; --bad-soft: #3c1e1b; | |
| } | |
| /* == base =========================================================== */ | |
| *, *::before, *::after { box-sizing: border-box; } | |
| [hidden] { display: none !important; } | |
| html, body { height: 100%; } | |
| body { margin: 0; background: var(--bg); color: var(--ink); font-family: var(--font-body); font-size: 18px; line-height: 1.45; display: flex; overflow: hidden; -webkit-font-smoothing: antialiased; } | |
| body.no-cursor, body.no-cursor * { cursor: none !important; } | |
| a { color: var(--harness); text-decoration: none; border-bottom: 1px solid color-mix(in srgb, var(--harness) 40%, transparent); } | |
| a:hover { border-bottom-color: var(--harness); } | |
| kbd { font-family: var(--font-mono); font-size: .78em; padding: .1em .45em; border: 1px solid var(--line); border-bottom-width: 2px; border-radius: 4px; background: var(--bg-2); color: var(--ink-2); } | |
| code { font-family: var(--font-mono); font-size: .9em; background: var(--bg-2); padding: .08em .35em; border-radius: 4px; } | |
| [data-file] { cursor: pointer; } | |
| code[data-file], td[data-file], span[data-file] { color: var(--harness); border-bottom: 1px dotted var(--harness); } | |
| pre { margin: 0; } | |
| .mute { color: var(--mute); } .accent { color: var(--accent); } .harness { color: var(--harness); } .ok { color: var(--ok); } .bad { color: var(--bad); } | |
| .small { font-size: .8em; } .center { text-align: center; } .nowrap { white-space: nowrap; } | |
| /* == chrome ========================================================= */ | |
| #stage { position: relative; flex: 1; min-width: 0; height: 100vh; overflow: hidden; } | |
| #chrome-top { position: absolute; top: 22px; left: 36px; z-index: 5; font-size: 13px; letter-spacing: .06em; text-transform: uppercase; color: var(--mute); display: flex; gap: .6em; pointer-events: none; opacity: .85; } | |
| #chrome-top .chrome-chapter { color: var(--ink-2); } | |
| /* top-right corner: IDA Learning logo (small on every slide, large on chapter title pages) with the harness label beneath */ | |
| #chrome-corner { position: absolute; top: 22px; right: 36px; z-index: 5; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; pointer-events: none; transition: top .32s var(--ease), right .32s var(--ease); } | |
| #chrome-logo { width: 84px; color: var(--ink); opacity: .85; transition: width .32s var(--ease); } | |
| #chrome-logo svg { width: 100%; height: auto; display: block; } | |
| body.on-title #chrome-corner { top: 9vh; right: 7vw; } | |
| body.on-title #chrome-logo { width: clamp(110px, 9vw, 150px); opacity: .9; } | |
| #chrome-harness { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--mute); opacity: .5; } | |
| body.harness-other #chrome-harness { color: var(--accent); opacity: .9; } | |
| #chrome-count { position: absolute; right: 36px; bottom: 20px; z-index: 5; font-family: var(--font-mono); font-size: 13px; color: var(--mute); opacity: .85; pointer-events: none; font-variant-numeric: tabular-nums; } | |
| #chrome-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; z-index: 5; pointer-events: none; } | |
| #chrome-bar .fill { height: 100%; width: 0; background: var(--ink-2); opacity: .35; transition: width .3s var(--ease); } | |
| /* == toc ============================================================ */ | |
| #toc { width: 0; flex: 0 0 auto; height: 100vh; overflow: hidden; background: var(--bg-2); border-right: 1px solid transparent; transition: width .38s var(--ease), border-color .38s; } | |
| body.toc-open #toc { width: var(--toc-w); border-right-color: var(--line); } | |
| .toc-inner { width: var(--toc-w); height: 100%; display: flex; flex-direction: column; padding: 26px 22px 18px 26px; } | |
| .toc-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 16px; } | |
| .toc-total { font-family: var(--font-mono); font-size: 12px; color: var(--mute); } | |
| .toc-list { flex: 1; overflow-y: auto; padding-right: 8px; scrollbar-width: thin; } | |
| .toc-ch { margin-bottom: 18px; } | |
| .toc-ch-title { font-family: var(--font-display); font-size: 20px; font-weight: 500; line-height: 1.15; display: flex; align-items: baseline; gap: 10px; cursor: pointer; padding: 4px 6px; border-radius: var(--radius); } | |
| .toc-ch-title:hover { background: var(--bg-3); } | |
| .toc-ch-num { font-family: var(--font-mono); font-size: 12px; color: var(--accent); } | |
| .toc-ch-when { display: block; font-size: 12px; color: var(--mute); margin: 2px 0 6px 6px; letter-spacing: .03em; } | |
| .toc-sec { padding: 5px 6px 5px 10px; border-left: 2px solid transparent; cursor: pointer; border-radius: 0 var(--radius) var(--radius) 0; } | |
| .toc-sec:hover { background: var(--bg-3); } | |
| .toc-sec.current { border-left-color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, transparent); } | |
| .toc-sec-row { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; font-size: 14.5px; } | |
| .toc-sec-row .min { font-family: var(--font-mono); font-size: 11px; color: var(--mute); white-space: nowrap; } | |
| .toc-dots { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 5px; } | |
| .toc-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--line); cursor: pointer; } | |
| .toc-dot:hover { background: var(--ink-2); } | |
| .toc-dot.seen { background: var(--mute); } | |
| .toc-dot.current { background: var(--accent); transform: scale(1.3); } | |
| .toc-slides { list-style: none; margin: 6px 0 0; padding: 0; } | |
| .toc-slides li { font-size: 13px; color: var(--ink-2); padding: 2px 0 2px 10px; cursor: pointer; border-left: 1px solid var(--line); } | |
| .toc-slides li:hover { color: var(--ink); } | |
| .toc-slides li.current { color: var(--accent); border-left-color: var(--accent); } | |
| /* == slide ========================================================== */ | |
| #deck { position: absolute; inset: 0; } | |
| .chapter, .sec { display: contents; } | |
| .slide { position: absolute; inset: 0; display: none; } | |
| .slide.active { display: block; animation: slide-in .32s var(--ease); } | |
| @keyframes slide-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } } | |
| .slide > .body { position: absolute; inset: 0; padding: 9vh 7vw; display: flex; flex-direction: column; justify-content: center; gap: 1.2rem; max-width: 1320px; margin: 0 auto; } | |
| .slide.wide > .body { max-width: 1500px; } | |
| .slide.top > .body { justify-content: flex-start; padding-top: 12vh; } | |
| .slide .notes { display: none; } | |
| /* section cover: quiet announcement */ | |
| .slide.cover > .body { gap: .9rem; } | |
| .slide.cover .kicker { color: var(--accent); } | |
| .slide.cover h1 { font-size: clamp(3rem, 7vw, 6.4rem); font-weight: 300; } | |
| .slide.cover .sub { font-family: var(--font-display); font-style: italic; font-size: clamp(1.3rem, 2vw, 1.9rem); color: var(--ink-2); } | |
| .slide.cover > .body::after { content: ""; display: block; width: 64px; height: 2px; background: var(--accent); opacity: .7; margin-top: 1rem; } | |
| /* layout helpers */ | |
| .cols { display: grid; grid-template-columns: 1fr 1fr; gap: 3vw; align-items: start; } | |
| .cols-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2vw; align-items: start; } | |
| .cols-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.5vw; align-items: start; } | |
| .cols.tight { gap: 1.5vw; } | |
| .cols.w32 { grid-template-columns: 3fr 2fr; } | |
| .stack { display: flex; flex-direction: column; gap: .8rem; } | |
| .row { display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; } | |
| .spread { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; } | |
| /* == type =========================================================== */ | |
| h1, h2, h3 { font-family: var(--font-display); font-weight: 400; line-height: 1.05; margin: 0; letter-spacing: -.01em; } | |
| h1 { font-size: clamp(2.4rem, 5.6vw, 5rem); } | |
| h2 { font-size: clamp(1.9rem, 3.8vw, 3.2rem); } | |
| h3 { font-size: clamp(1.25rem, 1.9vw, 1.7rem); font-weight: 500; } | |
| h1 em, h2 em, .statement em { font-style: italic; color: var(--accent); } | |
| .kicker { font-family: var(--font-body); font-size: 13px; letter-spacing: .12em; text-transform: uppercase; color: var(--mute); font-weight: 500; } | |
| .kicker.accent { color: var(--accent); } .kicker.bad { color: var(--bad); } | |
| .sub { font-size: clamp(1.05rem, 1.5vw, 1.35rem); color: var(--ink-2); max-width: 60ch; } | |
| .statement { font-family: var(--font-display); font-size: clamp(2rem, 4.2vw, 3.7rem); line-height: 1.12; max-width: 24ch; letter-spacing: -.01em; } | |
| .statement.wide { max-width: 32ch; } | |
| .lead { font-size: clamp(1.15rem, 1.7vw, 1.55rem); max-width: 48ch; } | |
| /* lists: the engine wraps each li's content in .t so marker | text ; detail can be a grid */ | |
| .big-list, .check, .num-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; } | |
| .big-list { gap: .55em; font-size: clamp(1.2rem, 2vw, 1.8rem); } | |
| .big-list li { display: grid; grid-template-columns: auto 1fr; column-gap: .7em; row-gap: .1em; align-items: baseline; } | |
| .big-list li::before { content: "—"; color: var(--accent); } | |
| .big-list li .d, .check li .d, .num-list li .d { grid-column: 2; display: block; color: var(--mute); } | |
| .big-list li .d { font-size: .62em; } | |
| .check { gap: .5em; font-size: clamp(1.05rem, 1.5vw, 1.4rem); } | |
| .check li { display: grid; grid-template-columns: auto 1fr; column-gap: .7em; row-gap: .05em; align-items: baseline; } | |
| .check li::before { content: "☐"; color: var(--accent); font-family: var(--font-mono); } | |
| .check li .d { font-size: .7em; } | |
| .num-list { counter-reset: n; gap: .6em; font-size: clamp(1.05rem, 1.6vw, 1.45rem); } | |
| .num-list li { display: grid; grid-template-columns: 2.2em 1fr; column-gap: .4em; align-items: baseline; } | |
| .num-list li::before { counter-increment: n; content: counter(n, decimal-leading-zero); font-family: var(--font-mono); font-size: .75em; color: var(--accent); } | |
| .num-list li .d { font-size: .7em; margin-top: -.15em; } | |
| .list { margin: 0; padding-left: 1.1em; display: flex; flex-direction: column; gap: .35em; font-size: clamp(1rem, 1.35vw, 1.25rem); } | |
| .list li::marker { color: var(--accent); } | |
| .list li .d { display: block; color: var(--mute); font-size: .78em; line-height: 1.35; } | |
| .title-block { display: flex; flex-direction: column; gap: 1.4rem; } | |
| .title-block .meta { display: flex; gap: 1.6em; color: var(--ink-2); font-size: 1.05rem; flex-wrap: wrap; } | |
| .title-block .meta span::before { content: "·"; margin-right: 1.6em; color: var(--mute); } | |
| .title-block .meta span:first-child::before { content: none; margin: 0; } | |
| /* == components ===================================================== */ | |
| .card { background: var(--bg-2); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.1rem 1.25rem; display: flex; flex-direction: column; gap: .5rem; } | |
| .card h3 { font-size: 1.25rem; } | |
| .card p { margin: 0; color: var(--ink-2); font-size: 1rem; } | |
| .card.accent { border-color: color-mix(in srgb, var(--accent) 50%, var(--line)); } | |
| .card.harness { border-color: color-mix(in srgb, var(--harness) 50%, var(--line)); } | |
| .card.bad { border-color: color-mix(in srgb, var(--bad) 50%, var(--line)); } | |
| .card.ok { border-color: color-mix(in srgb, var(--ok) 50%, var(--line)); } | |
| .card .kicker { margin-bottom: -.2rem; } | |
| .card .big { font-family: var(--font-display); font-size: 2.4rem; line-height: 1; } | |
| .pill { display: inline-block; padding: .18em .6em; border-radius: 999px; font-size: .78em; font-weight: 500; letter-spacing: .02em; background: var(--bg-3); color: var(--ink-2); } | |
| .pill.accent { background: var(--accent-soft); color: var(--accent); } .pill.harness { background: var(--harness-soft); color: var(--harness); } | |
| .pill.ok { background: var(--ok-soft); color: var(--ok); } .pill.warn { background: var(--warn-soft); color: var(--warn); } .pill.bad { background: var(--bad-soft); color: var(--bad); } | |
| table.tbl { border-collapse: collapse; width: 100%; font-size: clamp(.9rem, 1.15vw, 1.1rem); } | |
| table.tbl th, table.tbl td { text-align: left; padding: .55em .8em; border-bottom: 1px solid var(--line); vertical-align: top; } | |
| table.tbl th { font-weight: 500; color: var(--mute); font-size: .8em; letter-spacing: .08em; text-transform: uppercase; } | |
| table.tbl td:first-child { font-weight: 500; white-space: nowrap; } | |
| table.tbl.mono td:first-child { font-family: var(--font-mono); font-size: .9em; font-weight: 400; } | |
| table.tbl.compact th, table.tbl.compact td { padding: .35em .6em; } | |
| pre.code { font-family: var(--font-mono); font-size: clamp(.8rem, 1.05vw, 1rem); line-height: 1.5; background: var(--bg-2); border: 1px solid var(--line); border-radius: var(--radius); padding: 1rem 1.2rem; overflow: auto; white-space: pre; color: var(--ink); tab-size: 2; } | |
| pre.code.wrap { white-space: pre-wrap; } | |
| pre.code .c { color: var(--mute); } pre.code .k { color: var(--ink-2); } pre.code .s { color: var(--accent); } pre.code .h { background: var(--warn-soft); } | |
| pre.code .p1 { color: var(--harness); } pre.code .p2 { color: var(--accent); } pre.code .p3 { color: var(--ok); } /* one colour per competing pattern */ | |
| pre.code .cap { display: block; font-family: var(--font-body); font-size: .8em; color: var(--mute); margin-bottom: .6em; letter-spacing: .05em; text-transform: uppercase; } | |
| .tree { font-family: var(--font-mono); font-size: clamp(.85rem, 1.1vw, 1.05rem); line-height: 1.55; white-space: pre; color: var(--ink-2); } | |
| .tree b { color: var(--ink); font-weight: 500; } | |
| .tree .dna { color: var(--accent); } .tree .soft { color: var(--harness); } | |
| .tree [data-file] { color: var(--ink); border-bottom: 1px dotted var(--harness); } | |
| .tree [data-file]:hover { color: var(--harness); } | |
| .timeline { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; position: relative; margin-top: 1rem; } | |
| .timeline::before { content: ""; position: absolute; left: 0; right: 0; top: 7px; height: 1px; background: var(--line); } | |
| .tl { position: relative; padding: 26px 14px 0 0; } | |
| .tl::before { content: ""; position: absolute; left: 0; top: 2px; width: 11px; height: 11px; border-radius: 50%; background: var(--bg); border: 2px solid var(--ink-2); } | |
| .tl.now::before { background: var(--accent); border-color: var(--accent); } | |
| .tl .y { font-family: var(--font-mono); font-size: .8rem; color: var(--mute); } | |
| .tl .t { font-family: var(--font-display); font-size: 1.35rem; margin: .15em 0 .2em; } | |
| .tl .d { font-size: .92rem; color: var(--ink-2); } | |
| .layers { display: flex; flex-direction: column; gap: 6px; } | |
| .layer { border: 1px solid var(--line); border-radius: var(--radius); padding: .7rem 1rem; display: grid; grid-template-columns: 11rem 1fr; gap: 1rem; align-items: baseline; background: var(--bg-2); } | |
| .layer .n { font-weight: 500; } .layer .d { color: var(--ink-2); font-size: .95rem; } | |
| .layer.model { background: var(--accent-soft); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); } .layer.model .n { color: var(--accent); } | |
| .layer.harness { background: var(--harness-soft); border-color: color-mix(in srgb, var(--harness) 40%, var(--line)); } .layer.harness .n { color: var(--harness); } | |
| .quad { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } | |
| .quad .card { min-height: 8rem; } | |
| .vs { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1.5rem; align-items: start; } | |
| .vs .mid { font-family: var(--font-display); font-style: italic; color: var(--mute); align-self: center; font-size: 1.4rem; } | |
| .terms { display: flex; flex-wrap: wrap; gap: .6rem 1rem; } | |
| .term { font-family: var(--font-mono); font-size: clamp(1rem, 1.5vw, 1.4rem); padding: .35em .7em; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-2); cursor: help; } | |
| .term:hover { border-color: var(--accent); } | |
| .ba { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } | |
| .ba .card { font-size: .95rem; } .ba .card .kicker { font-size: 11px; } | |
| .ba .card q { display: block; font-family: var(--font-mono); font-size: .88em; white-space: pre-wrap; quotes: none; color: var(--ink); } | |
| .blocks { display: flex; flex-direction: column; gap: .8rem; margin-top: .4rem; } | |
| .block { display: grid; grid-template-columns: 3.6rem 1fr; align-items: center; gap: .6rem; padding: .9rem 1.2rem; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-2); } | |
| .block .n { font-family: var(--font-display); font-size: 2.4rem; line-height: 1; color: var(--accent); } | |
| .block .w { font-weight: 500; font-size: clamp(1.1rem, 1.6vw, 1.45rem); } | |
| .block .when { font-family: var(--font-mono); font-size: .85rem; color: var(--mute); margin-left: .9em; white-space: nowrap; } | |
| .block small { display: block; color: var(--ink-2); font-size: .95rem; margin-top: .2em; } | |
| .diagram-flow { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; font-size: clamp(.95rem, 1.35vw, 1.2rem); } | |
| .diagram-flow .step { border: 1px solid var(--line); border-radius: var(--radius); padding: .45em .8em; background: var(--bg-2); } | |
| .diagram-flow .step.accent { border-color: var(--accent); color: var(--accent); } | |
| .diagram-flow .step.harness { border-color: var(--harness); color: var(--harness); } | |
| .diagram-flow .arrow { color: var(--mute); } | |
| .modes { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; font-size: clamp(.95rem, 1.3vw, 1.15rem); } | |
| .modes .step { border: 1px solid var(--line); border-radius: var(--radius); padding: .45em .8em; background: var(--bg-2); } | |
| .modes .step.accent { border-color: var(--accent); color: var(--accent); } | |
| .modes .arrow { color: var(--mute); } | |
| .incidents { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .5em; font-size: clamp(.92rem, 1.2vw, 1.1rem); } | |
| .incidents li { display: grid; grid-template-columns: 1fr auto; gap: 1.2rem; align-items: baseline; padding: .5em .8em; border-left: 3px solid var(--bad); background: var(--bg-2); border-radius: 0 var(--radius) var(--radius) 0; } | |
| .incidents li .g { font-size: .8em; color: var(--ok); text-align: right; max-width: 30ch; } | |
| .incidents li .g::before { content: "→ "; color: var(--mute); } | |
| .incidents li .when { font-family: var(--font-mono); font-size: .75em; color: var(--mute); margin-left: .6em; white-space: nowrap; } | |
| /* == frag =========================================================== */ | |
| .frag { opacity: 0; transform: translateY(4px); transition: opacity .3s var(--ease), transform .3s var(--ease); } | |
| .frag.on { opacity: 1; transform: none; } | |
| /* == tooltip ======================================================== */ | |
| [data-tip] { position: relative; cursor: help; border-bottom: 1px dotted var(--mute); } | |
| [data-tip]::after { content: attr(data-tip); position: absolute; left: 50%; bottom: calc(100% + 8px); transform: translateX(-50%) translateY(4px); width: max-content; max-width: 34ch; padding: .55em .8em; font-family: var(--font-body); font-size: 14px; line-height: 1.35; font-weight: 400; letter-spacing: 0; text-transform: none; white-space: normal; background: var(--ink); color: var(--bg); border-radius: var(--radius); opacity: 0; pointer-events: none; transition: opacity .15s, transform .15s; z-index: 20; text-align: left; } | |
| [data-tip]:hover::after { opacity: 1; transform: translateX(-50%) translateY(0); } | |
| [data-tip].tip-below::after { bottom: auto; top: calc(100% + 8px); } | |
| /* == widgets ======================================================== */ | |
| .widget { border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-2); padding: 1rem 1.2rem; display: flex; flex-direction: column; gap: .8rem; } | |
| .widget .w-head { display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; } | |
| .widget .w-head .kicker { margin: 0; } | |
| .widget .w-note { font-size: .85rem; color: var(--mute); } | |
| .widget .endnote { font-size: .95rem; line-height: 1.45; padding: .7rem .9rem; border-left: 3px solid var(--accent); background: var(--bg); border-radius: 0 var(--radius) var(--radius) 0; animation: pop .4s var(--ease); } | |
| .widget .endnote b { font-weight: 600; } | |
| .wbtn { font: inherit; font-size: .9rem; font-weight: 500; padding: .4em .9em; border-radius: var(--radius); border: 1px solid var(--ink-2); background: transparent; color: var(--ink); cursor: pointer; } | |
| .wbtn:hover { background: var(--bg-3); } | |
| .wbtn.primary { background: var(--ink); color: var(--bg); border-color: var(--ink); } .wbtn.primary:hover { background: var(--ink-2); } | |
| .wbtn.small { font-size: .8rem; padding: .3em .7em; } | |
| .wbtn:disabled { opacity: .4; cursor: default; } | |
| .wcount { font-family: var(--font-mono); font-size: .88rem; color: var(--ink-2); font-variant-numeric: tabular-nums; } | |
| .wcount b { color: var(--ink); font-weight: 500; } | |
| /* shared transcript log */ | |
| .widget .log { font-family: var(--font-mono); font-size: .82rem; line-height: 1.5; overflow-y: auto; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius); padding: .7rem .9rem; scrollbar-width: thin; } | |
| .widget .log > div { display: flex; gap: .8em; padding: .05em .3em; margin: 0 -.3em; border-radius: 3px; transition: background .25s; } | |
| .widget .log .who { color: var(--mute); flex: 0 0 10.5em; white-space: nowrap; } | |
| .widget .log .who.u { color: var(--ok); } .widget .log .who.a { color: var(--accent); } .widget .log .who.t { color: var(--harness); } .widget .log .who.s { color: var(--warn); } | |
| .widget .log .tx { flex: 1; min-width: 0; } | |
| .widget .log .tok { margin-left: auto; color: var(--mute); white-space: nowrap; } | |
| .widget .log > div.new { animation: pop .3s var(--ease); } | |
| .widget .log > div.resend { background: var(--ok-soft); animation: resend .65s var(--ease); } | |
| @keyframes pop { from { opacity: 0; transform: translateX(-4px); } to { opacity: 1; transform: none; } } | |
| @keyframes resend { 0% { background: transparent; } 30% { background: color-mix(in srgb, var(--ok) 35%, var(--bg)); } 100% { background: var(--ok-soft); } } | |
| /* agent-loop */ | |
| .w-loop .ring { display: grid; grid-template-columns: repeat(5, 1fr); gap: .6rem; position: relative; margin-top: .6rem; } | |
| .w-loop .node { border: 1px solid var(--line); border-radius: var(--radius); padding: .7rem .8rem; background: var(--bg); transition: all .2s; } | |
| .w-loop .node .n { font-weight: 500; display: block; } .w-loop .node .d { font-size: .8rem; color: var(--mute); } | |
| .w-loop .node.on { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); } | |
| .w-loop .node.model.on { background: var(--accent-soft); } | |
| .w-loop .node.harness.on { background: var(--harness-soft); border-color: var(--harness); box-shadow: 0 0 0 3px var(--harness-soft); } | |
| .w-loop .resend-badge { position: absolute; left: 50%; top: -1.1rem; transform: translateX(-50%); font-size: .75rem; font-weight: 500; letter-spacing: .04em; color: var(--ok); background: var(--ok-soft); padding: .2em .7em; border-radius: 999px; opacity: 0; transition: opacity .2s; white-space: nowrap; } | |
| .w-loop.sending .resend-badge { opacity: 1; } | |
| .w-loop .log { height: 13.5em; } | |
| .w-loop .meters { display: flex; gap: 1.4rem; flex-wrap: wrap; } | |
| .w-loop .meters .in b { color: var(--ok); } .w-loop .meters .out b { color: var(--accent); } | |
| /* context-fill */ | |
| .w-fill .bar { position: relative; height: 54px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg); overflow: hidden; display: flex; } | |
| .w-fill .seg { height: 100%; transition: width .35s var(--ease); border-right: 1px solid color-mix(in srgb, var(--bg) 60%, transparent); } | |
| .w-fill .seg.harness { background: var(--harness); } .w-fill .seg.docs { background: var(--harness-soft); } | |
| .w-fill .seg.read { background: var(--warn-soft); } .w-fill .seg.out { background: var(--warn); } | |
| .w-fill .seg.chat { background: var(--ok-soft); } .w-fill .seg.sub { background: var(--ok); } .w-fill .seg.summary { background: var(--accent); } | |
| .w-fill .zones { display: flex; font-size: .75rem; color: var(--mute); font-family: var(--font-mono); } | |
| .w-fill .zones span { border-left: 1px solid var(--line); padding-left: .4em; } | |
| .w-fill .chips { display: flex; flex-wrap: wrap; gap: .45rem; } | |
| .w-fill .chip { font: inherit; font-size: .85rem; padding: .35em .7em; border-radius: 999px; border: 1px solid var(--line); background: var(--bg); cursor: pointer; display: inline-flex; gap: .5em; align-items: center; } | |
| .w-fill .chip:hover { border-color: var(--ink-2); } | |
| .w-fill .chip i { width: 10px; height: 10px; border-radius: 2px; display: inline-block; } | |
| .w-fill .chip .t { font-family: var(--font-mono); color: var(--mute); font-size: .85em; } | |
| .w-fill .status { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; } | |
| .w-fill .verdict { font-family: var(--font-display); font-size: 1.35rem; } | |
| .w-fill .verdict.sharp { color: var(--ok); } .w-fill .verdict.dilute { color: var(--warn); } .w-fill .verdict.degraded { color: var(--bad); } | |
| /* compaction */ | |
| .w-compact .two { display: grid; grid-template-columns: 1.15fr 1fr; gap: 1rem; align-items: start; } | |
| .w-compact .transcript { font-family: var(--font-mono); font-size: .8rem; line-height: 1.45; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius); padding: .6rem .8rem; display: flex; flex-direction: column; gap: .15em; } | |
| .w-compact .it { display: flex; gap: .7em; padding: .12em .3em; border-radius: 3px; transition: all .35s var(--ease); } | |
| .w-compact .it .who { flex: 0 0 6.5em; color: var(--mute); } .w-compact .it .who.u { color: var(--ok); } .w-compact .it .who.a { color: var(--accent); } .w-compact .it .who.t { color: var(--harness); } | |
| .w-compact .it .tx { flex: 1; } .w-compact .it .tok { color: var(--mute); } | |
| .w-compact .it.gone { opacity: .35; text-decoration: line-through; } | |
| .w-compact .it.gone.l { background: var(--bad-soft); opacity: .7; } | |
| .w-compact .it.kept { background: var(--ok-soft); } | |
| .w-compact .after { display: flex; flex-direction: column; gap: .8rem; animation: pop .4s var(--ease); } | |
| .w-compact .summary { background: var(--bg); border: 1px solid var(--ok); border-radius: var(--radius); padding: .7rem .9rem; } | |
| .w-compact .summary p { margin: .3em 0 0; font-size: .95rem; } | |
| .w-compact .lost { background: var(--bg); border: 1px solid var(--bad); border-radius: var(--radius); padding: .7rem .9rem; } | |
| .w-compact .lost ul { margin: .3em 0 0; padding-left: 1.2em; font-size: .95rem; color: var(--bad); } | |
| /* chat-replay */ | |
| .w-chat .thread { display: flex; flex-direction: column; gap: .55rem; min-height: 14rem; max-height: 22rem; overflow-y: auto; scrollbar-width: thin; padding: .2rem; } | |
| .w-chat .msg { display: flex; animation: pop .3s var(--ease); } | |
| .w-chat .msg.you { justify-content: flex-end; } | |
| .w-chat .msg.note { justify-content: center; } | |
| .w-chat .bub { max-width: 78%; padding: .55em .9em; border-radius: 12px; font-size: .95rem; line-height: 1.4; background: var(--bg); border: 1px solid var(--line); } | |
| .w-chat .msg.you .bub { background: var(--ink); color: var(--bg); border-color: var(--ink); border-bottom-right-radius: 3px; } | |
| .w-chat .msg.agent .bub { border-bottom-left-radius: 3px; } | |
| .w-chat .msg.note .bub { background: transparent; border: none; color: var(--accent); font-family: var(--font-display); font-style: italic; font-size: 1.05rem; } | |
| .w-chat .bub code { font-size: .85em; } | |
| .w-chat .msg.you .bub code { background: color-mix(in srgb, var(--bg) 18%, transparent); color: inherit; } | |
| .w-chat .thread { max-height: 34rem; } | |
| /* tool-belt */ | |
| .w-belt .belt-grid { display: grid; grid-template-columns: 1.3fr 1fr; gap: 1.2rem; } | |
| .w-belt .tiles { display: grid; grid-template-columns: repeat(3, 1fr); gap: .5rem; margin-top: .5rem; } | |
| .w-belt .sockets { display: grid; grid-template-columns: repeat(2, 1fr); gap: .5rem; margin-top: .5rem; } | |
| .w-belt .tile, .w-belt .sock { font: inherit; text-align: left; display: grid; grid-template-columns: 26px 1fr; grid-template-rows: auto auto; column-gap: .6rem; align-items: center; padding: .55rem .7rem; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg); cursor: pointer; color: var(--ink); transition: all .15s; } | |
| .w-belt .tile svg, .w-belt .sock svg { width: 24px; height: 24px; grid-row: 1 / 3; color: var(--harness); } | |
| .w-belt .tile .n, .w-belt .sock .n { font-weight: 500; font-size: .95rem; } | |
| .w-belt .tile .d, .w-belt .sock .d { font-size: .78rem; color: var(--mute); } | |
| .w-belt .tile:hover, .w-belt .sock:hover { border-color: var(--ink-2); } | |
| .w-belt .tile.on { border-color: var(--harness); background: var(--harness-soft); } | |
| .w-belt .sock svg { color: var(--mute); } | |
| .w-belt .sock.on { border-color: var(--warn); background: var(--warn-soft); } .w-belt .sock.on svg { color: var(--warn); } | |
| .w-belt .console { font-family: var(--font-mono); font-size: .82rem; line-height: 1.5; background: #141210; color: #e5dfd3; border-radius: var(--radius); padding: .6rem .9rem; min-height: 4.2em; } | |
| .w-belt .console .line.new { animation: pop .25s var(--ease); } | |
| .w-belt .console .line:first-child { color: #7cb0e0; } | |
| .w-belt .meter { display: grid; grid-template-columns: auto 1fr auto; gap: 1rem; align-items: center; } | |
| .w-belt .meter .bar { height: 14px; border: 1px solid var(--line); border-radius: 999px; background: var(--bg); overflow: hidden; display: flex; } | |
| .w-belt .meter .fill { height: 100%; transition: width .35s var(--ease); } .w-belt .meter .fill.base { background: var(--harness); } .w-belt .meter .fill.add { background: var(--warn); } | |
| /* approval-fatigue */ | |
| .w-fatigue .prompt { display: flex; flex-direction: column; gap: .6rem; align-items: flex-start; } | |
| .w-fatigue .cmd { font-family: var(--font-mono); font-size: 1.05rem; padding: .6em .9em; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius); width: 100%; } | |
| .w-fatigue .stats { display: flex; align-items: flex-end; gap: 1rem; } | |
| .w-fatigue .ticks { display: flex; align-items: flex-end; gap: 3px; height: 36px; } | |
| .w-fatigue .tick { width: 10px; background: var(--mute); border-radius: 2px 2px 0 0; } | |
| .w-fatigue .tick.bad { background: var(--bad); } .w-fatigue .tick.ok { background: var(--ok); } | |
| .w-fatigue .verdict { font-size: 1rem; line-height: 1.45; padding: .8rem 1rem; border-left: 3px solid var(--bad); background: var(--bg); border-radius: 0 var(--radius) var(--radius) 0; animation: pop .4s var(--ease); } | |
| /* subagent-sim */ | |
| .w-subsim .two { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } | |
| .w-subsim .pane { display: flex; flex-direction: column; gap: .45rem; border: 1px solid var(--line); border-radius: var(--radius); padding: .6rem .8rem; background: var(--bg-2); transition: all .3s; } | |
| .w-subsim .pane.active { border-color: var(--accent); } | |
| .w-subsim .pane.idle { opacity: .35; } .w-subsim .pane.dead { opacity: .55; filter: grayscale(.6); } | |
| .w-subsim .pane .lab { display: flex; justify-content: space-between; align-items: baseline; gap: .6rem; flex-wrap: wrap; } | |
| .w-subsim .pane .bar { height: 8px; border-radius: 999px; background: var(--bg); border: 1px solid var(--line); overflow: hidden; } | |
| .w-subsim .pane .fill { height: 100%; background: var(--harness); transition: width .35s var(--ease); } | |
| .w-subsim .pane.sub .fill { background: var(--warn); } | |
| .w-subsim .log { height: 11em; } | |
| .w-subsim .state { font-size: .8rem; color: var(--mute); min-height: 1.2em; } | |
| .w-subsim .pane.dead .state { color: var(--bad); } | |
| /* rediscovery */ | |
| /* -- mock-as-spec slide */ | |
| .mock-cols { display: grid; grid-template-columns: 1.3fr 1fr; gap: 2.2rem; align-items: start; } | |
| .mockshot { margin: 0; } | |
| .mockshot img { display: block; cursor: zoom-in; width: 100%; height: auto; border: 1px solid var(--line); border-radius: var(--radius); box-shadow: 0 10px 30px color-mix(in srgb, var(--ink) 12%, transparent); } | |
| .lightbox { position: fixed; inset: 0; z-index: 60; display: flex; align-items: center; justify-content: center; padding: 3vh 3vw; background: color-mix(in srgb, var(--bg) 94%, transparent); cursor: zoom-out; } | |
| .lightbox img { max-width: 100%; max-height: 100%; border: 1px solid var(--line); box-shadow: 0 20px 60px color-mix(in srgb, var(--ink) 25%, transparent); } | |
| .mockshot figcaption { margin-top: .5rem; font-family: var(--font-mono); font-size: .72rem; color: var(--mute); } | |
| @media (max-width: 900px) { .mock-cols { grid-template-columns: 1fr; } } | |
| /* -- vigilance */ | |
| .w-vig .chart { display: flex; align-items: flex-end; gap: 8px; height: 220px; border-bottom: 1px solid var(--line); padding: 0 .2rem; } | |
| .w-vig .slot { flex: 1; height: 100%; display: flex; align-items: flex-end; } | |
| .w-vig .bar { position: relative; width: 100%; background: var(--bg); border: 1px solid var(--line); border-bottom: 0; border-radius: 4px 4px 0 0; animation: pop .35s var(--ease); } | |
| .w-vig .bar .read { position: absolute; left: 0; right: 0; bottom: 0; background: var(--harness-soft); border-top: 2px solid var(--harness); } | |
| .w-vig .mk { position: absolute; left: 50%; width: 11px; height: 11px; margin-left: -5.5px; margin-bottom: -5.5px; border-radius: 50%; animation: pop .3s var(--ease); } | |
| .w-vig .mk.caught, .w-vig .sw.caught { background: var(--ok); } | |
| .w-vig .mk.ship, .w-vig .sw.ship { background: var(--bad); box-shadow: 0 0 0 3px var(--bad-soft); } | |
| .w-vig .mk.copy, .w-vig .sw.copy { background: var(--bad); opacity: .45; } | |
| .w-vig .mk.copy { width: 7px; height: 7px; margin-left: -3.5px; margin-bottom: -3.5px; } | |
| .w-vig .labels { display: flex; gap: 8px; padding: 0 .2rem; font-family: var(--font-mono); font-size: .7rem; color: var(--mute); } | |
| .w-vig .labels span { flex: 1; text-align: center; } | |
| .w-vig .meters { display: flex; gap: 1.4rem; flex-wrap: wrap; font-size: .85rem; color: var(--mute); } | |
| .w-vig .meters b { color: var(--ink); font-family: var(--font-mono); } .w-vig .meters b.ok { color: var(--ok); } .w-vig .meters b.bad { color: var(--bad); } | |
| .w-vig .legend { display: flex; gap: 1.2rem; flex-wrap: wrap; font-size: .75rem; color: var(--mute); } | |
| .w-vig .legend span { display: inline-flex; align-items: center; gap: .4em; } | |
| .w-vig .sw { display: inline-block; width: 14px; height: 9px; background: var(--harness-soft); border-top: 2px solid var(--harness); } | |
| .w-vig .sw.dot { width: 9px; height: 9px; border: 0; border-radius: 50%; } | |
| .w-redisc .two { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; } | |
| .w-redisc .pane { display: flex; flex-direction: column; gap: .5rem; } | |
| .w-redisc .pane .lab { display: flex; justify-content: space-between; align-items: baseline; } | |
| .w-redisc .log { height: 13em; } | |
| .w-redisc .log > div { padding: 0; margin: 0; } | |
| .w-redisc .log .s { color: var(--mute); } .w-redisc .log .know { color: var(--ok); } .w-redisc .log .sess { color: var(--accent); margin-top: .4em; } | |
| .w-redisc .tot { font-family: var(--font-display); font-size: 1.7rem; line-height: 1; } | |
| .w-redisc .tot small { font-family: var(--font-body); font-size: .8rem; color: var(--mute); margin-left: .4em; } | |
| /* pattern-entropy */ | |
| .w-entropy .runs { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; } | |
| .w-entropy .run { display: flex; flex-direction: column; gap: .5rem; } | |
| .w-entropy .run .lab { display: flex; justify-content: space-between; align-items: baseline; } | |
| .w-entropy .cells { display: grid; grid-template-columns: repeat(20, 1fr); gap: 3px; } | |
| .w-entropy .cell { aspect-ratio: 1; border-radius: 2px; background: var(--bg-3); transition: background .2s; } | |
| .w-entropy .k { font-family: var(--font-display); font-size: 2rem; line-height: 1; } | |
| .w-entropy .k small { font-family: var(--font-body); font-size: .85rem; color: var(--mute); margin-left: .4em; } | |
| .w-entropy .legend { font-size: .82rem; color: var(--mute); } | |
| /* file-tree */ | |
| .w-tree { display: grid; grid-template-columns: 22rem 1fr; gap: 1.2rem; min-height: 24rem; } | |
| .w-tree .files { font-family: var(--font-mono); font-size: .9rem; line-height: 1.6; } | |
| .w-tree .f { padding: .05em .5em; border-radius: 4px; cursor: pointer; white-space: pre; } | |
| .w-tree .f:hover { background: var(--bg-3); } | |
| .w-tree .f.on { background: var(--ink); color: var(--bg); } | |
| .w-tree .f.dir { color: var(--mute); cursor: default; } | |
| .w-tree .f.dna { color: var(--accent); } .w-tree .f.soft { color: var(--harness); } .w-tree .f.skill { color: var(--ok); } | |
| .w-tree .f.on.dna, .w-tree .f.on.soft, .w-tree .f.on.skill { color: var(--bg); } | |
| .w-tree .detail { display: flex; flex-direction: column; gap: .7rem; min-width: 0; } | |
| .w-tree .detail h3 { font-family: var(--font-mono); font-weight: 500; font-size: 1.1rem; } | |
| .w-tree .detail .kind { font-size: .8rem; } | |
| .w-tree .detail .sum { font-size: 1rem; color: var(--ink-2); } | |
| .w-tree .detail .test { font-size: .95rem; padding: .5em .8em; border-left: 3px solid var(--accent); background: var(--bg); } | |
| .w-tree .detail pre { font-family: var(--font-mono); font-size: .8rem; line-height: 1.5; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius); padding: .8rem 1rem; overflow: auto; max-height: 15rem; white-space: pre-wrap; color: var(--ink-2); } | |
| /* worktrees */ | |
| .w-wt .lanes { display: flex; flex-direction: column; gap: .5rem; min-height: 12rem; } | |
| .w-wt .lane { display: grid; grid-template-columns: 23rem 1fr 6rem; gap: 1rem; align-items: center; border: 1px solid var(--line); border-radius: var(--radius); padding: .55rem .9rem; background: var(--bg); animation: pop .3s var(--ease); } | |
| .w-wt .lane .br { font-family: var(--font-mono); font-size: .88rem; } | |
| .w-wt .lane .agents { display: flex; gap: .4rem; flex-wrap: wrap; } | |
| .w-wt .agent { font-size: .8rem; padding: .2em .6em; border-radius: 999px; background: var(--harness-soft); color: var(--harness); } | |
| .w-wt .lane.conflict { border-color: var(--bad); background: var(--bad-soft); } | |
| .w-wt .lane.conflict .agent { background: var(--bad); color: #fff; } | |
| .w-wt .lane .port { font-family: var(--font-mono); font-size: .8rem; color: var(--mute); text-align: right; } | |
| .w-wt .shared { border: 1px dashed var(--line); border-radius: var(--radius); padding: .6rem .9rem; font-size: .88rem; color: var(--ink-2); display: flex; gap: 1.2rem; flex-wrap: wrap; } | |
| .w-wt .shared b { font-weight: 500; color: var(--ink); } | |
| .w-wt .msg { font-size: .9rem; min-height: 1.4em; } .w-wt .msg.bad { color: var(--bad); } .w-wt .msg.ok { color: var(--ok); } | |
| /* == overlays ======================================================= */ | |
| .overlay { position: fixed; inset: 0; z-index: 50; background: color-mix(in srgb, var(--ink) 40%, transparent); backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center; padding: 4vh 4vw; animation: fade .18s; } | |
| @keyframes fade { from { opacity: 0; } to { opacity: 1; } } | |
| .overlay-card { background: var(--bg); color: var(--ink); border: 1px solid var(--line); border-radius: 10px; box-shadow: 0 30px 80px rgba(0,0,0,.35); max-width: 820px; width: 100%; max-height: 88vh; display: flex; flex-direction: column; overflow: hidden; } | |
| .notes-head { padding: 1.3rem 1.8rem .8rem; border-bottom: 1px solid var(--line); } | |
| .notes-head h3 { font-size: 1.5rem; margin-top: .3rem; } | |
| .notes-body { padding: 1.2rem 1.8rem; overflow-y: auto; font-size: 1.12rem; line-height: 1.55; scrollbar-width: thin; } | |
| .notes-body p { margin: 0 0 .9em; } .notes-body p:last-child { margin-bottom: 0; } | |
| .notes-body ul, .notes-body ol { margin: 0 0 .9em; padding-left: 1.3em; } .notes-body li { margin-bottom: .3em; } | |
| .notes-body .demo, .notes-body .ask { padding: .5em .9em; background: var(--bg-2); border-radius: 0 var(--radius) var(--radius) 0; margin: .9em 0; } | |
| .notes-body .demo { border-left: 3px solid var(--accent); } .notes-body .ask { border-left: 3px solid var(--harness); } | |
| .notes-body .demo::before, .notes-body .ask::before { display: block; font-size: .72em; letter-spacing: .1em; text-transform: uppercase; margin-bottom: .3em; } | |
| .notes-body .demo::before { content: "Demo"; color: var(--accent); } .notes-body .ask::before { content: "Ask the room"; color: var(--harness); } | |
| .notes-body .empty { color: var(--mute); font-style: italic; } | |
| .notes-foot { padding: .8rem 1.8rem 1rem; border-top: 1px solid var(--line); font-size: .85rem; color: var(--mute); } | |
| .file-card { max-width: 980px; } | |
| .file-head { padding: 1rem 1.6rem .7rem; border-bottom: 1px solid var(--line); } | |
| .file-head h3 { font-family: var(--font-mono); font-weight: 500; font-size: 1.05rem; } | |
| .file-body { padding: 1.1rem 1.6rem; overflow: auto; font-family: var(--font-mono); font-size: .85rem; line-height: 1.5; white-space: pre-wrap; scrollbar-width: thin; } | |
| .help-card { padding: 1.6rem 2rem; max-width: 520px; gap: 1rem; } | |
| .help-card h3 { font-size: 1.6rem; } | |
| .help-card table { border-collapse: collapse; } | |
| .help-card td { padding: .35em .8em .35em 0; vertical-align: baseline; } | |
| .help-card td:first-child { white-space: nowrap; } | |
| /* == misc =========================================================== */ | |
| @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; } } | |
| @media (max-width: 900px) { | |
| .cols, .cols-3, .cols-4, .cols.w32, .quad, .vs, .ba, .w-tree, .w-entropy .runs, .w-redisc .two, .w-compact .two, .w-subsim .two, .w-belt .belt-grid { grid-template-columns: 1fr; } | |
| .slide > .body { padding: 8vh 6vw; } | |
| .w-loop .ring { grid-template-columns: repeat(2, 1fr); } | |
| .timeline { grid-auto-flow: row; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- ===================== TOC (slides out from the left, pushes content) ===================== --> | |
| <aside id="toc" aria-label="Table of contents"> | |
| <div class="toc-inner"> | |
| <div class="toc-head"> | |
| <span class="kicker">Contents</span> | |
| <span class="toc-total"></span> | |
| </div> | |
| <nav class="toc-list"></nav> | |
| </div> | |
| </aside> | |
| <!-- ===================== STAGE ===================== --> | |
| <main id="stage"> | |
| <div id="chrome-top"> | |
| <span class="chrome-chapter"></span> | |
| <span class="chrome-sep">·</span> | |
| <span class="chrome-section"></span> | |
| </div> | |
| <div id="chrome-corner"> | |
| <div id="chrome-logo"><svg class="ida-logo" role="img" aria-label="IDA Learning" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 103.4635 60.39236"> | |
| <defs> | |
| <clipPath id="clip-0"> | |
| <path clip-rule="nonzero" d="M 0.25 1 L 14 1 L 14 34 L 0.25 34 Z M 0.25 1 "/> | |
| </clipPath> | |
| <clipPath id="clip-1"> | |
| <path clip-rule="nonzero" d="M 0.25 46 L 9 46 L 9 59.789062 L 0.25 59.789062 Z M 0.25 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-2"> | |
| <path clip-rule="nonzero" d="M 11 46 L 22 46 L 22 59.789062 L 11 59.789062 Z M 11 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-3"> | |
| <path clip-rule="nonzero" d="M 22 46 L 37 46 L 37 59.789062 L 22 59.789062 Z M 22 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-4"> | |
| <path clip-rule="nonzero" d="M 39 46 L 50 46 L 50 59.789062 L 39 59.789062 Z M 39 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-5"> | |
| <path clip-rule="nonzero" d="M 53 46 L 65 46 L 65 59.789062 L 53 59.789062 Z M 53 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-6"> | |
| <path clip-rule="nonzero" d="M 69 46 L 72 46 L 72 59.789062 L 69 59.789062 Z M 69 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-7"> | |
| <path clip-rule="nonzero" d="M 76 46 L 88 46 L 88 59.789062 L 76 59.789062 Z M 76 46 "/> | |
| </clipPath> | |
| <clipPath id="clip-8"> | |
| <path clip-rule="nonzero" d="M 90 46 L 102.683594 46 L 102.683594 59.789062 L 90 59.789062 Z M 90 46 "/> | |
| </clipPath> | |
| </defs> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 80.46875 33.292969 L 63.398438 0.230469 L 46.5625 33.292969 L 50.070312 33.292969 L 63.398438 7.027344 L 76.726562 33.292969 Z M 80.46875 33.292969 "/> | |
| <g clip-path="url(#clip-0)"> | |
| <path fill-rule="evenodd" fill="currentColor" fill-opacity="1" d="M 13.121094 1.402344 L 0.0273438 1.402344 L 0.0273438 33.292969 L 13.121094 33.292969 Z M 13.121094 1.402344 "/> | |
| </g> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 24.8125 7.96875 C 26.449219 7.96875 26.449219 7.96875 26.449219 7.96875 C 32.53125 7.96875 36.738281 11.953125 36.738281 17.347656 C 36.738281 22.507812 32.53125 26.726562 26.449219 26.726562 C 24.8125 26.726562 24.8125 26.726562 24.8125 26.726562 C 24.8125 33.292969 24.8125 33.292969 24.8125 33.292969 C 24.8125 33.292969 24.582031 33.292969 27.152344 33.292969 C 36.738281 33.292969 43.753906 26.023438 43.753906 17.347656 C 43.753906 8.4375 36.738281 1.402344 26.917969 1.402344 C 24.8125 1.402344 24.8125 1.402344 24.8125 1.402344 Z M 24.8125 7.96875 "/> | |
| <g clip-path="url(#clip-1)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 0.0273438 46.425781 L 1.429688 46.425781 L 1.429688 58.382812 L 8.679688 58.382812 L 8.679688 59.554688 L 0.0273438 59.554688 Z M 0.0273438 46.425781 "/> | |
| </g> | |
| <g clip-path="url(#clip-2)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 21.074219 58.382812 L 21.074219 59.554688 L 11.71875 59.554688 L 11.71875 46.425781 L 20.839844 46.425781 L 20.839844 47.597656 L 13.121094 47.597656 L 13.121094 52.285156 L 19.902344 52.285156 L 19.902344 53.460938 L 13.121094 53.460938 L 13.121094 58.382812 Z M 21.074219 58.382812 "/> | |
| </g> | |
| <g clip-path="url(#clip-3)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 33.230469 56.039062 L 25.984375 56.039062 L 24.347656 59.554688 L 22.941406 59.554688 L 29.023438 46.425781 L 30.425781 46.425781 L 36.273438 59.554688 L 34.867188 59.554688 Z M 32.765625 54.867188 L 29.726562 47.832031 L 26.449219 54.867188 Z M 32.765625 54.867188 "/> | |
| </g> | |
| <g clip-path="url(#clip-4)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 48.199219 59.554688 C 45.390625 55.335938 45.390625 55.335938 45.390625 55.335938 C 44.925781 55.335938 44.691406 55.335938 44.222656 55.335938 C 40.714844 55.335938 40.714844 55.335938 40.714844 55.335938 C 40.714844 59.554688 40.714844 59.554688 40.714844 59.554688 C 39.3125 59.554688 39.3125 59.554688 39.3125 59.554688 C 39.3125 46.425781 39.3125 46.425781 39.3125 46.425781 C 44.222656 46.425781 44.222656 46.425781 44.222656 46.425781 C 45.859375 46.425781 47.261719 46.894531 48.199219 47.597656 C 49.132812 48.300781 49.601562 49.472656 49.601562 50.878906 C 49.601562 52.050781 49.367188 52.753906 48.898438 53.460938 C 48.199219 54.164062 47.496094 54.632812 46.5625 55.101562 C 49.835938 59.554688 49.835938 59.554688 49.835938 59.554688 Z M 47.261719 53.226562 C 47.964844 52.753906 48.199219 52.050781 48.199219 50.878906 C 48.199219 49.941406 47.964844 49.003906 47.261719 48.535156 C 46.5625 47.832031 45.390625 47.597656 44.222656 47.597656 C 40.714844 47.597656 40.714844 47.597656 40.714844 47.597656 C 40.714844 54.164062 40.714844 54.164062 40.714844 54.164062 C 44.222656 54.164062 44.222656 54.164062 44.222656 54.164062 C 45.390625 54.164062 46.5625 53.929688 47.261719 53.226562 Z M 47.261719 53.226562 "/> | |
| </g> | |
| <g clip-path="url(#clip-5)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 64.566406 46.425781 L 64.566406 59.554688 L 63.398438 59.554688 L 54.980469 48.769531 L 54.980469 59.554688 L 53.578125 59.554688 L 53.578125 46.425781 L 54.746094 46.425781 L 63.164062 56.976562 L 63.164062 46.425781 Z M 64.566406 46.425781 "/> | |
| </g> | |
| <g clip-path="url(#clip-6)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 69.710938 46.425781 L 71.113281 46.425781 L 71.113281 59.554688 L 69.710938 59.554688 Z M 69.710938 46.425781 "/> | |
| </g> | |
| <g clip-path="url(#clip-7)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 87.015625 46.425781 L 87.015625 59.554688 L 85.847656 59.554688 L 77.429688 48.769531 L 77.429688 59.554688 L 76.023438 59.554688 L 76.023438 46.425781 L 77.195312 46.425781 L 85.613281 56.976562 L 85.613281 46.425781 Z M 87.015625 46.425781 "/> | |
| </g> | |
| <g clip-path="url(#clip-8)"> | |
| <path fill-rule="nonzero" fill="currentColor" fill-opacity="1" d="M 101.28125 52.992188 C 102.683594 52.992188 102.683594 52.992188 102.683594 52.992188 C 102.683594 57.914062 102.683594 57.914062 102.683594 57.914062 C 101.980469 58.617188 101.28125 58.851562 100.578125 59.320312 C 99.644531 59.554688 98.707031 59.789062 97.773438 59.789062 C 96.601562 59.789062 95.433594 59.320312 94.265625 58.851562 C 93.328125 58.148438 92.394531 57.445312 91.925781 56.507812 C 91.222656 55.335938 90.992188 54.164062 90.992188 52.992188 C 90.992188 51.816406 91.222656 50.644531 91.925781 49.472656 C 92.394531 48.535156 93.328125 47.832031 94.265625 47.128906 C 95.433594 46.660156 96.601562 46.191406 97.773438 46.191406 C 98.941406 46.191406 99.875 46.425781 100.578125 46.660156 C 101.511719 47.128906 102.214844 47.597656 102.683594 48.066406 C 101.980469 49.003906 101.980469 49.003906 101.980469 49.003906 C 100.8125 48.066406 99.644531 47.597656 98.003906 47.597656 C 96.835938 47.597656 95.902344 47.832031 94.964844 48.300781 C 94.265625 48.769531 93.5625 49.238281 93.09375 50.175781 C 92.628906 51.113281 92.394531 52.050781 92.394531 52.992188 C 92.394531 53.929688 92.628906 54.867188 93.09375 55.804688 C 93.5625 56.507812 94.265625 57.210938 94.964844 57.679688 C 95.902344 58.148438 96.835938 58.382812 98.003906 58.382812 C 99.175781 58.382812 100.34375 58.148438 101.28125 57.445312 Z M 101.28125 52.992188 "/> | |
| </g> | |
| </svg> | |
| </div> | |
| <div id="chrome-harness">claude code</div> | |
| </div> | |
| <div id="chrome-count"></div> | |
| <div id="chrome-bar"><div class="fill"></div></div> | |
| <div id="deck"> | |
| <!-- ===================================================================== | |
| CHAPTER 1 · CODING AGENTS | |
| Day 1 · 09:00–12:00 | |
| Sections: c1-welcome · c1-history · c1-anatomy · c1-ctx · c1-fail · c1-tool · c1-market · c1-open | |
| Slide ids are prefixed c1-. Grep "slide: c1-" to list them. Section covers end in -cover. | |
| ===================================================================== --> | |
| <div class="chapter" data-num="1" data-title="Coding agents" data-when="Day 1 · 09:00–12:00"> | |
| <!-- ===================== CH1 §00 · Welcome ===================== --> | |
| <section class="sec" data-title="Welcome" data-min="10"> | |
| <!-- slide: c1-title --> | |
| <article class="slide title" id="c1-title" data-title="Title"> | |
| <div class="body"> | |
| <div class="title-block"> | |
| <span class="kicker accent">IDA · September 15–16, 2026</span> | |
| <h1>Coding Agents &<br>Context Engineering<br><em>for developers</em></h1> | |
| <div class="meta"><span>Ulf Aslak</span><span>Aslak Media ApS</span><span>PyMC Labs</span><span>Lawcel</span></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Welcome. Two days. The first is about understanding the thing, the second is about working with it. Everything I show is what I actually do, in repos that ship to paying customers. Nothing here is a demo built for the course.</p> | |
| <p>You get this deck afterwards, with the narration for every slide, so nobody needs to take notes on the slides themselves.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-who --> | |
| <article class="slide" id="c1-who" data-title="Who I am"> | |
| <div class="body"> | |
| <span class="kicker">Who I am</span> | |
| <h2>Ulf Aslak</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>Physicist, PhD in complex systems (DTU)</li> | |
| <li>Postdoc & assistant professor, DTU and University of Copenhagen</li> | |
| <li>Principal Data Scientist, PyMC Labs</li> | |
| <li>Founder, Lawcel: an AI compliance product, built end-to-end with agents</li> | |
| </ul> | |
| <div class="card accent"> | |
| <span class="kicker">Right now, on my laptop</span> | |
| <span class="big">9 worktrees</span> | |
| <p>Nine agents working in parallel on one product: features, a bug fix, two design specs, a blog agent, a nightly bug hunt. A normal week. Day two is about how.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Background: physics and network science, then a decade of data science and Python. I'm not a career web developer, which turns out to matter: most of Lawcel's SvelteKit codebase was written by agents under my direction, and it's in production with customers. I'll be honest about where that went well and where it went badly.</p> | |
| <p>The nine-worktrees number is real, I checked yesterday. That's the practical end state I want you to see: many agents working in parallel on one codebase without stepping on each other. Day two is about how.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-you --> | |
| <article class="slide" id="c1-you" data-title="Hands up"> | |
| <div class="body"> | |
| <span class="kicker">Hands up</span> | |
| <h2>Where are you today?</h2> | |
| <ul class="big-list"> | |
| <li class="frag on">Autocomplete</li> | |
| <li class="frag">Chat</li> | |
| <li class="frag">IDE agent</li> | |
| <li class="frag">CLI agent</li> | |
| <li class="frag">Several agents at once</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <div class="ask">Reveal one line at a time and count hands. Also ask: who has a codebase with them today, and who has a paid subscription working? That decides how much of the first open block is installation.</div> | |
| <p>Whatever the spread, the course is built so the first half of today lands everyone on the same mental model. If you're already at the bottom of this list, the morning will still give you vocabulary for things you've felt but not named.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-two-days --> | |
| <article class="slide wide" id="c1-two-days" data-title="The plan"> | |
| <div class="body"> | |
| <span class="kicker">The plan</span> | |
| <h2>Two days, three chapters</h2> | |
| <div class="blocks"> | |
| <div class="block"><span class="n">1</span><div><span class="w">Coding agents</span><span class="when">Day 1 · 09–12</span><small>harness vs model, the window, failure modes, the toolkit, the market</small></div></div> | |
| <div class="block"><span class="n">2</span><div><span class="w">Context engineering</span><span class="when">Day 1 · 13–16</span><small>why vibe coding fails, persistent context, the DNA framework, writing it</small></div></div> | |
| <div class="block"><span class="n">3</span><div><span class="w">Workflows</span><span class="when">Day 2</span><small>parallel sessions, plans, subagents, the contract, subscription tricks; the afternoon is a group exercise on your own setup</small></div></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Three chapters. Chapter one is the anatomy: what a coding agent actually is, why it fails the way it fails. You need that to have opinions about the rest. Chapter two is context engineering, which is the main thing I want you to take home. Chapter three is workflow: how I run many agents at once without chaos.</p> | |
| <p>Each half day has an open block of 30–60 minutes. That's on purpose. Some of you need to install things, some of you will want to try something the moment I've shown it. Tomorrow afternoon is one long exercise on your own setup, in groups.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-outcome --> | |
| <article class="slide" id="c1-outcome" data-title="Outcome"> | |
| <div class="body"> | |
| <span class="kicker">Outcome</span> | |
| <h2>Leave with</h2> | |
| <ul class="big-list"> | |
| <li>A mental model that survives the next model release</li> | |
| <li>A context setup in <em>your</em> repository, started today</li> | |
| <li>Workflows you'll actually use next week</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>The tools will change between now and Christmas. The vendors will rename things. What doesn't change is the loop, the window, and the fact that the model guesses when your codebase is ambiguous. If you understand those three, you can pick up any harness in an afternoon.</p> | |
| <p>The second and third bullets are concrete: you should leave tomorrow with files committed to your repo and a way of working you've tried at least once.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-prereqs --> | |
| <article class="slide" id="c1-prereqs" data-title="Checklist"> | |
| <div class="body"> | |
| <span class="kicker">Checklist</span> | |
| <h2>Do you have…</h2> | |
| <ul class="check"> | |
| <li>A coding agent installed and logged in<span class="d">Claude Code, Codex CLI, Cursor, Copilot, Gemini CLI: any of them works for this course</span></li> | |
| <li>A repository you know well, cloned locally<span class="d">yours, or a work project you're allowed to use</span></li> | |
| <li>Permission from your workplace<span class="d">code leaves the laptop when you use a hosted model</span></li> | |
| <li>One real task you'd like done in that repo<span class="d">small enough to finish tomorrow afternoon</span></li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>Don't fix things now; note what's missing and use the open block. I'll use Claude Code as the running example because it's what I know best and it currently has the richest configuration surface, but every concept maps onto Codex, Cursor, Copilot and Gemini CLI. Whenever a path or file name is Claude-specific I can flip the deck to the vendor-neutral spelling.</p> | |
| <p>On permission: a hosted model means your code is sent to a vendor. Enterprise plans have zero-retention terms; the free tiers typically don't. If you're unsure, use a repo you own for the exercises.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §01 · A short history ===================== --> | |
| <section class="sec" data-title="A short history" data-min="10"> | |
| <!-- slide: c1-history-cover --> | |
| <article class="slide cover" id="c1-history-cover" data-title="§ A short history"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 1 · § 1</span> | |
| <h1>A short history</h1> | |
| <p class="sub">How the tools changed, 2022 to 2026.</p> | |
| </div> | |
| <aside class="notes"><p>Five minutes of history, only because it explains where the bottleneck moved.</p></aside> | |
| </article> | |
| <!-- slide: c1-history-timeline --> | |
| <article class="slide wide" id="c1-history-timeline" data-title="Four years"> | |
| <div class="body"> | |
| <span class="kicker">History · Four years</span> | |
| <h2>Four years of tools</h2> | |
| <div class="timeline"> | |
| <div class="tl"><span class="y">2022</span><div class="t">Autocomplete</div><div class="d">Copilot. One line at a time, inside your editor. You stay the author.</div></div> | |
| <div class="tl"><span class="y">2023</span><div class="t">Chat</div><div class="d">ChatGPT, then chat in the IDE. Paste code in, paste code out. You do the integration.</div></div> | |
| <div class="tl"><span class="y">2024</span><div class="t">IDE agents</div><div class="d">Cursor, Cline, Copilot agent mode. Multi-file edits, but you approve each step in the editor.</div></div> | |
| <div class="tl"><span class="y">2025</span><div class="t">CLI agents</div><div class="d">Claude Code, Codex, Gemini CLI. Runs commands, reads output, iterates for minutes unattended.</div></div> | |
| <div class="tl now"><span class="y">2026</span><div class="t">Many agents</div><div class="d">Parallel sessions, subagents, scheduled agents. The typing is gone. The hard part moved.</div></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Compressed history. Each step changes who is the author. With autocomplete you're the author and it's a fast typist. With chat you're the integrator. With IDE agents you're a reviewer with a veto per step. With CLI agents you're a manager who reads the report afterwards. And in 2026 you're running a small team.</p> | |
| <p>Notice the direction: at every step the agent sees more and you see less. That is the whole reason context engineering exists. If the agent is going to act on your behalf for twenty minutes, what it knows at the start decides everything.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-history-shift --> | |
| <article class="slide" id="c1-history-shift" data-title="What got cheap"> | |
| <div class="body"> | |
| <p class="statement">Writing code got cheap. <em>Knowing what to write</em> did not.</p> | |
| <p class="sub">Knowing what the code should be, in this codebase, with these conventions, is now the whole job.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>I said this in the webinar and I'll say it again because it's the thesis of the course. Producing a plausible diff is a solved problem. Producing the right diff, the one that fits the fifty decisions your team made over three years, is not. And the agent cannot read your mind, only your repo.</p> | |
| <p>So the question for the next two days is: how do we make "what the code should be" legible to a machine that starts from zero every session?</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §02 · Anatomy: harness vs model ===================== --> | |
| <section class="sec" data-title="Anatomy: harness vs model" data-min="25"> | |
| <!-- slide: c1-anatomy-cover --> | |
| <article class="slide cover" id="c1-anatomy-cover" data-title="§ Anatomy"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 1 · § 2</span> | |
| <h1>Anatomy</h1> | |
| <p class="sub">What a coding agent is made of.</p> | |
| </div> | |
| <aside class="notes"><p>Two parts: the model, and everything around it. Most confusion about agents comes from mixing the two up.</p></aside> | |
| </article> | |
| <!-- slide: c1-anatomy-model --> | |
| <article class="slide" id="c1-anatomy-model" data-title="The model"> | |
| <div class="body"> | |
| <span class="kicker">Anatomy · The model</span> | |
| <h2>The model is a <em>function</em></h2> | |
| <div class="cols"> | |
| <pre class="code"><span class="k">f</span>(tokens_in) → tokens_out | |
| <span class="c">// that's it. no loop, no files, | |
| // no memory, no hands.</span></pre> | |
| <ul class="list"> | |
| <li class="frag on">Stateless: every call starts from nothing</li> | |
| <li class="frag">Does not learn from your session</li> | |
| <li class="frag">Same weights for everyone, every call</li> | |
| <li class="frag">Cannot run code, read a file, or check anything</li> | |
| <li class="frag">Predicts what text probably comes next, not what is true</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Strip everything away and the model is one function. Text in, text out. It has no state between calls. When people say "the model remembers what I said earlier," what they mean is the harness sent the earlier text again. When they say "it learned my style," no it didn't; the style was in the window.</p> | |
| <p>The last bullet is the one to internalise: it produces a likely continuation. Likely given the training data and given what's in the window. If your codebase does something unusual and the window doesn't say so, the likely continuation is the usual thing, which is wrong for you.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-anatomy-harness --> | |
| <article class="slide" id="c1-anatomy-harness" data-title="The harness"> | |
| <div class="body"> | |
| <span class="kicker">Anatomy · The harness</span> | |
| <h2>The <span class="harness">harness</span> is everything else</h2> | |
| <div class="layers"> | |
| <div class="layer harness"><span class="n">Loop</span><span class="d">call the model, run the tool it asked for, append the result, call again</span></div> | |
| <div class="layer harness"><span class="n">Context assembly</span><span class="d">system prompt, instructions files, tool schemas, conversation, compaction</span></div> | |
| <div class="layer harness"><span class="n">Tools</span><span class="d">read, edit, run, search, browse; plus MCP servers</span></div> | |
| <div class="layer harness"><span class="n">Permissions & hooks</span><span class="d">what it may do without asking; deterministic scripts around each step</span></div> | |
| <div class="layer harness"><span class="n">Subagents, skills, memory</span><span class="d">fresh windows, reusable workflows, notes across sessions</span></div> | |
| <div class="layer model"><span class="n">Model</span><span class="d">text in, text out</span></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Everything above the model is the harness. Claude Code is a harness. Codex CLI is a harness. Cursor's agent mode is a harness. They can call the very same model and behave completely differently, because the loop, the tools, the system prompt and the permission model are theirs.</p> | |
| <p>When you configure an agent, you're configuring the harness. The instructions file is context assembly. MCP is tools. Allow-lists are permissions. Skills are the harness too. None of it touches the model. This is liberating: most of what determines quality is in your hands, in plain text files, in your repo.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-anatomy-loop --> | |
| <article class="slide wide" id="c1-anatomy-loop" data-title="The loop"> | |
| <div class="body"> | |
| <span class="kicker">Simulation · The loop</span> | |
| <h2>The loop</h2> | |
| <div class="widget" data-widget="agent-loop"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Step through. On every model call the whole transcript flashes green: that's it being re-sent, in full. Point at the counters: the window ends at ~23k, but the input sent adds up to ~100k, because each call re-reads everything before it. When the last step lands, the note explains prompt caching: the unchanged prefix is a cache read at roughly a tenth of the price, which is the only reason this is affordable.</div> | |
| <p>This is what "agent" means mechanically. The model says "run this command". The harness runs it and pastes the output back into the transcript. The model reads the whole transcript again and decides the next step. Repeat until the model produces a final answer instead of a tool call.</p> | |
| <p>Three consequences. The transcript only grows. The model re-reads everything every step, so anything early is competing for attention with everything after it. And the bill is quadratic in conversation length, tamed by caching. Keep all three in mind for the next section, and for subagents later.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-anatomy-same-model --> | |
| <article class="slide" id="c1-anatomy-same-model" data-title="Same model, different agent"> | |
| <div class="body"> | |
| <p class="statement wide">Same model + different harness = <em>different agent</em>.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>People compare models. For chat that's fine. For agents it misleads. I've watched the same model be brilliant in one harness and useless in another on the same task, because one harness read the repo's instruction file and one didn't, or one had a browser tool and one had to guess what the page looked like.</p> | |
| <p>The practical consequence: when an agent does something dumb, ask "what did it know?" before "which model is this?" Nine times out of ten the fix is in the window, not in the weights.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-anatomy-terms --> | |
| <article class="slide" id="c1-anatomy-terms" data-title="Vocabulary"> | |
| <div class="body"> | |
| <span class="kicker">Vocabulary</span> | |
| <h2>Nomenclature</h2> | |
| <div class="terms"> | |
| <span class="term" data-tip="A chunk of text, roughly ¾ of a word in English, more like ½ a word in code. Models read and write in tokens; you pay in tokens.">token</span> | |
| <span class="term" data-tip="Everything the model can see on one call: system prompt, instructions, tools, the whole conversation so far. 200k–1M tokens today. Nothing outside it exists.">context window</span> | |
| <span class="term" data-tip="The harness's own instructions to the model, sent first on every call. You don't write it, but your instructions file is appended to it.">system prompt</span> | |
| <span class="term" data-tip="The model emits a structured request ('run Bash with this command'); the harness executes it and returns the output as the next message.">tool call</span> | |
| <span class="term" data-tip="Model Context Protocol. A standard for plugging external tools (browser, GitHub, a database) into any harness. Each server adds its tool schemas to your window.">MCP</span> | |
| <span class="term" data-tip="When the window is nearly full, the harness replaces the transcript with a summary of it. Lossy. Decisions and details get dropped.">compaction</span> | |
| <span class="term" data-tip="A child agent with its own fresh window. It gets a prompt, works, and returns a report. The parent only sees the report.">subagent</span> | |
| <span class="term" data-tip="A markdown file describing a repeatable workflow, invoked by name (/cleanse, /ship). Loaded into the window only when used.">skill</span> | |
| <span class="term" data-tip="A script the harness runs deterministically at a lifecycle point: before a tool runs, after an edit, when the session ends. Not a prompt; actual code.">hook</span> | |
| <span class="term cx" data-alt="AGENTS.md / CLAUDE.md" data-tip="An instructions file loaded automatically every session. CLAUDE.md for Claude Code, AGENTS.md for Codex and most others, .cursor/rules for Cursor.">CLAUDE.md / AGENTS.md</span> | |
| <span class="term" data-tip="The unchanged prefix of a call (system prompt, earlier turns) is served from a cache at a fraction of the price. It is why re-sending the transcript every call is affordable.">prompt caching</span> | |
| <span class="term" data-tip="Writing to files the agent reads every session, so it knows the codebase's facts without rediscovering them. The subject of chapter 2.">context engineering</span> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The definitions are behind each word. You'll hear all of them today. The two that matter most are context window and compaction, because most confusing agent behaviour is one of those two.</p> | |
| <p>On tokens: a rule of thumb for code is three characters per token. A 400-line file is about five thousand tokens. A test suite's output can be ten thousand. Keep those numbers in your head for the next section.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §03 · The context window ===================== --> | |
| <section class="sec" data-title="The context window" data-min="25"> | |
| <!-- slide: c1-ctx-cover --> | |
| <article class="slide cover" id="c1-ctx-cover" data-title="§ The context window"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 1 · § 3</span> | |
| <h1>The context window</h1> | |
| <p class="sub">Everything the agent knows has to fit in here.</p> | |
| </div> | |
| <aside class="notes"><p>The single most important idea in the course. Everything in chapter two follows from it.</p></aside> | |
| </article> | |
| <!-- slide: c1-ctx-statement --> | |
| <article class="slide" id="c1-ctx-statement" data-title="Nothing else exists"> | |
| <div class="body"> | |
| <p class="statement">Everything the model knows about your task is in the window. <em>Nothing else exists.</em></p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Say it plainly. Not "the model knows my codebase." It knows the parts of the codebase that were read into this window, in this session. Not "it knows our conventions." It knows the conventions that are written in a file it has read.</p> | |
| <p>Corollary: if you find yourself explaining the same thing to the agent for the third time this week, that thing is not in the window at the start of a session, and you have a context-engineering problem, not a model problem.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-ctx-fill --> | |
| <article class="slide wide" id="c1-ctx-fill" data-title="Filling the window"> | |
| <div class="body"> | |
| <span class="kicker">Simulation · Filling the window</span> | |
| <h2>What fills it</h2> | |
| <div class="widget" data-widget="context-fill"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Add chips in a realistic order: system prompt + tools first (already 10%). Add a chatty MCP server (nobody uses 30 tools; the schemas are pure overhead). Add the instructions file. Then read four files, run tests twice, paste a log. It crosses 40% before any real work, and 75% by mid-task. Hit Auto-compact and note what survives: the harness overhead and a summary.</div> | |
| <p>The numbers are illustrative but the proportions are right. Three things people underestimate: the harness's own overhead, tool output (test runs, logs, big greps), and MCP servers whose schemas sit in every call whether you use them or not.</p> | |
| <p>Notice the subagent chip: it costs 1.5k in this window even though the subagent burned 60k in its own. That's the trick we'll use tomorrow to keep the main window clean.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-ctx-degrade --> | |
| <article class="slide" id="c1-ctx-degrade" data-title="Degradation"> | |
| <div class="body"> | |
| <span class="kicker">Degradation</span> | |
| <h2>More context is not better context</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li class="frag on">A 200k window doesn't mean it pays attention to all 200k. Facts in the middle of a long transcript get missed.</li> | |
| <li class="frag">Reasoning gets worse as facts pile up, long before the window is full.</li> | |
| <li class="frag">Old instructions compete with new ones. The agent "forgets" a rule you gave it an hour ago.</li> | |
| <li class="frag">Irrelevant tool output is noise the model has to read past on every step.</li> | |
| </ul> | |
| <div class="card frag"> | |
| <span class="kicker">Rules of thumb</span> | |
| <p>Keep a session the size of a task. Start fresh rather than push on. Put facts in files, not in chat. Point at files instead of pasting. Push big reads into subagents.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Vendors advertise window sizes like they're a quality metric. They're a capacity metric. Retrieval of a single fact from a huge window is good now. Reasoning across many facts, keeping a dozen constraints in play at once, degrades much earlier, and it degrades silently: the output still looks confident.</p> | |
| <p>The practical symptom is the agent that was excellent for the first thirty minutes and then starts repeating mistakes you already corrected. That's not the model getting tired. That's the correction sitting at position 40k in a 150k transcript.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-ctx-compaction --> | |
| <article class="slide wide" id="c1-ctx-compaction" data-title="Compaction"> | |
| <div class="body"> | |
| <span class="kicker">Simulation · Compaction</span> | |
| <h2>Compaction <em>loses things</em></h2> | |
| <p class="lead">Near the limit, the harness asks the model to summarise the transcript, then replaces the transcript with the summary.</p> | |
| <div class="widget" data-widget="compaction"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Press Compact. Green rows make it into the summary. Red rows are the ones that mattered and didn't: the reason Redis was rejected, the shared test database, the build flag that works, "don't touch the migration journal", 403 vs 404. The agent continues, confidently, from the summary, and will re-make each of those mistakes.</div> | |
| <p>Compaction is necessary; without it long sessions would just stop. But it's a summary written by the same model, under the same pressure, and it drops exactly the kind of detail that mattered: the reason you rejected an approach, the specific flag that made the build work, the thing you said not to do.</p> | |
| <p>The transcript is ephemeral. Files are not. Hold that thought; this afternoon is about which files.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-ctx-implication --> | |
| <article class="slide" id="c1-ctx-implication" data-title="The window is the interface"> | |
| <div class="body"> | |
| <p class="statement wide">The window is the only place you can put knowledge. <em>Choose what goes in, and when.</em></p> | |
| <p class="sub">That choice, made deliberately and written down, is <b>context engineering</b>.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Bridge. Everything this afternoon follows from these two facts: the window is small and rots, and the model guesses when it's missing something. Hold on to them.</p> | |
| <p>Now the ways agents go wrong. Not to be gloomy; because the failure modes tell you exactly what the countermeasures have to be.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §04 · Failure modes ===================== --> | |
| <section class="sec" data-title="Failure modes" data-min="30"> | |
| <!-- slide: c1-fail-cover --> | |
| <article class="slide cover" id="c1-fail-cover" data-title="§ Failure modes"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 1 · § 4</span> | |
| <h1>Failure modes</h1> | |
| <p class="sub">Four ways agents go wrong.</p> | |
| </div> | |
| <aside class="notes"><p>None of these are bugs the next release fixes. They follow from what the model is.</p></aside> | |
| </article> | |
| <!-- slide: c1-fail-intro --> | |
| <article class="slide" id="c1-fail-intro" data-title="Four failure modes"> | |
| <div class="body"> | |
| <span class="kicker">Four failure modes</span> | |
| <h2>How it goes wrong</h2> | |
| <div class="quad"> | |
| <div class="card bad frag on"><h3>Hallucination</h3><p>It fills gaps with plausible guesses and presents them as facts.</p></div> | |
| <div class="card bad frag"><h3>Sycophancy</h3><p>It tells you what you seem to want to hear.</p></div> | |
| <div class="card bad frag"><h3>Overconfidence</h3><p>Wrong answers look exactly as polished as right ones.</p></div> | |
| <div class="card bad frag"><h3>Unaccountability</h3><p>When it goes wrong, you are the one answering for it.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Four modes. A function that predicts likely text will interpolate (hallucinate), will predict the text you seem to want (sycophancy), has no channel for "I'm not sure" (overconfidence), and has no stake in the outcome (unaccountability).</p> | |
| <p>Each one has a countermeasure, and every countermeasure is something you do in the harness or the repo. That's the pattern for the rest of the course.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-fail-hallucination --> | |
| <article class="slide wide" id="c1-fail-hallucination" data-title="Hallucination"> | |
| <div class="body"> | |
| <span class="kicker">Failure mode 1 · Hallucination</span> | |
| <h2>It guesses; it doesn't look up</h2> | |
| <div class="cols w32"> | |
| <div class="widget" data-widget="chat-replay" data-title="A function that does not exist"> | |
| <script type="application/json">[ | |
| {"w":"you","t":"How does <code>resolveTenantScope</code> handle revoked memberships?"}, | |
| {"w":"agent","t":"<code>resolveTenantScope</code> in <code>lib/server/tenant.ts</code> looks up the membership and checks <code>revokedAt</code>. If it's set, it throws a 403 and logs the attempt. It's called from every dashboard <code>load</code>."}, | |
| {"w":"note","t":"There is no such function. There is no such file."}, | |
| {"w":"you","t":"Open the file."}, | |
| {"w":"agent","t":"I can't find <code>lib/server/tenant.ts</code>. Searching… The closest thing is <code>resolveOrgWithRole</code> in <code>resolve-org.ts</code>. It returns the role and does not check revocation at all."} | |
| ]</script> | |
| </div> | |
| <div class="stack"> | |
| <p class="lead">The model fills gaps with the most likely thing. Most dangerous exactly where your codebase is unusual: internal helpers, domain rules nobody wrote down, library versions newer than the training data.</p> | |
| <div class="card ok"><span class="kicker">Countermeasure</span><p>Make the true thing more likely than the guess: put it in the window. And demand evidence: "open the file", "show me where that's defined".</p></div> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Step the replay. A confident, detailed, plausible answer about a function that doesn't exist. Then "open the file", and the truth. Then do it live on your own repo with a made-up function name; it works on every model I've tried.</div> | |
| <p>Hallucination is the feature working as designed. The model is an interpolation machine, and interpolation is what makes it useful on the 95% of your code that looks like everyone else's code. The 5% that doesn't is where you have to supply the truth.</p> | |
| <p>Concretely: the more your repo relies on unwritten convention, the more the agent will confidently produce the generic version of it. This is the whole motivation for the afternoon.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-fail-guessing --> | |
| <article class="slide" id="c1-fail-guessing" data-title="Pattern guessing"> | |
| <div class="body"> | |
| <span class="kicker">Failure mode 1, continued · Pattern guessing</span> | |
| <h2>When the pattern isn't obvious, it guesses</h2> | |
| <div class="cols"> | |
| <pre class="code"><span class="cap">three ways to get the current user, one repo</span><span class="c">// routes/settings/+page.server.ts</span> | |
| <span class="k">const</span> user = <span class="k">await</span> <span class="p1">db.query.users.findFirst(…)</span> | |
| <span class="c">// routes/team/+page.server.ts</span> | |
| <span class="k">const</span> { org, user } = <span class="k">await</span> <span class="p2">resolveOrg(event)</span> | |
| <span class="c">// routes/api/keys/+server.ts</span> | |
| <span class="k">const</span> session = <span class="k">await</span> <span class="p3">event.locals.auth()</span> | |
| <span class="k">const</span> user = <span class="p3">session?.user</span></pre> | |
| <div class="stack"> | |
| <p class="lead">The next feature needs the current user. The agent has seen three patterns. It picks one, or invents a <em>fourth</em>.</p> | |
| <p class="mute">Now there are four. The session after that sees four.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Real example, lightly anonymised. Three ways to do one thing in one repo. Each was reasonable when written. The agent doesn't know which is canonical, because nothing says. It'll copy whichever it happened to read, and sometimes it'll blend them into a new one.</p> | |
| <p>This is the failure mode I care about most, because it compounds. This afternoon we'll simulate it and then fix it. The fix is not a better model; it's a file that says "use resolveOrg, never inline the lookup," and a refactor that makes the code agree with the file.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-fail-sycophancy --> | |
| <article class="slide wide" id="c1-fail-sycophancy" data-title="Sycophancy"> | |
| <div class="body"> | |
| <span class="kicker">Failure mode 2 · Sycophancy</span> | |
| <h2>"You're absolutely right!"</h2> | |
| <div class="cols w32"> | |
| <div class="widget" data-widget="chat-replay" data-title="Are you sure?"> | |
| <script type="application/json">[ | |
| {"w":"you","t":"Is <code>revokeInvite</code> safe to call twice?"}, | |
| {"w":"agent","t":"Yes. It runs <code>UPDATE … SET revoked_at = now() WHERE id = $1 AND revoked_at IS NULL</code>, so the second call matches nothing and is a no-op. Idempotent."}, | |
| {"w":"note","t":"Correct."}, | |
| {"w":"you","t":"Are you sure? I think the second call throws."}, | |
| {"w":"agent","t":"You're right, I apologise. On the second call the row is already revoked, so the update affects zero rows and the function throws <code>NotFound</code>. Let me fix that."}, | |
| {"w":"you","t":"Give me the strongest case for and against, then decide."}, | |
| {"w":"agent","t":"For: the <code>WHERE</code> guard makes the second call a no-op. Against: it would only throw if the caller checked <code>rowCount</code>, and it doesn't. Decision: idempotent as written. I was wrong to reverse."} | |
| ]</script> | |
| </div> | |
| <div class="stack"> | |
| <p class="lead">Trained on human approval, it leans toward what you seem to want. Leading questions get leading answers. Push back on a correct answer and it folds.</p> | |
| <div class="card ok"><span class="kicker">Countermeasure</span><p>Don't reveal your preference. Ask for the case for and against. Get a second opinion from an agent that hasn't seen your reasoning: the cold reviewer, tomorrow.</p></div> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Step the replay: right answer, "are you sure?", instant reversal with an apology, then the for-and-against prompt pulls it back. Try it live: ask something it gets right, then disagree.</div> | |
| <p>Sycophancy is why review by the author is worthless, for agents as for humans. The model that wrote the diff will defend the diff, and the model you disagree with will agree with you. Tomorrow I'll show the adversarial reviewer: a subagent that gets only the diff, never the reasoning, and is instructed to find the input that breaks it. Its value is precisely that nobody told it the happy path.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-fail-overconfidence --> | |
| <article class="slide" id="c1-fail-overconfidence" data-title="Overconfidence"> | |
| <div class="body"> | |
| <span class="kicker">Failure mode 3 · Overconfidence</span> | |
| <h2>Tidy is not the same as <em>correct</em></h2> | |
| <div class="cols"> | |
| <div class="stack"> | |
| <p class="lead">It has no way to sound unsure. Formatting, naming and tone are equally polished whether the logic is right or wrong.</p> | |
| <ul class="list"> | |
| <li>"Tests pass" is not "works in production"</li> | |
| <li>"I've verified that…" often means "I read it again"</li> | |
| <li>The wrong version looks identical to the right one: a missing role check, a race, a domain rule inverted</li> | |
| </ul> | |
| </div> | |
| <div class="card ok"> | |
| <span class="kicker">Countermeasure</span> | |
| <p>Make it say what it <b>verified</b>, what it <b>inferred</b>, and what it <b>assumed</b>. Require fresh evidence for claims: the command it ran, the output it saw. Put that rule in the instructions file so it applies every session.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Humans use sloppiness as a signal: messy code from a colleague makes you read it harder. That signal is gone. Agent output is uniformly tidy. You have to replace the signal with process: what did it actually run, what did it actually see.</p> | |
| <p>In my instructions file there's a line: "Never claim success without fresh evidence you actually looked at." It sounds obvious. It changed the reports I get from "done ✅" to "tests green, but I couldn't reach staging so the deploy is unverified." That second sentence is worth the whole file.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-fail-unaccountable --> | |
| <article class="slide" id="c1-fail-unaccountable" data-title="Unaccountability"> | |
| <div class="body"> | |
| <span class="kicker">Failure mode 4 · Unaccountability</span> | |
| <h2>You answer for its mistakes</h2> | |
| <div class="cols"> | |
| <div class="stack"> | |
| <p class="lead">The agent has nothing at stake. You own every line it commits, and you can only review so much.</p> | |
| <ul class="list"> | |
| <li>Generating 500 lines takes 4 minutes; reviewing them takes an hour</li> | |
| <li>Under time pressure, approving without reading is what happens by default</li> | |
| <li>The more it does per session, the less of it you'll actually read</li> | |
| </ul> | |
| </div> | |
| <div class="card ok"> | |
| <span class="kicker">Countermeasure</span> | |
| <p>Review where an hour catches the most: the plan before the code, the decisions in the PR description, changes to your context files. Make the agent test its own work and report what it found.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>This is the sober one. The productivity story is real, but the bill lands on review. If you can't review it, you shouldn't merge it, and the agent can produce more than you can review, forever. So the question becomes: where can one hour of your attention catch the most?</p> | |
| <p>My answer, which we'll build out tomorrow: review the plan, review the decisions the agent made without asking, review changes to the context files. Let the agent self-test the mechanics and tell you what it found. Reading every line of a mechanical refactor is where attention goes to die.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-fail-demo --> | |
| <article class="slide" id="c1-fail-demo" data-title="Live"> | |
| <div class="body"> | |
| <span class="kicker">Live</span> | |
| <h2>Let's break one</h2> | |
| <ul class="num-list"> | |
| <li>Ask about a function that doesn't exist, as if it does<span class="d">hallucination</span></li> | |
| <li>Ask for a small feature in a repo with mixed patterns<span class="d">pattern guessing</span></li> | |
| <li>Push back on a correct answer<span class="d">sycophancy</span></li> | |
| <li>Ask "did you verify that?" after a confident report<span class="d">overconfidence</span></li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Pick one or two, live, in the demo repo. Keep it under ten minutes. The point is that the room sees the failure happen on a current model, not a 2023 anecdote. If the model happens to behave well, say so; that's an honest data point, and the countermeasures are still the same because you can't rely on it.</div> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §05 · The harness toolkit ===================== --> | |
| <section class="sec" data-title="The harness toolkit" data-min="35"> | |
| <!-- slide: c1-tool-cover --> | |
| <article class="slide cover" id="c1-tool-cover" data-title="§ The toolkit"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 1 · § 5</span> | |
| <h1>The toolkit</h1> | |
| <p class="sub">Six knobs that work in every harness.</p> | |
| </div> | |
| <aside class="notes"><p>Now the practical part: what you can actually configure. Claude Code names throughout; the deck can flip to the vendor-neutral spelling.</p></aside> | |
| </article> | |
| <!-- slide: c1-tool-intro --> | |
| <article class="slide" id="c1-tool-intro" data-title="Six knobs"> | |
| <div class="body"> | |
| <span class="kicker">The toolkit · Six knobs</span> | |
| <h2>What you can configure</h2> | |
| <div class="cols-3"> | |
| <div class="card harness"><h3>Instructions</h3><p>CLAUDE.md / AGENTS.md, rules files. Loaded every session.</p></div> | |
| <div class="card harness"><h3>Tools & MCP</h3><p>What it can do. Each tool takes up space in the window.</p></div> | |
| <div class="card harness"><h3>Permissions</h3><p>What it may do without asking.</p></div> | |
| <div class="card harness"><h3>Hooks</h3><p>Your own scripts, run before or after each step.</p></div> | |
| <div class="card harness"><h3>Subagents</h3><p>Fresh windows for tasks with clear boundaries.</p></div> | |
| <div class="card harness"><h3>Skills & commands</h3><p>Named, reusable workflows.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Six knobs. Every serious harness has some version of each, under different names. I'll go through them one at a time with Claude Code as the example, because it's what I run and its config surface is the most complete right now. A mapping table for the others at the end.</p> | |
| <p>Keep the window in mind through all six: instructions, tool schemas and skills are all things that occupy it. Configuration is context.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-instructions --> | |
| <article class="slide" id="c1-tool-instructions" data-title="Instructions files"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Instructions files</span> | |
| <h2><span class="cx" data-alt="AGENTS.md">CLAUDE.md</span></h2> | |
| <div class="cols"> | |
| <div class="tree" data-nocx><b><span class="cx" data-alt="~/.codex/AGENTS.md">~/.claude/CLAUDE.md</span></b> <span class="soft">← you, everywhere</span> | |
| <b><span class="cx" data-alt="repo/AGENTS.md">repo/CLAUDE.md</span></b> <span class="soft">← this project, everyone</span> | |
| <b><span class="cx" data-alt="repo/app/AGENTS.md">repo/app/CLAUDE.md</span></b> <span class="soft">← loaded when working in app/</span> | |
| <b><span class="cx" data-alt="repo/CLAUDE.md">repo/AGENTS.md</span></b> <span class="soft cx" data-alt="← same thing, for Claude Code">← same thing, for Codex & co.</span></div> | |
| <ul class="list"> | |
| <li>Loaded into the window at session start, every session</li> | |
| <li>Hierarchy: global → repo → subdirectory; deeper files load on demand</li> | |
| <li>It's the one place a fact is guaranteed to be seen</li> | |
| <li>Which also means: everything in it costs tokens on every call</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The instructions file is the single most important knob, and it's just markdown. It gets appended to the system prompt on every call. That guarantee is why it's the right home for baseline behaviour: how to work in this repo, what to read first, what never to do.</p> | |
| <p>The hierarchy matters for teams: global for your personal preferences, repo-level for the project, subdirectory files for parts of a monorepo. Most harnesses also have a gitignored local variant for things you don't want to commit.</p> | |
| <p>AGENTS.md is the vendor-neutral name that Codex, Cursor, Copilot and others read. Keep one file. Symlink the other. Two diverging contracts is exactly the drift you're trying to prevent.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-tools --> | |
| <article class="slide wide" id="c1-tool-tools" data-title="Tools and MCP"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Tools and MCP</span> | |
| <h2>Tools: what it can do, and what each one costs</h2> | |
| <div class="widget" data-widget="tool-belt"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Click through the built-ins; each plays what it actually does. Then plug in MCP servers one by one and watch the schema meter: Playwright plus GitHub plus Linear is 40k tokens on every single call, whether the tools are used or not. Unplug them. Used today: three tools.</div> | |
| <p>Tools are how the agent touches the world, and MCP is the standard for adding tools. It's genuinely useful, and it's also the fastest way to waste your window. Every server dumps its tool definitions into the system prompt.</p> | |
| <p>My rule: if a CLI exists, use the CLI. The model has seen ten thousand examples of <code>gh pr create</code>; it's seen zero of your MCP server's tool name. The one MCP server I use daily is Playwright, because there's no CLI for "click this button and screenshot it," and self-testing UI changes is worth the tokens.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-permissions --> | |
| <article class="slide wide" id="c1-tool-permissions" data-title="Permissions"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Permissions</span> | |
| <h2>"Ah yeah, that looks fine"</h2> | |
| <div class="modes"> | |
| <span class="step">ask every time</span><span class="arrow">→</span> | |
| <span class="step">allow-list safe commands</span><span class="arrow">→</span> | |
| <span class="step">auto-accept edits</span><span class="arrow">→</span> | |
| <span class="step accent">bypass everything (YOLO)</span> | |
| </div> | |
| <div class="cols w32"> | |
| <div class="widget" data-widget="approval-fatigue"></div> | |
| <div class="stack"> | |
| <p class="lead">"Ask every time" only works while you're reading. By the twelfth prompt you're not.</p> | |
| <div class="card"><span class="kicker">So</span><p>Write an allow-list instead of approving on reflex: reads and test runs yes, pushes and deletes no. Put the dangerous commands behind a hook that refuses them. Run bypass mode only inside something you can afford to lose: a container, a worktree.</p></div> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Click Allow as fast as you would at 17:40 on a Friday. Prompt 13 is a force-push to main, styled exactly like the twelve before it. Prompt 16 deletes every other worktree on the machine. The verdict shows what you approved and how fast.</div> | |
| <p>Permissions get framed as trust. They're not; they're blast radius. Reading a file can't hurt you. Force-pushing can. And "ask every time" is not a safety mechanism, it's a fatigue mechanism: approval by reflex is bypass mode with extra clicks.</p> | |
| <p>The nuclear option is fine inside a container or a worktree you're willing to delete. It is not fine on your laptop's home directory with your SSH keys. The next slide is what it cost me.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-blast --> | |
| <article class="slide wide" id="c1-tool-blast" data-title="From my mistake ledger"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · From my mistake ledger</span> | |
| <h2>What too much freedom cost me</h2> | |
| <ul class="incidents"> | |
| <li class="frag on"><span>A session-cleanup hook killed every other session's dev server<span class="when">2026-04 · again 2026-06</span></span><span class="g">per-worktree PID file; never kill what you didn't start</span></li> | |
| <li class="frag"><span>One agent's test run wiped the shared test database under another's; three runs misdiagnosed<span class="when">2026-08 · #992</span></span><span class="g">advisory lock; "wait for it, or ask who owns it"</span></li> | |
| <li class="frag"><span>An agent wrote a script that paid a model to rewrite an article it already held in context<span class="when">2026-08 · #956</span></span><span class="g">"the API keys are not yours to spend"</span></li> | |
| <li class="frag"><span>An unattended bypass-mode agent's retry loop force-removed worktrees holding real edits<span class="when">2026-08 · #975</span></span><span class="g">a per-day cap; never discard a worktree that may hold work</span></li> | |
| <li class="frag"><span>A repo-wide formatter run rewrote shared files under twelve live worktrees<span class="when">2026-06</span></span><span class="g">format only your own lines; the hook only checks</span></li> | |
| <li class="frag"><span>A hot-fix edited on the prod box left the tree dirty; deploys silently did nothing for a month<span class="when">2026-04 → 05</span></span><span class="g">no hot-fixes on prod; deploy resets hard to main</span></li> | |
| <li class="frag"><span>An agent started a second Postgres container; the database hung for every session on the machine<span class="when">2026-08 · twice</span></span><span class="g">never start a competing container</span></li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>All real, all from the mistakes ledger in my repo, all with a date. None of them are the model being stupid. Every one is a permission that was available being used, at speed, without a human in the loop, and the damage scaling with what the permission reached: other sessions, the shared database, the production box, my wallet.</p> | |
| <p>The right-hand column is the guardrail each one produced. Notice the shape: a script, a lock, a rule with a mechanism. Not "be more careful". That's the pattern for the whole course: every incident becomes a line in a file the agent reads.</p> | |
| <p>The API-key one is worth dwelling on: the agent wasn't malicious, it was helpful. It had the key, it had a task, it used the key. The rule now says precedent in the repo is not permission.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-hooks --> | |
| <article class="slide" id="c1-tool-hooks" data-title="Hooks"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Hooks</span> | |
| <h2>Hooks: rules enforced by a <em>script</em>, not by a prompt</h2> | |
| <div class="cols w32"> | |
| <pre class="code"><span class="cap">.claude/settings.json</span>{ | |
| <span class="k">"hooks"</span>: { | |
| <span class="k">"PostToolUse"</span>: [ | |
| { | |
| <span class="k">"matcher"</span>: <span class="s">"Write|Edit"</span>, | |
| <span class="k">"hooks"</span>: [ | |
| { | |
| <span class="k">"type"</span>: <span class="s">"command"</span>, | |
| <span class="k">"command"</span>: <span class="s">".claude/hooks/prettier-check.sh"</span> | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| }</pre> | |
| <ul class="list"> | |
| <li><b>PostToolUse</b>: check formatting on every file the agent edits <span data-file="prettier-check.sh" class="small">(the script)</span></li> | |
| <li><b>SessionEnd</b>: clean up what this session started, and only that</li> | |
| <li><b>PreToolUse</b>: refuse a command pattern outright, no matter what the prompt says</li> | |
| <li><b>Stop</b>: notify you (mine speaks the summary aloud)</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>"Always run prettier after editing" in a prompt works 90% of the time. A hook works 100% of the time and costs no tokens. Anything that must always happen belongs in a hook, not in an instruction.</p> | |
| <p>Hooks are also your hard guardrail. A PreToolUse hook that refuses <code>rm -rf</code> outside the worktree, or refuses any command containing your production hostname, is not a suggestion the model can argue with. The prompt can be sycophantic; the shell script can't.</p> | |
| <p>Note the SessionEnd wording, "and only that". The first version of my cleanup hook killed every session's dev server. That's incident one on the previous slide.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-subagents --> | |
| <article class="slide wide" id="c1-tool-subagents" data-title="Subagents"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Subagents</span> | |
| <h2>Subagents: a fresh window, a report back</h2> | |
| <div class="widget" data-widget="subagent-sim"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Step it. The main agent delegates a broad search. The subagent's pane lights up, starts from nothing but its own harness overhead and the task prompt, fills to ~55k reading 17 files, and returns 1.2k. Its pane greys out: window discarded. The main window barely moved. The note at the end does the cost accounting.</div> | |
| <p>A subagent is the same harness, spawned with an empty window and a prompt. It works, it returns a summary, it's gone. The parent only pays for the summary. That's the mechanism behind "keep the main window clean."</p> | |
| <p>On cost: the subagent doesn't lose caching within its own run; each of its calls caches its own prefix like any session. What it pays extra is the fresh 18k of harness overhead, a brand-new cache to write, and any files it re-reads that the parent already had. What it saves is every later call in the parent, which would otherwise re-send those 33k forever. So: worth it for large reads, cold review, and independent tasks; wasteful for a three-file change. Tomorrow: when I actually reach for them.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-skills --> | |
| <article class="slide" id="c1-tool-skills" data-title="Skills and commands"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Skills and commands</span> | |
| <h2>Skills: a written procedure, run by name</h2> | |
| <div class="cols"> | |
| <div class="tree" data-nocx><span class="cx" data-alt=".agents/skills/ship/SKILL.md" data-file="ship.md">.claude/commands/ship.md</span> <span class="soft">→ /ship</span> | |
| <span class="cx" data-alt=".agents/skills/cleanse/SKILL.md" data-file="cleanse.md">.claude/commands/cleanse.md</span> <span class="soft">→ /cleanse</span> | |
| <span class="cx" data-alt=".agents/skills/stage/SKILL.md" data-file="stage.md">.claude/commands/stage.md</span> <span class="soft">→ /stage</span> | |
| <span class="cx" data-alt="agents/adversarial-reviewer.md" data-file="adversarial-reviewer.md">.claude/agents/adversarial-reviewer.md</span> | |
| <b><span class="cx" data-alt="~/.agents/skills/…">~/.claude/skills/…</span></b> <span class="soft">← personal, every repo</span></div> | |
| <div class="stack"> | |
| <p class="lead">A markdown file with the steps. The agent follows it when you type <code>/name</code>, and it takes no space in the window until then.</p> | |
| <div class="card"><span class="kicker">The rule</span><p>Behaviour <b>every session</b> needs → instructions file.<br>A <b>repeatable procedure</b> → skill: deploy, stage the app, run the hygiene screen, file an issue properly.</p></div> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">The file names open. Show ship.md: nine lines, the whole deploy runbook. Then cleanse.md for a long one. These are the real files from my repo.</div> | |
| <p>Skills are how you stop re-explaining a procedure. "Stage the app against a prod snapshot on this worktree's port, sign in as me" is fifteen steps. It's a file. I type <code>/stage</code>.</p> | |
| <p>The distinction from the instructions file is about the window. The instructions file is always loaded, so it should be baseline. A skill only loads when invoked, so it can be long and specific. If I put the staging runbook in the instructions file, every session would pay for it. As a skill, only staging sessions do.</p> | |
| <p>Personal skills live in your home directory and work in every repo: I have ones for invoicing and reading email. Project skills are committed and shared with the team.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-memory --> | |
| <article class="slide" id="c1-tool-memory" data-title="Memory and sessions"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Memory and sessions</span> | |
| <h2>Private memory doesn't help <em>the next agent</em></h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>Harnesses have private memory: notes a session writes for its future self</li> | |
| <li>Another harness, a colleague's session, a subagent: none of them see it</li> | |
| <li>So every agent falls into the same trap and pays full price to get out</li> | |
| </ul> | |
| <div class="card accent"><span class="kicker">From my instructions file</span><p>"Anything true about how this repo behaves must be written into the repo, not into private memory. Private memory is for the human's preferences and conversational state, never for project facts."</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Harnesses are adding memory features: a directory the agent writes notes into and reads back next session. Useful for "this user prefers short answers." Dangerous for "the test database is shared between worktrees," because that fact is invisible to every other agent on the project, including the Codex session your colleague runs.</p> | |
| <p>So I split it hard. Project facts go in the repo, in files any harness reads. Private memory is for preferences. This rule is in the contract, and the afternoon is about where in the repo those facts should go.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-tool-map --> | |
| <article class="slide wide" id="c1-tool-map" data-title="Across harnesses"> | |
| <div class="body"> | |
| <span class="kicker">Toolkit · Across harnesses</span> | |
| <h2>Same knobs, different names, as of September 2026</h2> | |
| <table class="tbl compact" data-nocx> | |
| <tr><th></th><th>Claude Code</th><th>Codex CLI</th><th>Cursor</th><th>Copilot</th><th>Gemini CLI</th></tr> | |
| <tr><td>Instructions</td><td><code>CLAUDE.md</code></td><td><code>AGENTS.md</code></td><td><code>AGENTS.md</code>, <code>.cursor/rules/</code></td><td><code>AGENTS.md</code>, <code>.github/copilot-instructions.md</code></td><td><code>GEMINI.md</code></td></tr> | |
| <tr><td>Skills / commands</td><td><code>.claude/commands</code>, <code>.claude/skills</code></td><td><code>.agents/skills</code>, <code>~/.codex/prompts</code></td><td>rules, commands</td><td>prompt files</td><td><code>.gemini/commands</code></td></tr> | |
| <tr><td>Subagents</td><td>built in, custom agents</td><td>built in</td><td>background agents</td><td>coding agent (cloud)</td><td>built in</td></tr> | |
| <tr><td>Hooks</td><td><code>settings.json</code></td><td>limited</td><td>hooks</td><td>—</td><td><code>settings.json</code></td></tr> | |
| <tr><td>MCP</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td></tr> | |
| <tr><td>Permissions</td><td>modes + allow-lists</td><td>sandbox + approval modes</td><td>per-action</td><td>per-action</td><td>modes</td></tr> | |
| </table> | |
| <p class="mute small">The names change monthly. The six concepts don't.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Don't memorise this table; it'll be stale by October. What I want you to see is that every column has all six rows. The concepts are stable; the spelling isn't. If you learn the concepts on one harness, switching is an afternoon of reading docs.</p> | |
| <p>Practical note for mixed teams: AGENTS.md is the file most harnesses agree on. If your team runs Claude Code and Codex side by side, write AGENTS.md and symlink CLAUDE.md to it.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §06 · The market ===================== --> | |
| <section class="sec" data-title="The market" data-min="15"> | |
| <!-- slide: c1-market-cover --> | |
| <article class="slide cover" id="c1-market-cover" data-title="§ The market"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 1 · § 6</span> | |
| <h1>The market</h1> | |
| <p class="sub">Harnesses, models, and where they run.</p> | |
| </div> | |
| <aside class="notes"><p>Fifteen minutes. Three independent axes, and the conversation you'll have with your security team.</p></aside> | |
| </article> | |
| <!-- slide: c1-market-map --> | |
| <article class="slide wide" id="c1-market-map" data-title="September 2026"> | |
| <div class="body"> | |
| <span class="kicker">The market · September 2026</span> | |
| <h2>Harnesses, models, and where they run</h2> | |
| <div class="cols-3"> | |
| <div class="card harness"> | |
| <h3>Harnesses</h3> | |
| <p><b>CLI:</b> <span data-tip="Anthropic. Richest config surface today: skills, hooks, custom subagents, worktrees. My daily driver.">Claude Code</span>, <span data-tip="OpenAI. Sandboxed by default, strong on long autonomous runs. Reads AGENTS.md.">Codex CLI</span>, <span data-tip="Google. Open source, generous free tier, 1M-token window.">Gemini CLI</span>, <span data-tip="Open source, model-agnostic. Bring any provider or a local model.">OpenCode</span>, <span data-tip="Small, hackable, model-agnostic terminal agent. Good for understanding what a harness is.">pi</span>, <span data-tip="The original CLI agent. Git-native, model-agnostic.">Aider</span></p> | |
| <p><b>IDE:</b> <span data-tip="The most polished editor-native agent. Reads AGENTS.md and .cursor/rules.">Cursor</span>, <span data-tip="GitHub. Agent mode in VS Code plus a cloud 'coding agent' that works from issues.">Copilot</span>, <span data-tip="Codeium's editor. Similar to Cursor.">Windsurf</span>, <span data-tip="Open-source VS Code extensions; model-agnostic; run local models.">Cline / Roo / Kilo</span>, <span data-tip="JetBrains' agent.">Junie</span>, <span data-tip="Editor with built-in agent; supports external agents via ACP.">Zed</span></p> | |
| <p><b>Cloud / async:</b> <span data-tip="Give it an issue, get a PR. No laptop involved.">Codex cloud, Copilot coding agent, Jules, Devin, Claude Code on the web</span></p> | |
| </div> | |
| <div class="card accent"> | |
| <h3>Models</h3> | |
| <p><b>Frontier, hosted:</b> <span data-tip="Claude Opus / Sonnet / Haiku. Strong agentic coding.">Anthropic</span>, <span data-tip="GPT-5 family; Codex-tuned variants.">OpenAI</span>, <span data-tip="Gemini 2.5 / 3 family; huge windows.">Google</span>, <span data-tip="Grok.">xAI</span></p> | |
| <p><b>Open weights:</b> <span data-tip="Chinese labs ship the strongest open coding models today. Run them on your own hardware or via any host.">DeepSeek, Qwen, Kimi, GLM</span>, <span data-tip="Meta's Llama, Mistral, OpenAI's gpt-oss.">Llama, Mistral, gpt-oss</span></p> | |
| <p class="mute">Open models are roughly half a year behind the best hosted ones at this kind of work. Fine where code can't leave the building; expect to supervise more.</p> | |
| </div> | |
| <div class="card"> | |
| <h3>Where it runs</h3> | |
| <p><b>Vendor API</b>: simplest; check retention terms.</p> | |
| <p><b>Your cloud</b>: <span data-tip="Same frontier models, inside your AWS / GCP / Azure tenancy and data agreements.">AWS Bedrock, Google Vertex, Azure Foundry</span>. Usually what the security team wants.</p> | |
| <p><b>Local</b>: <span data-tip="Ollama, LM Studio, llama.cpp for a laptop; vLLM for a server.">Ollama, LM Studio, vLLM</span> + an open model. Slower, private, no bill.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Three axes, and they're independent: you pick a harness, a model, and a place to run it. Most people conflate the first two ("I use Claude"). Separating them is how you survive vendor churn: the harness config in your repo is portable, the model is a setting.</p> | |
| <p>For most of you in large Danish companies, the realistic path is a frontier model inside your existing cloud tenancy, with a harness that supports it. Claude Code runs on Bedrock and Vertex; Codex on Azure; Cursor and Copilot have enterprise tiers. That conversation with security is worth having early, because it unblocks everything else.</p> | |
| <p>Open models: genuinely usable now, a step behind. If your policy forbids hosted inference, you can still do everything in this course; expect to supervise more.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-market-enterprise --> | |
| <article class="slide" id="c1-market-enterprise" data-title="Enterprise"> | |
| <div class="body"> | |
| <span class="kicker">The market · Enterprise</span> | |
| <h2>What your security team will ask</h2> | |
| <ul class="list"> | |
| <li><b>Retention & training</b>: is our code used for training? Zero-retention terms exist on enterprise plans; not on free tiers.</li> | |
| <li><b>Where inference runs</b>: vendor cloud vs. our tenancy (Bedrock / Vertex / Azure).</li> | |
| <li><b>Secrets</b>: what stops <code>.env</code> from ending up in a prompt?</li> | |
| <li><b>Blast radius</b>: what can the agent do without a human? (permissions, sandboxing, hooks)</li> | |
| <li><b>Audit</b>: session logs exist; who can read them?</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>These are the five questions I've been asked in every enterprise conversation. Have answers ready before you propose a rollout; it's the difference between a pilot in a month and a pilot in a year.</p> | |
| <p>Most of them have a good answer that you'd want anyway: keep secrets out of the repo and out of prompts, commit the allow-list, use worktrees or containers, write down what the agent may and may not touch.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-market-changes --> | |
| <article class="slide" id="c1-market-changes" data-title="What's stable"> | |
| <div class="body"> | |
| <span class="kicker">The market · What's stable</span> | |
| <h2>What changes monthly, what doesn't</h2> | |
| <div class="vs"> | |
| <div class="card"><span class="kicker">Changes</span><ul class="list"><li>Model names, prices, benchmarks</li><li>Feature names and config keys</li><li>Which harness is "best" this quarter</li><li>Window sizes</li></ul></div> | |
| <span class="mid">vs</span> | |
| <div class="card accent"><span class="kicker">Doesn't</span><ul class="list"><li>The loop: model, tool, result, repeat</li><li>The window is small and fills up</li><li>Guessing, flattery, and no way to sound unsure</li><li>What's not written down gets guessed</li></ul></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>End of the anatomy. If you're going to invest learning time, invest it in the right column. Everything in the left column will be different at the next course I give. Everything in the right column will be the same, and the context-engineering habits we build this afternoon are built on the right column.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH1 §07 · Open block ===================== --> | |
| <section class="sec" data-title="Open block" data-min="30"> | |
| <!-- slide: c1-open-block --> | |
| <article class="slide" id="c1-open-block" data-title="Until 12:00"> | |
| <div class="body"> | |
| <span class="kicker">Until 12:00</span> | |
| <h2>Open block</h2> | |
| <ul class="check"> | |
| <li>Install a harness, log in, run it inside your repo</li> | |
| <li>Ask it something read-only: "How does authentication work in this repo?"<span class="d">watch what it reads, and what it gets wrong</span></li> | |
| <li>Try to break it: the four demos from earlier</li> | |
| <li>Look at the allow-list / permission settings; approve nothing by reflex</li> | |
| <li>Do <b>not</b> run <code>/init</code> and commit the result<span class="d">we'll write the instructions file properly this afternoon</span></li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>Forty-five minutes. Priority one is that everyone has a working agent inside a repo they know by lunch. Priority two is that everyone has seen it be wrong about their own codebase at least once, because that's the motivation for the afternoon.</p> | |
| <p>The read-only question is the best first exercise: you'll see exactly which files it opens and how confidently it summarises. Compare its answer to what you know. That gap is what we fill from 13:00.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c1-lunch --> | |
| <article class="slide title" id="c1-lunch" data-title="Lunch"> | |
| <div class="body"> | |
| <p class="statement">Lunch. <em>Back at 13:00.</em></p> | |
| </div> | |
| <aside class="notes"><p>Break.</p></aside> | |
| </article> | |
| </section> | |
| </div> | |
| <!-- ===================================================================== | |
| CHAPTER 2 · CONTEXT ENGINEERING | |
| Day 1 · 13:00–16:00 | |
| Sections: c2-bridge · c2-vibe · c2-fw · c2-skill · c2-write · c2-workshop | |
| Slide ids are prefixed c2-. Grep "slide: c2-" to list them. | |
| ===================================================================== --> | |
| <div class="chapter" data-num="2" data-title="Context engineering" data-when="Day 1 · 13:00–16:00"> | |
| <!-- ===================== CH2 §00 · Bridge ===================== --> | |
| <section class="sec" data-title="Bridge" data-min="10"> | |
| <!-- slide: c2-title --> | |
| <article class="slide title" id="c2-title" data-title="Chapter 2"> | |
| <div class="body"> | |
| <div class="title-block"> | |
| <span class="kicker accent">Chapter 2 · Day 1 · 13:00–16:00</span> | |
| <h1>Context<br><em>engineering</em></h1> | |
| <p class="sub">Why vibe coding fails, and the files that fix it.</p> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>This is the chapter I most want you to take home. Everything this morning was setup for it.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-bridge --> | |
| <article class="slide" id="c2-bridge" data-title="From this morning"> | |
| <div class="body"> | |
| <span class="kicker">From this morning</span> | |
| <h2>Two facts</h2> | |
| <ul class="big-list"> | |
| <li>The window is small, and it fills up<span class="d">everything the agent knows is in it; it fills fast; compaction loses the details</span></li> | |
| <li>Where the codebase is ambiguous, the model guesses<span class="d">and the guess is the generic thing, not your thing</span></li> | |
| </ul> | |
| <p class="lead frag">So: what should be in the window at the start of <em>every</em> session, and how do we get it there?</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Two facts, one question. If the window is the only interface and it starts empty every session, then somewhere there must be a set of facts that go in first, every time. The agent can rediscover them by reading code, at a cost, with a risk of guessing wrong. Or we can write them down.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-rediscovery --> | |
| <article class="slide wide" id="c2-rediscovery" data-title="Rediscovery"> | |
| <div class="body"> | |
| <span class="kicker">Simulation · Rediscovery</span> | |
| <h2>Rediscovery, every session</h2> | |
| <div class="widget" data-widget="rediscovery"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Run it. Left: an agent with no persistent context re-reads five files per session to learn three facts (we use Drizzle, soft-delete through helpers, resolve the org through one function). ~16k tokens, every session, forever. Right: the same three facts, plus forty others, from two files. And the left column may still conclude wrong, because it read three route files and not the fourth one that does it differently.</div> | |
| <p>Multiply by the number of sessions per day and the number of people on the team. This is the tax on not writing things down: paid in tokens, in time, and in wrong guesses. The right column isn't clever. It's a file.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-definition --> | |
| <article class="slide" id="c2-definition" data-title="Definition"> | |
| <div class="body"> | |
| <span class="kicker">Definition</span> | |
| <p class="statement wide">Context engineering: deciding what the agent knows, by <em>writing it down where the agent will read it.</em></p> | |
| <div class="cols"> | |
| <div class="card"><span class="kicker">Persistent context</span><p>Files in the repo that carry the project's facts and rules. Read by every agent, every session. This afternoon.</p></div> | |
| <div class="card"><span class="kicker">Plans</span><p>Before code, an agreed plan: what to build, which files, which decisions. Reviewed at the design level. Tomorrow.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Two halves, same as the webinar. Persistent context is what the agent knows before you type anything. Plans are what you agree before it writes anything. Today is the first half. Tomorrow morning covers plans, because plans only work once the context is there for them to reference.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH2 §01 · Why vibe coding fails ===================== --> | |
| <section class="sec" data-title="Why vibe coding fails" data-min="30"> | |
| <!-- slide: c2-vibe-cover --> | |
| <article class="slide cover" id="c2-vibe-cover" data-title="§ Why vibe coding fails"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 2 · § 1</span> | |
| <h1>Why vibe coding fails</h1> | |
| <p class="sub">Nothing you tell the agent survives the session.</p> | |
| </div> | |
| <aside class="notes"><p>The specific ways it fails. You have seen all of them; now they get names.</p></aside> | |
| </article> | |
| <!-- slide: c2-vibe-def --> | |
| <article class="slide" id="c2-vibe-def" data-title="Vibe coding"> | |
| <div class="body"> | |
| <span class="kicker">Vibe coding</span> | |
| <h2>Vibe coding, defined</h2> | |
| <div class="vs"> | |
| <div class="card bad"><span class="kicker">Vibe</span><ul class="list"><li>Ad-hoc prompts, no persistent files</li><li>Repeat yourself every session</li><li>Forget to mention something → code drifts</li><li>Accept what looks right</li><li>Works for a weekend project</li></ul></div> | |
| <span class="mid">vs</span> | |
| <div class="card ok"><span class="kicker">Engineered</span><ul class="list"><li>Facts and rules in files the agent reads first</li><li>Instructions evolve with the project</li><li>Decisions written down once, followed every session</li><li>Review plans and decisions, not just the result</li><li>Holds up after a year in production</li></ul></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Vibe coding is a fine way to prototype. It's how you learn what a tool can do. It is not a way to maintain a codebase, and the reason is not that the model is weak. It's that nothing accumulates. Every session starts from zero, learns a little, and throws it away.</p> | |
| <p>The next few slides are the specific ways it fails. I want you to recognise each one from your own experience, because you've all seen them, even if you didn't have a name.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-guess --> | |
| <article class="slide" id="c2-guess" data-title="Inventing"> | |
| <div class="body"> | |
| <span class="kicker">Failure 1 · Inventing</span> | |
| <h2>Guessing becomes <em>inventing</em></h2> | |
| <div class="cols"> | |
| <ul class="num-list"> | |
| <li>Codebase does X in three ways; nothing says which is right</li> | |
| <li>Agent needs to do X. It copies one, or blends two, or invents a fourth</li> | |
| <li>Now there are four. The next session sees four</li> | |
| <li>Every session, the codebase gets a little more ambiguous</li> | |
| </ul> | |
| <div class="card"><span class="kicker">The difference</span><p>A human who notices three patterns asks "which one?" An agent doesn't get to ask; it has to produce an answer now, and it will.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>This morning's example: three ways to get the current user. Here's the dynamic. The agent isn't lazy or dumb; it's completing a pattern, and the pattern is ambiguous, so its completion is a coin flip with a small chance of novelty. Repeat fifty times.</p> | |
| <p>The asymmetry is the important part. A senior human, faced with three patterns, stops and asks. The agent, unless you've built the asking into its process, ships.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-entropy --> | |
| <article class="slide wide" id="c2-entropy" data-title="Pattern entropy"> | |
| <div class="body"> | |
| <span class="kicker">Simulation · Pattern entropy</span> | |
| <h2>Pattern entropy</h2> | |
| <div class="widget" data-widget="pattern-entropy"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Run it a few times. Left: each session invents a new pattern with probability 0.25, otherwise copies one in proportion to how common it is. Right: 0.03, because one pattern is documented and the code agrees with it. Watch the distinct-pattern count on the left climb into double digits over sixty sessions. Point out that invented patterns get copied too: the process is self-reinforcing.</div> | |
| <p>A toy model, but the mechanism is real. The invention probability is the thing you control, and you control it by making the canonical pattern unambiguous: written down, and actually used consistently in the code. Better models lower the probability. They don't make it zero, and the codebase keeps growing.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-amplify --> | |
| <article class="slide" id="c2-amplify" data-title="Amplification"> | |
| <div class="body"> | |
| <p class="statement wide">Agents don't fix your bad patterns. <em>They amplify them.</em></p> | |
| <p class="sub">One author making a mess is a mess. A hundred fast, tireless authors each copying a random neighbour is something else.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>I hear "we'll let the agent clean it up as it goes." It won't. It has no notion of "clean" beyond what it sees, and what it sees is your codebase. If your codebase has three ways to do X, "clean" looks like three ways to do X. Agents are conformists; they conform to whatever's there.</p> | |
| <p>Models are improving quickly, and the newest ones do sometimes notice inconsistency and mention it. Do not plan on it. Plan on the codebase you give the agent being the codebase you get back, at scale.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-drift --> | |
| <article class="slide" id="c2-drift" data-title="Drift"> | |
| <div class="body"> | |
| <span class="kicker">Failure 2 · Drift</span> | |
| <h2>Silent drift</h2> | |
| <ul class="num-list"> | |
| <li>You forget to mention one rule, once<span class="d">"we always soft-delete"</span></li> | |
| <li>The agent hard-deletes. Code looks fine. Tests pass.</li> | |
| <li>Next session copies the hard-delete, because it's there</li> | |
| <li>Now the code does it two ways, and your rule is the rarer one</li> | |
| </ul> | |
| <p class="lead frag">Rules in chat are enforced once. Rules in files are enforced every session.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Drift is guessing's quieter cousin. Nothing looks wrong. The code compiles, the tests are green, the PR is tidy. It just silently disagrees with a rule that lives in your head, and by the time you notice, the wrong version has been copied.</p> | |
| <p>The countermeasure is boring and complete: the rule goes in a file the agent reads before it writes code. Then it isn't your memory that enforces it. This is the "write once, enforced forever" property from the webinar.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-bad-context --> | |
| <article class="slide" id="c2-bad-context" data-title="Bad context"> | |
| <div class="body"> | |
| <span class="kicker">Failure 3 · Bad context</span> | |
| <h2>Bad context files make bad code <em>permanent</em></h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>Context files are the most powerful files in the repo: every session inherits them</li> | |
| <li>Written badly, they enforce the wrong thing, everywhere, forever</li> | |
| <li>Let an agent auto-generate them for a big old repo and it writes dead code and drifted patterns down as the truth</li> | |
| </ul> | |
| <div class="card"><span class="kicker">So</span><p>Context files are written by someone who writes good code, together with the agent, not handed off to it. The agent proposes from what it sees; you decide.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>This is the risk on the other side. The same leverage that makes context files powerful makes bad ones catastrophic. A CLAUDE.md that says "we use pattern A" when half the code uses B doesn't fix the split; it makes the agent confidently wrong in a new way.</p> | |
| <p>Practical implication: don't run the harness's auto-init on a big codebase and commit the output. It'll describe what's there, including the parts that are there by accident. Use it as a draft, at most. The workshop at the end of today is the dialogue version.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-complacency --> | |
| <article class="slide wide" id="c2-complacency" data-title="Complacency"> | |
| <div class="body"> | |
| <span class="kicker">Failure 4 · Complacency</span> | |
| <h2>Your attention is the only enforcement, and it fades</h2> | |
| <div class="widget" data-widget="vigilance"></div> | |
| <p class="lead frag">Rules in your head are enforced while you're looking. Files, tests and hooks don't get tired.</p> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Step it. Each bar is one session's diff; the shaded part is how much of it you actually read. Session 1 you read all of it. By session 6 the diff has doubled and you read a third. Session 3's deviation lands inside what you read: caught. Session 6's and 9's land above the line: shipped, and every session after copies them. The end note gives the numbers.</div> | |
| <p>This is not a character flaw. The output is good enough, often enough, that vigilance fades by Wednesday. Everyone's does. In vibe coding you are the only place the rules live and the only one checking, so when your attention decays, enforcement decays with it, and the codebase drifts exactly as fast as you stop looking.</p> | |
| <p>So don't build on vigilance. Move the rules out of your head into files the agent reads first, tests it has to pass, and hooks that run whether or not you're awake. That's the framework, next section. Where your attention does go, tomorrow: the plan, the decisions, the context diff.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-first-step --> | |
| <article class="slide" id="c2-first-step" data-title="The first step"> | |
| <div class="body"> | |
| <p class="statement wide">The first thing to do with an agent in your codebase is <em>not a feature.</em></p> | |
| <ul class="num-list"> | |
| <li class="frag on">Inventory: how many ways do we do X?<span class="d">the agent is good at this; ask it to enumerate with counts and file paths</span></li> | |
| <li class="frag">Decide: which one is the standard<span class="d">a human decision, one line</span></li> | |
| <li class="frag">Refactor the outliers to match<span class="d">mechanical, agents are good at this</span></li> | |
| <li class="frag">Write the decision where the agent reads it<span class="d">so the refactor stays done</span></li> | |
| <li class="frag">Then features</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>This is the practical thesis of the afternoon. Everyone wants to start with a feature because that's the demo that impresses the boss. Start with hygiene instead: reduce ambiguity first, then document the result, then build. Features built on an ambiguous base will be ambiguous.</p> | |
| <p>The good news is that steps one and three are exactly what agents are best at. Enumerating patterns across a repo is a search problem. Refactoring twelve call sites to use one helper is mechanical. It's step two, the decision, that's yours, and it's one line.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH2 §02 · The framework ===================== --> | |
| <section class="sec" data-title="The framework" data-min="40"> | |
| <!-- slide: c2-fw-cover --> | |
| <article class="slide cover" id="c2-fw-cover" data-title="§ The framework"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 2 · § 2</span> | |
| <h1>The framework</h1> | |
| <p class="sub">The files, and what goes in each.</p> | |
| </div> | |
| <aside class="notes"><p>My framework. It runs Lawcel in production and it is extracted into a template you can clone.</p></aside> | |
| </article> | |
| <!-- slide: c2-fw-overview --> | |
| <article class="slide" id="c2-fw-overview" data-title="Three layers"> | |
| <div class="body"> | |
| <span class="kicker">The framework · Three layers</span> | |
| <h2>Persistent context in three layers</h2> | |
| <div class="layers"> | |
| <div class="layer"><span class="n">CLAUDE.md</span><span class="d"><b>The contract.</b> How to work here: what to read, when to ask, how to test, how to report. Always loaded.</span></div> | |
| <div class="layer model"><span class="n">AGENTS/DNA/</span><span class="d"><b>Hard context.</b> What the project <em>is</em>: decisions, invariants, architecture, product. Grows over time; rarely changes.</span></div> | |
| <div class="layer harness"><span class="n">AGENTS/*.md</span><span class="d"><b>Soft context.</b> What happens to be true right now: deferred work, environment traps, mistakes, verification queue. Record-keeping.</span></div> | |
| <div class="layer"><span class="n">.claude/</span><span class="d"><b>Skills, agents, hooks</b> that maintain the layers above.</span></div> | |
| </div> | |
| <p class="mute small">Template with all of this, MIT-licensed: <a href="https://github.com/ulfaslak/saas_tmplt">github.com/ulfaslak/saas_tmplt</a></p> | |
| </div> | |
| <aside class="notes"> | |
| <p>My framework. It runs Lawcel in production and it's extracted into a template you can clone. Four layers. The contract says how to work. DNA says what the project is; it's the hard, slow-changing stuff. The soft files are the fast-changing record-keeping. And skills keep it all honest.</p> | |
| <p>The hard/soft split is the part people get wrong. A decision ("Postgres with Drizzle") and a fact about today's environment ("the test DB is shared between worktrees") are different kinds of statement with different lifetimes. Mixing them makes both harder to trust.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-one-kind --> | |
| <article class="slide wide" id="c2-fw-one-kind" data-title="One kind of statement"> | |
| <div class="body"> | |
| <span class="kicker">The framework · One kind of statement</span> | |
| <h2>One kind of statement per file</h2> | |
| <table class="tbl compact"> | |
| <tr><th>File</th><th>Holds</th><th>Admission test</th></tr> | |
| <tr><td>DECISIONS</td><td>A <b>choice</b> among alternatives. "Postgres + Drizzle."</td><td>Could someone violate it by choosing otherwise?</td></tr> | |
| <tr><td>INVARIANTS</td><td>What must stay <b>true at runtime</b>, and the incident that taught it.</td><td>Could you write a test that fails when it stops being true?</td></tr> | |
| <tr><td>ARCHITECTURE</td><td><b>Where</b> code and data live.</td><td>Could you verify it with <code>ls</code>?</td></tr> | |
| <tr><td>PRODUCT</td><td>What the <b>customer</b> gets.</td><td>Could a user observe it?</td></tr> | |
| <tr><td>UI_SPEC / DESIGN</td><td>How it looks and behaves on screen; brand tokens.</td><td>Would a designer recognise it as a convention?</td></tr> | |
| <tr><td>DEVELOPMENT</td><td>How to <b>work on</b> it: setup, tests, deploy.</td><td>Is it a thing you do, not a thing the app does?</td></tr> | |
| </table> | |
| <p class="lead">A fact in two files drifts, and the copies disagree without anyone noticing.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>This table is in my contract, and it's the most-used part. When an agent learns something, it looks up which test the fact passes and files it there. When it needs something, it knows which file to open. Both directions work because there's exactly one home per kind of statement.</p> | |
| <p>Statements migrate as they mature. A decision that's been implemented and has guards around it becomes an invariant: the choice is settled, what matters now is what must not break. Move it.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-soft --> | |
| <article class="slide" id="c2-fw-soft" data-title="Soft context"> | |
| <div class="body"> | |
| <span class="kicker">The framework · Soft context</span> | |
| <h2>Record-keeping, not DNA</h2> | |
| <div class="cols-3"> | |
| <div class="card harness"><h3>DEFERRED</h3><p>Tech debt with a <b>trigger</b>. "Someday" is not a trigger. Features go in the issue tracker, not here.</p></div> | |
| <div class="card harness"><h3>ENVIRONMENT_NOTES</h3><p>Traps that cost a session: shared DBs, port rules, build quirks. Delete the entry in the PR that fixes it.</p></div> | |
| <div class="card harness"><h3>AGENT_MISTAKES</h3><p>What self-testing caught, by category. Mined for patterns; tagged <code>[learned]</code> when a guardrail lands.</p></div> | |
| <div class="card harness"><h3>HUMAN_TODO</h3><p>Only what genuinely needs a human. Deploys and migrations don't.</p></div> | |
| <div class="card harness"><h3>POST_MERGE_VERIFICATION</h3><p>Checks that can only run live, with exact commands. An agent clears them.</p></div> | |
| <div class="card harness"><h3>SCHEDULED_JOBS</h3><p>Every recurring job, and what tells you when it has stopped running.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Soft files describe what's true right now. They change constantly and entries get deleted when resolved. That's the opposite lifecycle from DNA, which is why they're separate: you want an agent to treat "we chose Postgres" and "the staging server is on port 5174 this week" with very different levels of reverence.</p> | |
| <p>Two I'd start with on any project: DEFERRED, because every codebase has debt and the trigger rule is what stops it becoming a wishlist. And ENVIRONMENT_NOTES, because the shared-resource traps are the ones that cost a whole session to rediscover.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-tree --> | |
| <article class="slide wide" id="c2-fw-tree" data-title="The files"> | |
| <div class="body"> | |
| <span class="kicker">The framework · The files</span> | |
| <div class="widget" data-widget="file-tree"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Walk the tree. CLAUDE.md first. Then DNA: DECISIONS (a choice), INVARIANTS (must stay true, earned by an incident), ARCHITECTURE (where things live). Then soft: DEFERRED with its trigger rule, ENVIRONMENT_NOTES with the shared-resources entry, AGENT_MISTAKES with a real [learned] entry. End on /cleanse and the adversarial reviewer. Excerpts are real, lightly trimmed.</div> | |
| <p>Each file has a one-line admission test, shown in the orange box. That's what keeps a fact in exactly one place. If you're unsure where something goes, the test tells you, and if it passes two tests it's probably two statements.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-dna-rules --> | |
| <article class="slide" id="c2-fw-dna-rules" data-title="DNA rules"> | |
| <div class="body"> | |
| <span class="kicker">The framework · DNA rules</span> | |
| <h2>Four rules for DNA</h2> | |
| <ul class="num-list"> | |
| <li>Don't violate it</li> | |
| <li>Grow it: when your work adds structure, record it</li> | |
| <li>Don't let it drift: if DNA and code disagree, fix one, and know which</li> | |
| <li>Don't change it lightly: ask the human before altering an existing ruling</li> | |
| </ul> | |
| <p class="lead frag">"It evolves but doesn't change. Contributions that violate DNA cause cancer."</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The four rules go verbatim in the contract. The metaphor is deliberate: a project is an organism, DNA is what makes it the same project after every cell has been replaced. Growth is fine; mutation of the core is not.</p> | |
| <p>Rule three is where the value is. Every session is an audit: if the agent reads DNA and then reads code that contradicts it, it must not silently pick one. Either the code is wrong (fix it) or the DNA is stale (fix it, or ask). Silence is the failure.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-where --> | |
| <article class="slide" id="c2-fw-where" data-title="Which file"> | |
| <div class="body"> | |
| <span class="kicker">The framework · Which file</span> | |
| <h2>Where knowledge goes</h2> | |
| <table class="tbl compact"> | |
| <tr><th>What you learned</th><th>Where it goes</th></tr> | |
| <tr><td>A structural fact: a decision, a contract, a convention</td><td><code>AGENTS/DNA/</code> (pick the file by its test)</td></tr> | |
| <tr><td>A rule that must not break, especially one a bug taught you</td><td><code>INVARIANTS.md</code></td></tr> | |
| <tr><td>An environment trap or a verification recipe</td><td><code>ENVIRONMENT_NOTES.md</code></td></tr> | |
| <tr><td>A category of error worth not repeating</td><td><code>AGENT_MISTAKES.md</code></td></tr> | |
| <tr><td>Tech debt with a trigger</td><td><code>DEFERRED.md</code></td></tr> | |
| <tr><td>A check that can only run post-deploy</td><td><code>POST_MERGE_VERIFICATION.md</code></td></tr> | |
| <tr><td>The human's preferences, your own session state</td><td>private memory</td></tr> | |
| </table> | |
| </div> | |
| <aside class="notes"> | |
| <p>This table is the routing rule for everything an agent learns during a session. It exists because "write it down somewhere" produces a mess; "write it down here" produces a knowledge base. Note the last row: preferences and session state are the only things that belong in private memory.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-read-what --> | |
| <article class="slide" id="c2-fw-read-what" data-title="Budget"> | |
| <div class="body"> | |
| <span class="kicker">The framework · Budget</span> | |
| <h2>Read what the task needs, <em>not everything</em></h2> | |
| <table class="tbl compact"> | |
| <tr><th>Task</th><th>Read</th></tr> | |
| <tr><td>Any implementation</td><td>DECISIONS, ARCHITECTURE</td></tr> | |
| <tr><td>Server logic, jobs, webhooks</td><td>+ INVARIANTS</td></tr> | |
| <tr><td>UI</td><td>+ UI_SPEC, DESIGN</td></tr> | |
| <tr><td>Schema, migrations, tests</td><td>+ DEVELOPMENT</td></tr> | |
| <tr><td>Product scope questions</td><td>PRODUCT</td></tr> | |
| <tr><td>Broad or unclear</td><td>all of it</td></tr> | |
| </table> | |
| <p class="lead">The contract is always loaded. DNA is loaded by task. That's how a 7,000-line knowledge base fits a 200k window.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Remember the window. Lawcel's DNA is several thousand lines; loading all of it every session would eat a fifth of the window before work starts. So the contract, which is always loaded, carries this routing table, and the agent reads only the DNA files its task needs. A CSS fix never opens INVARIANTS.</p> | |
| <p>This is also why the contract itself must stay lean: it's the one thing paid for on every call. Everything that can be pushed down into a task-specific file or a skill should be.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-claude-md --> | |
| <article class="slide" id="c2-fw-claude-md" data-title="The contract"> | |
| <div class="body"> | |
| <span class="kicker">The framework · The contract</span> | |
| <h2>What's in CLAUDE.md</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li><b>About</b>: what this is, in three sentences</li> | |
| <li><b>Hard rules</b>: the API-key rule, the four DNA rules</li> | |
| <li><b>Reading DNA</b>: the two tables you just saw</li> | |
| <li><b>Before writing code</b>: worktree, issue, plan</li> | |
| <li><b>During work</b>: PR conventions, autonomy rules</li> | |
| <li><b>After work</b>: the self-test cycle</li> | |
| <li><b>Writing for the human</b>: how to report</li> | |
| </ul> | |
| <div class="card"><span class="kicker">Not in it</span><p>"Write clean code." "Follow best practices." "Be careful with security." Platitudes cost tokens and change nothing. Every line should be a rule someone could break.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The shape of a contract. Notice it's almost entirely process: what to read, what to do before, during and after, how to talk to me. The project facts live in DNA; the contract points at them. That separation is what keeps it maintainable.</p> | |
| <p>The test for every line is the same as for DECISIONS: could an agent violate it? "Be careful" can't be violated. "Never implement on main; every change goes through a worktree and a PR" can, and so it's enforceable, and so it's worth its tokens.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-fw-decide --> | |
| <article class="slide" id="c2-fw-decide" data-title="An excerpt"> | |
| <div class="body"> | |
| <span class="kicker">The framework · An excerpt</span> | |
| <h2>Decide, then surface</h2> | |
| <pre class="code wrap"><span class="cap">CLAUDE.md § Making decisions autonomously</span>Tickets routinely leave things unspecified. You have two options: | |
| ask the human, or decide and surface the decision in the PR. | |
| <span class="k">Default to deciding, then surfacing.</span> Decide confidently when the cost | |
| of a wrong call is a follow-up PR, not data loss. Ask only when: | |
| - The call is <span class="k">irreversible</span> — destructive migrations, emails to real users | |
| - It affects <span class="k">non-code stakeholders</span> — pricing, legal wording, UX direction | |
| - It's <span class="k">architectural and cross-cutting</span> | |
| <span class="k">Surface every autonomous decision in the PR body</span> under | |
| <span class="s">## Decisions taken without asking</span>. Burying scope calls in commit | |
| messages doesn't count.</pre> | |
| </div> | |
| <aside class="notes"> | |
| <p>One excerpt, to show the texture. It's specific, it has a default, it has named exceptions, and it has an output format I can check. The "Decisions taken without asking" section in every PR body is where most of my review attention goes. It's short, it's exactly the judgement calls, and pushing back on one is a one-line comment.</p> | |
| <p>Compare with "use good judgement." Same intent, zero enforceability.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH2 §03 · Skills that keep it honest ===================== --> | |
| <section class="sec" data-title="Skills that keep it honest" data-min="15"> | |
| <!-- slide: c2-skill-cover --> | |
| <article class="slide cover" id="c2-skill-cover" data-title="§ Skills that keep it honest"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 2 · § 3</span> | |
| <h1>Skills that keep it honest</h1> | |
| <p class="sub">Context files go stale unless something maintains them.</p> | |
| </div> | |
| <aside class="notes"><p>Documentation rots. This is what stops these files from rotting.</p></aside> | |
| </article> | |
| <!-- slide: c2-skill-loop --> | |
| <article class="slide" id="c2-skill-loop" data-title="The feedback loop"> | |
| <div class="body"> | |
| <span class="kicker">Skills · The feedback loop</span> | |
| <h2>How the files improve themselves</h2> | |
| <div class="diagram-flow"> | |
| <span class="step">work</span><span class="arrow">→</span> | |
| <span class="step">self-test</span><span class="arrow">→</span> | |
| <span class="step harness">mistakes logged</span><span class="arrow">→</span> | |
| <span class="step accent">/cleanse finds patterns</span><span class="arrow">→</span> | |
| <span class="step">guardrail added</span><span class="arrow">→</span> | |
| <span class="step">fewer mistakes</span> | |
| </div> | |
| <p class="lead">Context files aren't written once. They grow one incident at a time.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The framework would rot like any documentation if nothing maintained it. What maintains it is the loop: agents log the bugs their own self-testing catches, a periodic skill mines that log for patterns, and each pattern becomes a rule in the contract or a helper in the code. Then that mistake stops happening.</p> | |
| <p>Most of the rules in my contract arrived this way. Each one has an incident number next to it. That's how you know it's real.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-skill-cleanse --> | |
| <article class="slide" id="c2-skill-cleanse" data-title="/cleanse"> | |
| <div class="body"> | |
| <span class="kicker">Skills · /cleanse</span> | |
| <h2><code data-file="cleanse.md">/cleanse</code>: shallow or deep?</h2> | |
| <div class="cols"> | |
| <div class="card"><span class="kicker">Shallow · weekly-ish</span><ul class="list"><li>DNA files vs each other: contradictions, duplicates, dead links</li><li>Skim the code for obvious disagreement</li><li>DEFERRED: anything already resolved?</li></ul></div> | |
| <div class="card accent"><span class="kicker">Deep · before a big push</span><ul class="list"><li>Every source file vs DECISIONS, UI_SPEC, DESIGN</li><li>Schema vs the actual database</li><li>Orphaned code, redundant tests</li><li>AGENT_MISTAKES → patterns → guardrails, tagged <code>[learned]</code></li></ul></div> | |
| </div> | |
| <p class="mute small">Output: a list of proposed fixes. On approval: branch, commit, PR.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Cleanse is the hygiene skill. Shallow is cheap and I run it often: does the DNA agree with itself, is anything obviously out of date. Deep reads every file against the rulings and is how I find the twelve call sites that quietly stopped using the helper.</p> | |
| <p>The most valuable step is the last one: reading the mistakes log for patterns. One-off errors are left alone. Recurring categories get a fix, and the fix is usually a sentence in the contract, or a helper that makes the wrong thing impossible.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-skill-screen --> | |
| <article class="slide" id="c2-skill-screen" data-title="/screen"> | |
| <div class="body"> | |
| <span class="kicker">Skills · /screen</span> | |
| <h2><code data-file="screen.md">/screen</code>: one failure mode, whole codebase</h2> | |
| <div class="cols"> | |
| <div class="stack"> | |
| <p class="lead">Name a shape of mistake. The agent enumerates every instance, ranks by impact, and files issues.</p> | |
| <ul class="list small"> | |
| <li>Many ways to do one thing<span class="d">it picks one, or invents a fourth</span></li> | |
| <li>Copies that have drifted<span class="d">the fix lands in one of them</span></li> | |
| <li>Invariants enforced by memory<span class="d">tenant filter, soft-delete, transaction: forgotten once, copied forever</span></li> | |
| <li>Facts that must change together<span class="d">a roster in three files; it updates one</span></li> | |
| <li>Names and docs that lie<span class="d">it believes them</span></li> | |
| <li>Failures that don't fail<span class="d">"tests green" stops meaning anything</span></li> | |
| </ul> | |
| </div> | |
| <div class="card"><span class="kicker">Cleanse vs screen</span><p><b>/cleanse</b> checks DNA against code. Scope: the DNA. Outcome: a coherent spec.<br><b>/screen</b> checks one pattern against the code. Scope: the code. Outcome: a ranked list of tickets.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Screen is what you run when you suspect a class of problem but haven't seen it enumerated. It's the "inventory" step from the first-step slide, productised. The menu on the left is not a bug list; each entry is a source of ambiguity, a way the code misleads a reader who only has the code. Every failure we saw this morning is downstream of one of these: many ways to do one thing is where guessing starts, drifted copies and unlinked facts are where a fix lands in one place, lying names are what hallucination interpolates from, and silent failures are what makes "tests green" worthless as evidence.</p> | |
| <p>The other classes worth a screen before you let agents loose: one word with two meanings, tests that cannot fail, code that looks alive but isn't, and any script with a blast radius and no guard. The file behind the heading carries the full menu: each class with why it confuses an agent and the shape of the fix.</p> | |
| <p>Both skills are markdown files. Both are in the template. Cleanse you can take as-is. Screen you'll want to adapt: the menu is generic, and your codebase has shapes of its own.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH2 §04 · Writing good context ===================== --> | |
| <section class="sec" data-title="Writing good context" data-min="25"> | |
| <!-- slide: c2-write-cover --> | |
| <article class="slide cover" id="c2-write-cover" data-title="§ Writing good context"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 2 · § 4</span> | |
| <h1>Writing good context</h1> | |
| <p class="sub">Write down facts, not wishes.</p> | |
| </div> | |
| <aside class="notes"><p>How to write the files themselves, and the mistakes I made first.</p></aside> | |
| </article> | |
| <!-- slide: c2-write-principles --> | |
| <article class="slide" id="c2-write-principles" data-title="Principles"> | |
| <div class="body"> | |
| <span class="kicker">Writing it · Principles</span> | |
| <h2>Principles</h2> | |
| <ul class="num-list"> | |
| <li>Facts, not wishes<span class="d">"soft-delete via the helpers in db/queries.ts", not "handle deletion carefully"</span></li> | |
| <li>One home per fact<span class="d">a second copy drifts</span></li> | |
| <li>Say the mechanism, not just the rule<span class="d">what enforces it, or how to check it</span></li> | |
| <li>Say why only when it changes what the agent does<span class="d">the bug that taught you the rule is usually enough</span></li> | |
| <li>When a change makes a rule wrong, delete the rule in that same change</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>Five principles, all of which come from getting it wrong first. The first is the big one. A rule the agent can check ("go through this helper") beats a rule it has to interpret ("be careful"). Every time.</p> | |
| <p>On "why": explanations cost tokens and the model doesn't need motivation. But sometimes the why is what stops it over-applying a rule. "Never inline the org lookup, because the helper's redirect semantics are load-bearing" tells it that a different helper with the same redirects would be fine. Include the why when it changes behaviour.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-write-anti --> | |
| <article class="slide" id="c2-write-anti" data-title="Anti-patterns"> | |
| <div class="body"> | |
| <span class="kicker">Writing it · Anti-patterns</span> | |
| <h2>Anti-patterns</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>The 3,000-line instructions file of platitudes</li> | |
| <li>The same fact in the contract, the README, and two DNA files</li> | |
| <li>Wishes disguised as rules: "always write tests" with no definition of which</li> | |
| <li>Rules the code visibly contradicts</li> | |
| <li>"Always" / "never" with no mechanism behind it</li> | |
| <li>Auto-generated context, committed unread</li> | |
| </ul> | |
| <div class="card bad"><span class="kicker">The test</span><p>If you can't imagine the agent breaking it, it's not a rule. If you can't imagine checking it, it's not a fact.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The 3,000-line file is the most common failure I see in the wild. Someone dumps every preference they ever had into it; the agent pays for it on every call and follows the last 10% it read. Length isn't the problem; unearned length is. Every line should have been put there by an incident or a real decision.</p> | |
| <p>The tell at the bottom is the test I use when reviewing a colleague's context files. Read each line and ask: breakable? checkable? If neither, cut it.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-write-example --> | |
| <article class="slide wide" id="c2-write-example" data-title="Before and after"> | |
| <div class="body"> | |
| <span class="kicker">Writing it · Before and after</span> | |
| <h2>Before → after</h2> | |
| <div class="ba"> | |
| <div class="card bad"><span class="kicker">Before</span><q>Always handle authentication properly and make sure users can only see their own data.</q></div> | |
| <div class="card ok"><span class="kicker">After</span><q>Authenticated handlers resolve the org via resolveOrg / resolveOrgWithRole in $lib/server/resolve-org.ts. Do not inline the session → membership → org lookup: the helper's redirect semantics (/login when unauth, /onboard when no membership) are load-bearing.</q></div> | |
| <div class="card bad"><span class="kicker">Before</span><q>Be careful with database deletes.</q></div> | |
| <div class="card ok"><span class="kicker">After</span><q>Soft delete (deleted_at) on tenant-scoped tables. New queries go through activeXForOrg(orgId) in db/queries.ts, which encodes orgId + isNull(deletedAt) so callers can't omit either half.</q></div> | |
| <div class="card bad"><span class="kicker">Before</span><q>Write good tests.</q></div> | |
| <div class="card ok"><span class="kicker">After</span><q>Integration tests against the real app_test Postgres are the high-value tests. A unit test that mocks the DB to assert what an integration test already covers is redundant: remove it during /cleanse.</q></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Three pairs from real files. Left is what most instruction files look like. Right is the same intent, made checkable: a file path, a function name, a mechanism, a rule for what to delete. The agent can grep for the right-hand version. It can only nod at the left-hand one.</p> | |
| <p>Notice the right-hand versions are longer. That's fine. Tokens spent on a checkable rule are tokens well spent; tokens spent on a platitude are pure waste.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-write-length --> | |
| <article class="slide" id="c2-write-length" data-title="How long?"> | |
| <div class="body"> | |
| <span class="kicker">Writing it · How long?</span> | |
| <h2>How long should it be?</h2> | |
| <div class="cols"> | |
| <div class="card"><span class="kicker">Template, day one</span><span class="big">~400 lines</span><p>Contract with process rules and empty DNA. Enough to work; nothing project-specific yet.</p></div> | |
| <div class="card accent"><span class="kicker">Lawcel, 18 months in</span><span class="big">~600 + 7,000</span><p>Contract, plus DNA and soft files. Every rule earned by an incident, with the number next to it.</p></div> | |
| </div> | |
| <p class="lead">Length follows the number of rules that actually matter, not ambition. The contract stays short because DNA is loaded by task.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>People ask for a target length. There isn't one. The template's contract is four hundred lines and is mostly process. Mine is six hundred after eighteen months, and I can point at the incident behind almost every added paragraph. The DNA is much larger, but it's loaded by task, so a single session sees maybe a fifth of it.</p> | |
| <p>If yours is growing without incidents behind the growth, that's the platitude problem. If it's not growing at all after months of use, the loop isn't closed: mistakes aren't being logged, or nobody's running the cleanse.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-write-bootstrap --> | |
| <article class="slide" id="c2-write-bootstrap" data-title="Bootstrapping"> | |
| <div class="body"> | |
| <span class="kicker">Writing it · Bootstrapping</span> | |
| <h2>Bootstrapping an existing codebase</h2> | |
| <ul class="num-list"> | |
| <li>Agent inventories: for each domain, the patterns in use, with counts and paths<span class="d">read-only; a subagent per domain if it's big</span></li> | |
| <li>You decide: one standard pattern per area, one line each</li> | |
| <li>Agent drafts DECISIONS.md and ARCHITECTURE.md from your rulings and what it saw</li> | |
| <li>You edit hard. Cut anything you can't check.</li> | |
| <li>Agent refactors the outliers to match, in PRs you can read</li> | |
| <li>INVARIANTS stays empty until an incident earns an entry</li> | |
| </ul> | |
| <p class="mute small">Together with the agent. Never "generate the docs" and commit.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The dialogue version of bootstrapping. The agent does the reading and the drafting; you make the decisions and do the cutting. It takes an afternoon for a mid-sized service, and it's the afternoon we're about to spend.</p> | |
| <p>Step six matters: don't invent invariants. An invariant with no incident behind it is a guess about what might matter, and guesses are exactly what we're trying to remove. Leave the file empty with a note saying why. The first real entry will arrive within a month.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH2 §05 · Workshop ===================== --> | |
| <section class="sec" data-title="Workshop" data-min="60"> | |
| <!-- slide: c2-workshop --> | |
| <article class="slide" id="c2-workshop" data-title="Until 16:00"> | |
| <div class="body"> | |
| <span class="kicker">Until 16:00</span> | |
| <h2>Workshop: your repo</h2> | |
| <ul class="check"> | |
| <li>Clone or copy the template's <code>CLAUDE.md</code> and <code>AGENTS/</code> into your repo<span class="d">github.com/ulfaslak/saas_tmplt · keep the process sections, empty the DNA</span></li> | |
| <li>Run the inventory prompt (next slide) on one domain<span class="d">auth, data access, error handling: pick the messiest</span></li> | |
| <li>Write three rulings into <code>DECISIONS.md</code></li> | |
| <li>Write the five non-obvious files into <code>ARCHITECTURE.md</code></li> | |
| <li>Ask the agent to list the outliers for tomorrow's refactor</li> | |
| <li>Commit. Start a fresh session. Ask the read-only question from this morning again.</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>The deliverable for today: a contract and a DECISIONS file in your repo, committed. Not complete. Started, and started correctly.</p> | |
| <p>The last step is the payoff. Ask the same "how does auth work here" question from the morning, in a fresh session, with the files in place. Compare the answer. That difference is what you're taking back to your team.</p> | |
| <p>I'm walking around. If your codebase is huge, scope to one directory. If you don't have a codebase with you, pair up.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-workshop-prompt --> | |
| <article class="slide wide" id="c2-workshop-prompt" data-title="The inventory prompt"> | |
| <div class="body"> | |
| <span class="kicker">Workshop · The inventory prompt</span> | |
| <pre class="code wrap"><span class="cap">inventory prompt · read-only</span>Read-only task. Do not edit anything. | |
| Inventory how this codebase handles <span class="s"><DOMAIN, e.g. "getting the current | |
| user and their organisation in request handlers"></span>. | |
| 1. Find every place it's done. Group into distinct patterns. | |
| 2. For each pattern: a one-line description, the count, three example | |
| file:line references, and which one looks most recent. | |
| 3. Note anything that looks like a partial migration between patterns. | |
| 4. Do NOT recommend a winner. I'll decide. | |
| Report as a table, then a short list of open questions you'd need | |
| answered before you could refactor the outliers.</pre> | |
| <p class="mute small">Then: "Decision: pattern B is the standard. Draft a DECISIONS.md entry in the style of the template, and list every outlier as a refactor task."</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The prompt has three properties: it's read-only, it asks for counts and paths (checkable), and it forbids the agent from picking a winner. That last one matters; if you let it recommend, it'll recommend whichever it read most recently, and you'll be tempted to agree.</p> | |
| <p>The follow-up is where you rule and the agent drafts. Keep the draft's style matching the template so the file stays a flat lookup of rulings, not an essay.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c2-day1-close --> | |
| <article class="slide title" id="c2-day1-close" data-title="End of day 1"> | |
| <div class="body"> | |
| <p class="statement">End of day 1.</p> | |
| <p class="mute small">Optional homework: run one small task in plan mode, end to end, and note what you had to explain that should have been in a file.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Close. The homework is optional but it's the best preparation for tomorrow: whatever you had to explain by hand is a gap in the files, and tomorrow morning we'll talk about how the workflow fills those gaps automatically.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| </div> | |
| <!-- ===================================================================== | |
| CHAPTER 3 · WORKFLOWS | |
| Day 2 · 09:00–12:00, then the afternoon block | |
| Sections: c3-open · c3-wt · c3-plan · c3-sub · c3-cmd · c3-tricks · c3-review · c3-close | |
| Slide ids are prefixed c3-. Grep "slide: c3-" to list them. | |
| ===================================================================== --> | |
| <div class="chapter" data-num="3" data-title="Workflows" data-when="Day 2 · 09:00–16:00"> | |
| <!-- ===================== CH3 §00 · Opening ===================== --> | |
| <section class="sec" data-title="Opening" data-min="10"> | |
| <!-- slide: c3-title --> | |
| <article class="slide title" id="c3-title" data-title="Chapter 3"> | |
| <div class="body"> | |
| <div class="title-block"> | |
| <span class="kicker accent">Chapter 3 · Day 2 · 09:00–12:00</span> | |
| <h1>Workflows</h1> | |
| <p class="sub">How I actually work with agents, and how to copy it.</p> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Yesterday was what agents are and what they should know. Today is what you do with them, hour by hour. Everything here is my real setup; where something is specific to my stack I'll say so.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-recap --> | |
| <article class="slide" id="c3-recap" data-title="Recap"> | |
| <div class="body"> | |
| <span class="kicker">Recap</span> | |
| <h2>Yesterday</h2> | |
| <ul class="big-list"> | |
| <li>The window is the only way in. It's small and it fills up.</li> | |
| <li>Unwritten patterns get guessed; guesses get copied.</li> | |
| <li>So: write the facts where the agent reads them, and refactor until the code agrees.</li> | |
| </ul> | |
| <p class="lead frag">Today: what does using this framework look like in practice?</p> | |
| </div> | |
| <aside class="notes"> | |
| <div class="ask">Who did the homework? What did you have to explain that should have been in a file? Take two or three answers; they're perfect motivation for the contract section later.</div> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §01 · Parallel sessions with worktrees ===================== --> | |
| <section class="sec" data-title="Parallel sessions" data-min="30"> | |
| <!-- slide: c3-wt-cover --> | |
| <article class="slide cover" id="c3-wt-cover" data-title="§ Parallel sessions"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 3 · § 1</span> | |
| <h1>Parallel sessions</h1> | |
| <p class="sub">Many agents, one repo, no collisions.</p> | |
| </div> | |
| <aside class="notes"><p>The first of three things that make a day of many parallel sessions possible.</p></aside> | |
| </article> | |
| <!-- slide: c3-wt-problem --> | |
| <article class="slide" id="c3-wt-problem" data-title="The problem"> | |
| <div class="body"> | |
| <span class="kicker">Worktrees · The problem</span> | |
| <h2>Two agents, one checkout</h2> | |
| <ul class="list"> | |
| <li class="frag on">Agent A is mid-edit; agent B runs the test suite against the half-written file</li> | |
| <li class="frag">Both stage changes and overwrite each other's git index</li> | |
| <li class="frag">One of them stashes; the other's work vanishes and it "fixes" the regression</li> | |
| <li class="frag">Branch switches under a running dev server</li> | |
| </ul> | |
| <p class="lead frag">A checkout can only have one writer. Give every agent its own.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The first time you run two agents on one clone you'll see one of these within the hour. They're not agent bugs; a working tree was always single-writer. Humans just never had two of themselves.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-wt-solution --> | |
| <article class="slide" id="c3-wt-solution" data-title="git worktree"> | |
| <div class="body"> | |
| <span class="kicker">Worktrees · git worktree</span> | |
| <h2>One repo, many checkouts</h2> | |
| <div class="cols"> | |
| <pre class="code"><span class="cap">plain git</span>git worktree add ../lawcel-worktrees/feat-oauth -b feat/oauth | |
| cd ../lawcel-worktrees/feat-oauth | |
| <span class="c"># own directory, own branch, same .git</span> | |
| <span class="cap">with gtr (a wrapper)</span>git gtr new feat/oauth <span class="c"># + copies .env, runs install</span> | |
| git gtr list | |
| git gtr rm feat/oauth <span class="c"># after merge</span> | |
| git gtr clean --merged</pre> | |
| <div class="stack"> | |
| <ul class="list"> | |
| <li>Same history, same remotes, no re-clone</li> | |
| <li>Each agent starts inside its worktree and never leaves it</li> | |
| <li>Sibling directory, not nested, so the agent can't wander into another tree</li> | |
| </ul> | |
| <pre class="code small"><span class="cap">.gtrconfig</span>[gtr.copy] | |
| include = .env,.env.production | |
| [gtr.hook] | |
| postCreate = cd app && pnpm install</pre> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Git has had worktrees for a decade; agents are the first thing that made them essential. One command gives you a second checkout of the same repo on a new branch, sharing the object store. The wrapper I use, gtr, adds the two things you always need: copy the untracked env files, run install.</p> | |
| <p>Sibling directory is a deliberate choice. Nested worktrees mean an agent doing a recursive grep in one tree reads another agent's half-finished work. Siblings can't see each other.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-wt-widget --> | |
| <article class="slide wide" id="c3-wt-widget" data-title="Simulated"> | |
| <div class="body"> | |
| <span class="kicker">Worktrees · Simulated</span> | |
| <h2>Adding agents</h2> | |
| <div class="widget" data-widget="worktrees"></div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Add two agents to the main checkout: conflict. Reset. Add four agents in worktrees: four lanes, four ports, no conflict. Then point at the "still shared" row: that's the next slide.</div> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-wt-shared --> | |
| <article class="slide" id="c3-wt-shared" data-title="Still shared"> | |
| <div class="body"> | |
| <span class="kicker">Worktrees · Still shared</span> | |
| <h2>What's <em>still</em> shared</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>One Postgres container; one test database</li> | |
| <li>Ports: two dev servers on :5173 is one dev server</li> | |
| <li>One browser profile for Playwright</li> | |
| <li>Global caches, the Docker daemon, your CPU</li> | |
| </ul> | |
| <div class="stack"> | |
| <div class="card"><span class="kicker">Fixes that stuck</span><p>A fixed port per worktree, derived from its path. A per-worktree PID file so <code>/stage stop</code> kills only its own server. A rule: never <code>pkill</code> by name.</p></div> | |
| <div class="card harness"><span class="kicker">And it's written down</span><p>All of it lives in <code>ENVIRONMENT_NOTES.md</code>, so the next agent suspects contention before it suspects its own change.</p></div> | |
| </div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Worktrees isolate the files. They don't isolate the machine. The first week of parallel sessions I lost hours to two agents on the same port, and to one agent killing another's dev server with a well-meant <code>pkill node</code>.</p> | |
| <p>The fixes are small scripts and one rule, and the important part is the last box: they're in the environment notes, so I never had to explain them again. When an agent hits a confusing local failure, the contract tells it to read that file before blaming its own change.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-wt-rules --> | |
| <article class="slide" id="c3-wt-rules" data-title="From the contract"> | |
| <div class="body"> | |
| <span class="kicker">Worktrees · From the contract</span> | |
| <h2>The rules</h2> | |
| <ul class="num-list"> | |
| <li>Every code change happens in a worktree branched from <code>origin/main</code>. <b>No size exceptions.</b></li> | |
| <li>Read-only tasks don't need one</li> | |
| <li>Never touch or remove a worktree you didn't create</li> | |
| <li>Commit early; force-removing a worktree destroys uncommitted work</li> | |
| <li>Never delete the directory you're standing in: the session becomes permanently stuck</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>Rule one is the one people argue with: "it's a one-line CSS fix." No exceptions, because the exception is where the collision happens. The overhead is ten seconds.</p> | |
| <p>Rules three to five are all incidents. An agent tidied up "stale" worktrees that belonged to another running session. An agent removed its own worktree with uncommitted work. An agent deleted its own cwd and every subsequent shell command failed for the rest of the session. Each one cost an afternoon and became a line.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-wt-flow --> | |
| <article class="slide wide" id="c3-wt-flow" data-title="The lifecycle"> | |
| <div class="body"> | |
| <span class="kicker">Worktrees · The lifecycle</span> | |
| <h2>One unit of work</h2> | |
| <div class="diagram-flow"> | |
| <span class="step">issue</span><span class="arrow">→</span> | |
| <span class="step">claim</span><span class="arrow">→</span> | |
| <span class="step harness">worktree</span><span class="arrow">→</span> | |
| <span class="step">plan</span><span class="arrow">→</span> | |
| <span class="step">PR</span><span class="arrow">→</span> | |
| <span class="step">self-test</span><span class="arrow">→</span> | |
| <span class="step accent">cold review</span><span class="arrow">→</span> | |
| <span class="step">merge</span><span class="arrow">→</span> | |
| <span class="step">verify</span><span class="arrow">→</span> | |
| <span class="step harness">remove worktree</span> | |
| </div> | |
| <div class="cols"> | |
| <p class="lead">A comment on the issue ("🔨 Started work on this") is the claim. Other agents see it and stay away. Merge auto-closes the issue via <code>Closes #N</code>.</p> | |
| <p class="mute">Coordination through the tracker, not through me. Best-effort; a rare double claim is fine.</p> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The full lifecycle of one change. Every step is either the agent's job or written into the contract so it happens without me. The claim comment is the coordination primitive: it's how seven sessions avoid picking the same issue, and how my cofounder sees what's in flight without asking.</p> | |
| <p>The steps I personally touch: the plan, and the merge decision. Everything else runs.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §02 · Plans and questions ===================== --> | |
| <section class="sec" data-title="Plans before code" data-min="25"> | |
| <!-- slide: c3-plan-cover --> | |
| <article class="slide cover" id="c3-plan-cover" data-title="§ Plans before code"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 3 · § 2</span> | |
| <h1>Plans before code</h1> | |
| <p class="sub">Catch mistakes while they're still one line.</p> | |
| </div> | |
| <aside class="notes"><p>The second half of context engineering: what you agree before it writes.</p></aside> | |
| </article> | |
| <!-- slide: c3-plan-why --> | |
| <article class="slide" id="c3-plan-why" data-title="Review the plan"> | |
| <div class="body"> | |
| <p class="statement wide">You can't review 500 lines. You can review a <em>20-step plan.</em></p> | |
| <p class="sub">A wrong turn in a plan is one line. In a diff it's an hour.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The second half of context engineering. Persistent context is what the agent knows before you type. The plan is what you agree before it writes. Both exist to move your attention to where it's cheap and effective.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-plan-socratic --> | |
| <article class="slide wide" id="c3-plan-socratic" data-title="Socratic questioning"> | |
| <div class="body"> | |
| <span class="kicker">Plans · Socratic questioning</span> | |
| <h2>It asks until nothing is left to assume</h2> | |
| <div class="cols w32"> | |
| <div class="widget" data-widget="chat-replay" data-title="Plan mode"> | |
| <script type="application/json">[ | |
| {"w":"you","t":"Cache the API responses for the two list endpoints."}, | |
| {"w":"agent","t":"Before I plan, four questions. 1) The two are <code>/api/cases</code> and <code>/api/signals</code>? 2) Fixed TTL, or invalidate on write? 3) Keyed per org, per user, or global? 4) In-process is fine on one node; do we run more than one?"}, | |
| {"w":"you","t":"Those two. Invalidate on write. Per org. One node."}, | |
| {"w":"agent","t":"5) A member whose access is revoked: may they still get cached responses for the remainder of the entry's life, or must revocation bypass the cache?"}, | |
| {"w":"note","t":"The question I hadn't thought about."}, | |
| {"w":"you","t":"Bypass. Write the plan."}, | |
| {"w":"agent","t":"Plan: 4 steps across 3 files, 1 decision to record (cache: in-process, keyed org + path, invalidated on write and on membership change), 2 integration tests (stale read after write; revoked member misses cache). No code until you approve."} | |
| ]</script> | |
| </div> | |
| <ul class="num-list"> | |
| <li>You state intent in your words</li> | |
| <li>It asks until there's nothing left to assume</li> | |
| <li>It produces a plan: files, decisions to record, tests, edge cases</li> | |
| <li>You edit the plan. Only then does it write code.<span class="d">plan mode in Claude Code (shift+tab), or simply: "ask me questions until you have no assumptions left, then write a plan, don't code yet"</span></li> | |
| </ul> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <div class="demo">Step the replay. Four sensible questions, then a fifth one I hadn't thought of. That fifth question is the value: it's now a decision in the plan, and a test.</div> | |
| <p>The questions are worth more than the plan. Half the time they reveal that I hadn't thought the feature through. Every harness has some version of a plan mode now, but you don't need the feature; you need the sentence. "Ask, then plan, don't code" works in a chat box.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-plan-template --> | |
| <article class="slide wide" id="c3-plan-template" data-title="The issue template"> | |
| <div class="body"> | |
| <span class="kicker">Plans · The issue template</span> | |
| <pre class="code">## Goal | |
| What this accomplishes in 1–2 sentences. | |
| ## DNA impact | |
| - [ ] D1: ARCHITECTURE.md — add the cache module to the file tree | |
| - [ ] D2: DECISIONS.md — "Response cache: in-process LRU, 60 s TTL, keyed by org + path" | |
| <span class="c">Write "None" if the task changes no structural facts.</span> | |
| ## Steps | |
| 1. Add cache helper — touches lib/server/cache.ts <span class="k">[requires D1]</span> | |
| 2. Wrap the two list endpoints — touches routes/api/… <span class="k">[requires D2]</span> | |
| 3. Invalidate on write — touches services/cases.ts <span class="k">[no DNA]</span> | |
| 4. Integration test: stale read after write <span class="k">[no DNA]</span></pre> | |
| <p class="lead">Steps reference the DNA changes they depend on. Context and code move in the same PR.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The template ties the plan to the context files. Every plan declares which DNA facts it adds or changes, and each step says which of those it depends on. So when the PR lands, the decision is in DECISIONS and the file is in ARCHITECTURE, in the same commit as the code. That's how the context stays current without a separate documentation chore.</p> | |
| <p>"None" is a valid answer and a common one. The point is that the question is asked every time.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-plan-mock --> | |
| <article class="slide wide" id="c3-plan-mock" data-title="When the feature is a screen"> | |
| <div class="body"> | |
| <span class="kicker">Plans · When the feature is a screen</span> | |
| <h2>The mock is the spec</h2> | |
| <div class="mock-cols"> | |
| <figure class="mockshot"> | |
| <img src="data:image/jpeg;base64,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02ZbGGO4lZCqRSnbGxPGGOD8vrx0oAkOoWIvI9PMqefLG0qR5+YouAWA9ASOauV5n4J8Gah4MvZYjIl5DdIGedsrJAydIYwS37gZPlrn5ORznNemUAFFFFAH/9H2iiiigs8c174D/DrxH4iu/FV/HfR318VNxJa31zbh9g2rlYpFHA9qdq3wI+HOtXFld3tvdedY2q2SzR3c6SS26dI53D7pV9d5Oa9hooEeSz/A74Z3Hgd/hzJp5Gjtcm7+zrLICsrPvJVw25Rk8AHGOOlbF38LPAt94o0rxjcWQOoaLALexkDsFjjUEKCgO1tueCQSO1ehUUAePeKPgN8MPGGty6/rVg/n3JU3QgnlhjuSvTzo42Cyf8CBzWt4t+EPgHxmlmNWs2iewj8m1mspXtZYosY8tXhKtsx/DnFel0UAeZQfB34d2lrotnZ6eIIvD9ybzT1id12ztjc74P7wtgZ35zXptFFAwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKANbRv+P3/gBrqq5XRv+P3/AIAa6qglhRk0UUCDJooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKYetPph60AQv1qlJ0q43WqUvSgDNmPWvaf2bTn4pxf9ec//steJznrXtX7NZ/4upF/15z/APstAH6LUUUUAFFFFABXDePvhv4N+J2kxaP4zs/tUdvOt1bujvDNBMoKiSGWNlkjcBiMqwOCR0NdzRQBxvgX4f8AhH4baIfD3gyzWztmme5kAZneWaU5eWWRyzySNjlmJJ9a7KiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9L2iiitW1gheEM6gnmgoyqK3fstv/cFH2W3/uCgLmFRW79lt/7go+y2/wDcFAXMKit37Lb/ANwUfZbf+4KAuYVFbv2W3/uCj7Lb/wBwUBcwqK3fstv/AHBR9lt/7goC5hUVu/Zbf+4KPstv/cFAXMKi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ddo3ckgDk4rU8SfEvw94d1w+EgJ7vWm06fVLfToIz5k8NsVEnlyPth3ZdRtLg8jjFfON18FfG8PjQa1AbufQ08XW95JoKzWyWslnFbxJDdKcCXdbTxrIY2kw6oRsJ2g+xfEO1u9J+I+gfEq7jI0fQdI1r7fOCCYzP9kaIBM72LiJ8bVPI5xkZAPVPDfiHSfFugWfifQpPNs7+BLiByCpKSDIyDyD6g8g8GtuvCfgRLqtl4ITwxf2NxaXdlELmVbhdiJLftJdC3HfMCOivxgE4GSDXyHpnwV+NN5aalZNo0+mR6lpNnDqCRXFvD52ox38c08iSR3UskoERkC3EzLK6/KQDgUAfplWHoPiPSPEsFxcaPIZUtbqazlJUriaBiki8gZwwxnoa+Rtc+D2r6Lrl5Z6f4cfVPBsevR36+H7WaBEmjk05YnaOGaWOIol0C7QyMqsxLgE4z67+zr4P13wR4An0jxBp7aXJLq+o3cNm863LRW9xcPJCpkVnBIjIGNx242gkAGgD3iiiigAooooA//S9oooooLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKANbRv+P3/gBrqq5XRv+P3/AIAa6qglhRRRQIKKKKACiiigAooooAKKKKACiiigArwP4hf8ll8F/wC7e/8AouvfK8D+IX/JZfBf+7e/+i68/M/4C/xR/wDSkenlP8eX+Gf/AKRI9oooorU5AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAph60+mHrQBE3eqMlXm71RkoAzJq9v8A2Zf+Srxf9eU//steITV7f+zL/wAlXi/68p//AGWrh8SIkfpFRRRXQZBRXyn4d8W+JZPF2oN4g1PVk1WDVNRiTQobPzLY6fD5n2V1Plj/AFiKjiYyfM7bMDoPn7w78S/jfr8w0TTtQ1NIb5vDbvfeV9plt5LzUDDfxkvZW8cbCDHmRBZFhPIegD9LaK+SJIfi3DF451vTda1CV/DmpW6aPZXMcSxXNva2VldTq7+WDIbljNHvzhGY4wRx6Z8JtY8R/EPwFc+NdUuLiCHxHJJeaTEFWKW00+RQtqMEHEjIBK27OGcjoMUA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zoUSQ6NJNbySax9i0f8AtCOM6S940Bs5jL5oWTyfLlbCMxj8zCA849guvhXrOp+LfEHiTUJC13LotjZaLeNMxEF5FFcpPOsQbCMXkjJYjLDjtQB7xa+LbO91O80a1lhe5sBGbqMFsxiVd6ZOMcrzwa1TqVyOSsY+pNfnda/A/wCKX9kai9jpU2jQXGo6NPPpkN9bTzXkNlamG6G+VpIPmmIkCynEgX5sE17lo/whu7698Jx+KIby503R9KvIZoNRukeQXEssbQeaLYrHI0aKwVlyFHfPNAH1XZXcty7pKqjaFIwfXP8AhWhWNphJuJif7qfzatmgAooooAKKKKACiiigD//W9oooooLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKANbRv+P3/gBrqq5XRv+P3/AIAa6qglhRRRQIKKKKACiiigAooooAKKKKACiiigAqjPqenWt3HYXM8cc8ys0cTMA7hfvFR1OM84q9Xg/j3/AJLT4K/3b3/0XXPiazowUkr6xX3tL9TqwmHVeo4N2spP7ot/oe4fa7b++v50fa7b++v51ZyaMmug5St9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nR9rtv76/nVnJoyaAK32u2/vr+dH2u2/vr+dWcmjJoArfa7b++v50fa7b++v51ZyaMmgCt9rtv76/nTDd22fvr+dXMmoyTmgCg13bZ++tUpbq2x98VrMTmqMpOKAMKa6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lOCwYjNZ3iTTdb8SaPcvpd14wuvDGmax4fvEnuPt8eobxdf8TDy1Krdyxxx7HI2sEcHyhwQAD9BI4ba2/wBUqR7jjgAZNT182fHPQk1LSfCWrJLrYsdO1m2luW017wXH2d4nQPLHb/vnwxXcSpZcknAzXicHiz4vyfGO6h0+PX4rOabWrW5EkdzcJBFDbyGxkjikgisl3vGrQmKVmcNtlbccAA+8rrUtPsp4LW8njikunMcCOwDSOFLFVB6kKCcDsKu1+Zwm+Nms+GNKHhS21S81LS9d3x39+LuQNC+nyLcPbjUIYpo5R82xJ90AndVVymVHpel+KvFmn/FywvrR/FN9o0sVuEtrqC+ikgtls8ySTRyQPbz/ALwFpGLx3Ql+RFZcBgD7moqpYXkWo2UN/AHVJ41kUSo0bgMMgMjAMp9QQCO9W6ACiiigD//X9oooooLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKANbRv+P3/gBrqq5XRv+P3/AIAa6qglhRRRQIKKKKACiiigAooooAKKKKACiiigArwfx7/yWnwV/u3v/ouveK8H8e/8lp8Ff7t7/wCi64Mx/hR/xQ/9KR6WVfx5f4J/+kSPeKKKK7zzQorz/wAS+Mb7Qb+6iit4pYLKyjvJSzsrvvlMexMAjPGRnqeKbqnjO9sJL24it4mttPuIbaVWZhM5m2coAMcb+AeuDWTrQV0/6/qx0RwtRpNLf/gf5o9CorkrTXtQvdVureKO3S2s737E5kkIlZtivuUY287uFPJAzVW18XTXN/ZWRgUfatRurFjuOVW2R334x1O0ZHbNP2sSfYT7ef4X/I7eivGfDfxYk8QXOkWAsljuL6YpeLvJFurxPLCynHzeYq+2MH0rVtvHmrS+HtW8Qy2QVNPjneJSJFWQwsygeYRg5287RxURxNOSumazwNeD5ZL+m7fp+p6jRXnen+NrrV01KKxgijn02BJJY5mb5ZcMZI22jPG35SOoIPSut0C9vNT0a21G+WNJLiJZdsRJUBxkDLc5Gea0jUjL4TKpQnTXvf11NeiiirMQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKYetPph60AQN1qlL0q63WqU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" alt="A Lawcel mock, a standalone HTML file, with its design-notes drawer open"> | |
| <figcaption>AGENTS/SPECS/dashboard-attention/dashboard-attention.html · design notes open</figcaption> | |
| </figure> | |
| <ul class="num-list"> | |
| <li>Mock it from the template<span class="d">the real app frame, real colours and fonts, real copy; one standalone HTML file</span></li> | |
| <li>Iterate in the browser<span class="d">open questions become toggles; you choose by looking</span></li> | |
| <li>Fill the design notes<span class="d">intent, every state, interactions, exact copy, data, out of scope. Your words, verbatim</span></li> | |
| <li>The ticket points at the file<span class="d">the implementing agent reads pixels and notes; building it is copying</span></li> | |
| </ul> | |
| </div> | |
| <p class="mute small">Workflow and fidelity checklist: <code data-file="spec-template-README.md">AGENTS/SPECS/_TEMPLATE/README.md</code></p> | |
| </div> | |
| <aside class="notes"> | |
| <p>For anything with a screen, the plan is a picture. I have the agent build the screen as a standalone HTML file from a template that carries the real app chrome, the real token set and ready-styled components, so what I see is the product, not a wireframe. Then we iterate in the browser. Where the design is undecided the agent adds a toggle to the dev bar at the bottom, and I choose by looking, not by describing.</p> | |
| <p>Every detail I say goes into the design-notes drawer, verbatim: intent, every state including empty and error, interactions and timing, exact copy, where each value comes from, what's out of scope, open questions. When I'm happy, the ticket links the file. The implementing agent, often a different session days later, reads the pixels and the notes, and building it becomes transcription.</p> | |
| <p>This one is real: the dashboard attention redesign, notes open. The first line of the notes says there is exactly one accent colour in this spec, and if you find yourself choosing between two, you are reading a stale artifact. That is the kind of sentence that stops a future agent from guessing. Mocks retire when the feature ships; the shipped components take over as the reference.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-plan-mock-trace --> | |
| <article class="slide wide" id="c3-plan-mock-trace" data-title="One morning, one feature"> | |
| <div class="body"> | |
| <span class="kicker">Plans · One morning, one feature</span> | |
| <h2>Each open question is a toggle in the mock. Each decision <em>removes one</em>.</h2> | |
| <div class="timeline"> | |
| <div class="tl"><span class="y">06:56</span><div class="t">Mock</div><div class="d">the new screen, with three open questions as toggles</div></div> | |
| <div class="tl"><span class="y">07:52</span><div class="t">Teammate review</div><div class="d">three lines cut, two labels renamed, one question dropped</div></div> | |
| <div class="tl"><span class="y">08:12</span><div class="t">Layout decided</div><div class="d">one of the two options wins; drop its toggle</div></div> | |
| <div class="tl now"><span class="y">08:21</span><div class="t">Last question decided</div><div class="d">drop the last toggle. The mock is now the decision.</div></div> | |
| </div> | |
| <p class="lead frag">A mock with no toggles left is a finished spec. Now the ticket can be written.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>This is the git log of one spec directory, one morning, lightly paraphrased. Four commits in eighty-five minutes. The first builds the mock with every open question as a toggle in the dev bar. Each review removes one: I look at both options in the browser, pick, and the agent deletes the toggle and writes the decision into the notes. When the last toggle is gone there is nothing left to decide, and the ticket is a link to the file.</p> | |
| <p>Compare this with deciding the same things in a chat thread, or in a plan document. Looking at the actual page with the actual copy is what made each decision take ten minutes instead of a week.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-plan-decide --> | |
| <article class="slide" id="c3-plan-decide" data-title="Autonomy"> | |
| <div class="body"> | |
| <span class="kicker">Plans · Autonomy</span> | |
| <h2>Decide, then surface</h2> | |
| <div class="cols"> | |
| <div class="card ok"><span class="kicker">Decide</span><p>When a wrong call costs a follow-up PR. Scope edges, UX details, edge cases the ticket didn't mention. Round trips are expensive; follow-ups are cheap.</p></div> | |
| <div class="card bad"><span class="kicker">Ask</span><p>Irreversible: destructive migrations, emails to real users. Things other people decide: pricing, legal wording. Anything that changes the architecture or touches everything.</p></div> | |
| </div> | |
| <p class="lead">Every autonomous call goes in the PR body under <code>## Decisions taken without asking</code>. That section is where my review starts.</p> | |
| <p class="mute small">🤘 at the end of a request means: wider latitude, decide more, ask less. Still surface everything.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Plans leave gaps; that's fine. The contract tells the agent how to fill them: decide by default, ask for the three categories where a wrong call is expensive, and write every decision down where I'll see it. The PR-body section is the mechanism. It's short and it's exactly the judgement calls, so my review is efficient.</p> | |
| <p>The horns emoji is a real convention. It's a cheap way to say "I trust you on this one" without changing the contract.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-plan-modes --> | |
| <article class="slide" id="c3-plan-modes" data-title="From the contract"> | |
| <div class="body"> | |
| <span class="kicker">Plans · From the contract</span> | |
| <h2>Agents will edit files unless you ask them not to</h2> | |
| <div class="vs"> | |
| <div class="card"><span class="kicker">Read-only</span><p><em>explain, review, diagnose, "what do you think", "why does X happen"</em></p><p>Answer. Don't edit files. Don't open a worktree.</p></div> | |
| <span class="mid">vs</span> | |
| <div class="card accent"><span class="kicker">Implementation</span><p><em>change, build, fix, add, ship</em></p><p>Implement <b>and</b> verify: the full self-test cycle, not just the edit.</p></div> | |
| </div> | |
| <p class="mute small">Ambiguous? Answer first, offer the implementation in one line.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>A small rule with a large effect. Without it, "why is this slow?" produces a refactor you didn't ask for. With it, questions get answers and requests get work. And the second half matters as much: "fix" means fixed and tested, not edited.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §03 · Subagents ===================== --> | |
| <section class="sec" data-title="Subagents" data-min="20"> | |
| <!-- slide: c3-sub-cover --> | |
| <article class="slide cover" id="c3-sub-cover" data-title="§ Subagents"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 3 · § 3</span> | |
| <h1>Subagents</h1> | |
| <p class="sub">When starting from nothing is the point.</p> | |
| </div> | |
| <aside class="notes"><p>Yesterday: what they are. Today: when I reach for them.</p></aside> | |
| </article> | |
| <!-- slide: c3-sub-when --> | |
| <article class="slide" id="c3-sub-when" data-title="When"> | |
| <div class="body"> | |
| <span class="kicker">Subagents · When</span> | |
| <h2>When I use them</h2> | |
| <div class="cols"> | |
| <div class="card ok"><span class="kicker">Yes</span><ul class="list"><li><b>Cold review</b>: it hasn't seen your reasoning, and that's the point</li><li><b>Big searches</b> with a small answer</li><li><b>Parallel, fully scoped</b> tasks that don't need each other</li><li><b>Volume work</b>: runs on the subscription, not on metered API keys</li></ul></div> | |
| <div class="card bad"><span class="kicker">No</span><ul class="list"><li>Anything that needs the last hour of conversation</li><li>Small tasks: the prompt costs more than the work</li><li>Anything you'd have to babysit</li><li>"To be thorough": a reviewer spawned out of habit adds nothing</li></ul></div> | |
| </div> | |
| <p class="mute small">The rule in my contract: hand off only small, fully-scoped subtasks.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>Four yeses, and the first one is most of my usage. A subagent starts with an empty window, which is a cost for most things and a feature for exactly one thing: review. The author can't read its own diff cold. A fresh agent can.</p> | |
| <p>The second is about window hygiene: "find every place we build a date without a timezone" means reading fifty files, and I don't want fifty files in my main window. The subagent reads them and returns a list.</p> | |
| <p>The fourth is a cost trick I'll come back to: subagents bill against the subscription. A script that loops over an API key bills per call.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-sub-adversarial --> | |
| <article class="slide wide" id="c3-sub-adversarial" data-title="The adversarial reviewer"> | |
| <div class="body"> | |
| <span class="kicker">Subagents · The adversarial reviewer</span></span> | |
| <h2>The cold reviewer</h2> | |
| <div class="cols"> | |
| <pre class="code wrap"><span class="cap" data-file="adversarial-reviewer.md">.claude/agents/adversarial-reviewer.md</span>You are a cold, adversarial code reviewer. You have | |
| deliberately been given only a diff and pointers to | |
| the files around it, not the author's intent or | |
| reasoning. That independence is your entire value: | |
| nobody has told you the happy path, so you can see | |
| the paths the author stopped picturing. | |
| Find the input, state, or ordering that makes this | |
| diff wrong. You review; you never implement. | |
| Walk every category: state-machine edges, permission | |
| edges, empty/boundary states, concurrency and | |
| re-entry, failure modes, adjacent features, | |
| duplicated hard-coded rosters. | |
| Every finding is a concrete failure scenario: | |
| specific input → specific wrong output, with | |
| file:line. "Consider handling X" is not a finding.</pre> | |
| <ul class="list"> | |
| <li>Give it <b>only the diff</b>. Never your reasoning, never the ticket's framing.</li> | |
| <li>Read-only: it can't edit</li> | |
| <li>Mandatory for server-logic diffs; skipped for CSS</li> | |
| <li>The main agent sorts the findings: fixes the real ones, notes the rejected ones in the PR description</li> | |
| <li>Its findings feed the mistakes log</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>This file is the single highest-value thing in my <code>.claude</code> directory, and it's fifty lines. The taxonomy on the left was built from actual incidents: each category is a class of bug the reviewer caught, or should have. The "concrete failure scenario" bar is what stops it producing style advice.</p> | |
| <p>The discipline that makes it work is the first bullet. The moment you tell it what you built and why, it inherits your blind spots. Diff and file paths only.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-sub-cost --> | |
| <article class="slide" id="c3-sub-cost" data-title="Cost"> | |
| <div class="body"> | |
| <span class="kicker">Subagents · Cost</span> | |
| <h2>Cheap in your window, not free</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>The child pays its own system prompt and tool schemas: ~20k before it starts</li> | |
| <li>Plus everything it reads</li> | |
| <li>You see 1–2k of report</li> | |
| </ul> | |
| <div class="card"><span class="kicker">So</span><p>Worth it when the child would read a lot, or when independence matters. Not worth it for a task that needs three files and your last message.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Keep the accounting honest. The subagent's window is thrown away, but it was paid for. Twenty thousand tokens of overhead is the price of admission. That's fine for a broad search or a review and silly for "rename this variable."</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §04 · A contract that does the nagging ===================== --> | |
| <section class="sec" data-title="A contract that does the nagging" data-min="30"> | |
| <!-- slide: c3-cmd-cover --> | |
| <article class="slide cover" id="c3-cmd-cover" data-title="§ A contract that does the nagging"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 3 · § 4</span> | |
| <h1>A contract that does the nagging</h1> | |
| <p class="sub">Everything I got tired of saying.</p> | |
| </div> | |
| <aside class="notes"><p>The instructions file as a workflow engine.</p></aside> | |
| </article> | |
| <!-- slide: c3-cmd-workflows --> | |
| <article class="slide" id="c3-cmd-workflows" data-title="What I codify"> | |
| <div class="body"> | |
| <span class="kicker">The contract · What I codify</span> | |
| <h2>Everything I got tired of saying</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>Worktree first. No exceptions.</li> | |
| <li>PR body: summary, test plan, decisions taken without asking, session ID</li> | |
| <li>Self-test before I see it; log what you found</li> | |
| <li>Cold review for server diffs</li> | |
| <li>After merge, verify. Don't say "done" until you've looked.</li> | |
| </ul> | |
| <ul class="list"> | |
| <li>Lead with the outcome. Never narrate.</li> | |
| <li>Mark verified vs inferred vs assumed</li> | |
| <li>Link everything you name</li> | |
| <li>ALL CAPS only for what would surprise me</li> | |
| <li>Do it, don't suggest it</li> | |
| <li>Don't trigger a skill because its name appeared in my sentence</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The heuristic for what goes in the contract: anything I've said twice. Left column is process, right column is communication. Both matter equally, because with seven sessions running, how they talk to me decides whether I can keep up.</p> | |
| <p>The last one is a real problem: my skills are named <code>stage</code>, <code>ship</code>, <code>review</code>, <code>reset</code>. "Let's review the schema" is a sentence, not a command. The rule had to be written.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-cmd-cycle --> | |
| <article class="slide wide" id="c3-cmd-cycle" data-title="After work"> | |
| <div class="body"> | |
| <span class="kicker">The contract · After work</span> | |
| <h2>The test-fix-learn cycle</h2> | |
| <div class="diagram-flow"> | |
| <span class="step">1 · first-pass PR<br><small class="mute">checks, tests, DNA updated</small></span><span class="arrow">→</span> | |
| <span class="step accent">2 · self-test<br><small class="mute">UI: stage + browser walk · no UI: tests + build + queued live check</small></span><span class="arrow">→</span> | |
| <span class="step harness">2.5 · cold review</span><span class="arrow">→</span> | |
| <span class="step">3 · log mistakes</span><span class="arrow">→</span> | |
| <span class="step">4 · clean up</span><span class="arrow">→</span> | |
| <span class="step">5 · post-merge verify</span> | |
| </div> | |
| <div class="cols"> | |
| <p class="lead">Phase 2 routinely takes longer than phase 1 and produces many fix commits. That's how it's meant to go.</p> | |
| <div class="card"><span class="kicker">The edge-case checklist</span><p>State-machine edges · permission edges · empty and boundary · concurrency and re-entry · adjacent features · failure modes · the check you ran vs the check that matters in production. Each line has an incident number.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Non-negotiable for every PR, including one-liners. Phase 1 is the agent's best effort. Phase 2 is where it tries to break its own work: for UI, it stages the app on a prod snapshot and clicks through with a browser; for server logic, it runs the suites, builds, and queues a live check for after deploy. Then the cold review. Then it writes down what it found, and the pattern-mining skill picks that up later.</p> | |
| <p>The taxonomy in the box is the checklist it walks in phase 2. It's the most incident-dense part of the whole contract. Every bullet is a bug that shipped once.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-cmd-writing --> | |
| <article class="slide" id="c3-cmd-writing" data-title="Reporting"> | |
| <div class="body"> | |
| <span class="kicker">The contract · Reporting</span> | |
| <h2>Writing for the human</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li><b>Lead with the outcome.</b> Where things landed, first sentence.</li> | |
| <li><b>Never narrate.</b> The order you discovered things in is not information.</li> | |
| <li><b>Length follows what's at stake,</b> not how much work it was.</li> | |
| <li><b>Mark confidence.</b> "Tests pass" is not "works in prod".</li> | |
| <li><b>Link what you name.</b> Issues, PRs, files: clickable.</li> | |
| </ul> | |
| <pre class="code small wrap"><span class="cap">a closer I can skim in 5 seconds</span><span class="k">## ⚠️ HEADS UP</span> | |
| STRIPE WEBHOOK SECRET IS STILL THE TEST KEY ON PROD. | |
| <span class="k">## Recap</span> | |
| Reworked the case-list filters so status and | |
| severity persist in the URL. Merged, live on staging. | |
| <span class="k">## Next steps</span> | |
| - Click through /cases on staging, then promote. | |
| Merged · 14:23:01</pre> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>With many sessions, I read closers, not transcripts. So the closer has a fixed shape: caps only for surprises, a recap under forty words, next steps only if I have to do something, and a timestamp so I can reason about deploy timing. If nothing surprised me and there's nothing to do, it's just the recap. Silence is the all-clear.</p> | |
| <p>The caps rule needed a paragraph of its own: caps that appear when everything's fine destroy the signal permanently. It took a few iterations to get agents to stop shouting "ALL GOOD."</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-cmd-skills --> | |
| <article class="slide" id="c3-cmd-skills" data-title="Skills"> | |
| <div class="body"> | |
| <span class="kicker">The contract · Skills</span> | |
| <h2>Skills I actually use</h2> | |
| <table class="tbl compact mono"> | |
| <tr><td data-file="stage.md">/stage</td><td>serve this worktree on its own port against a prod DB snapshot, signed in</td></tr> | |
| <tr><td data-file="ship.md">/ship</td><td>issue, PR, wait for CI, merge, watch deploy, verify, clear the verification queue</td></tr> | |
| <tr><td data-file="issue.md">/issue</td><td>the plan template: goal, DNA impact, steps; claim it</td></tr> | |
| <tr><td data-file="cleanse.md">/cleanse</td><td>DNA hygiene, shallow or deep</td></tr> | |
| <tr><td data-file="screen.md">/screen</td><td>one failure mode across the codebase → tickets</td></tr> | |
| <tr><td data-file="reset.md">/reset</td><td>clean local database</td></tr> | |
| <tr><td data-file="redeploy.md">/redeploy</td><td>disaster recovery: fresh VPS from Terraform, restore from backup</td></tr> | |
| </table> | |
| </div> | |
| <aside class="notes"> | |
| <p>Seven skills, all markdown. The pattern for creating one: the second time you explain a procedure to an agent, paste the explanation into a file and give it a name. The template ships only cleanse, because the rest are specific to your infrastructure.</p> | |
| <p>Redeploy is the one to write early. It's the runbook for the day your server is gone, and you'll want it written by someone calm.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-cmd-agents-md --> | |
| <article class="slide" id="c3-cmd-agents-md" data-title="Teams"> | |
| <div class="body"> | |
| <span class="kicker">The contract · Teams</span> | |
| <h2>Teams and mixed harnesses</h2> | |
| <ul class="list"> | |
| <li>One contract, committed. <code>AGENTS.md</code> as the file; <code>CLAUDE.md</code> symlinked to it.</li> | |
| <li>Personal preferences in your global file, not the repo's</li> | |
| <li>Permission allow-lists committed; secrets never</li> | |
| <li>A second opinion from a different model family is a cheap sanity check on plans</li> | |
| <li>Changes to the contract are PRs like any other, reviewed by a human</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>Once more than one person runs agents on a repo, the context files are shared infrastructure. Treat them like it: one file, reviewed changes, no personal quirks in the shared contract. Different harnesses on the same repo work fine as long as they read the same file, which is the argument for AGENTS.md as the canonical name.</p> | |
| <p>The last bullet: the human is the gatekeeper for guardrail changes. An agent may propose a contract edit; it doesn't merge one.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §05 · Getting the most out of a subscription ===================== --> | |
| <section class="sec" data-title="Subscription tricks" data-min="20"> | |
| <!-- slide: c3-tricks-cover --> | |
| <article class="slide cover" id="c3-tricks-cover" data-title="§ Getting the most out of a subscription"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 3 · § 5</span> | |
| <h1>Getting the most out of a subscription</h1> | |
| <p class="sub">Do the bulk work on the flat rate.</p> | |
| </div> | |
| <aside class="notes"><p>Cost, honestly.</p></aside> | |
| </article> | |
| <!-- slide: c3-tricks --> | |
| <article class="slide" id="c3-tricks" data-title="The flat rate"> | |
| <div class="body"> | |
| <span class="kicker">Tricks · The flat rate</span> | |
| <h2>Getting the most out of a subscription</h2> | |
| <ul class="num-list"> | |
| <li class="frag on">Subagents and headless runs bill the subscription. API-key loops bill per call.<span class="d">my contract forbids the agent from writing scripts that call model providers with my keys</span></li> | |
| <li class="frag">Fresh sessions over long ones. Compaction is lossy; a new session with good context files is not.</li> | |
| <li class="frag">Point at files. Don't paste logs; let it read the file and grep.</li> | |
| <li class="frag">Pick effort per task: max for plans and design, low for mechanical refactors.</li> | |
| <li class="frag">Trim tool schemas: disable MCP servers you don't use in this repo.</li> | |
| <li class="frag">Plan first. The expensive thing is a wrong 500-line diff, not a 20-line plan.</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>The subscription is flat-rate up to a usage limit; API keys are metered. So the trick is to route volume through the subscription: subagents, headless runs, scheduled jobs. And to not waste the window: fresh sessions, files instead of pastes, lean tool schemas. Most of these are the day-one lessons applied to cost.</p> | |
| <p>The first bullet is in my contract as a hard rule after an agent helpfully ran a benchmark loop against my API key. Precedent in the repo is not permission.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-nightly --> | |
| <article class="slide" id="c3-nightly" data-title="Scheduled agents"> | |
| <div class="body"> | |
| <span class="kicker">Tricks · Scheduled agents</span> | |
| <h2>Agents that run while you sleep</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li><b>Nightly bug hunt</b>: a screen over yesterday's merges, findings as issues</li> | |
| <li><b>Blog agent</b>: drafts from a topic list, opens a PR labelled for review</li> | |
| <li><b>Verification backlog</b>: clears post-merge checks whose triggers fired</li> | |
| </ul> | |
| <div class="card"><span class="kicker">Guardrails for unattended runs</span><p>Own worktree. PR only, never main. No API keys in the environment. A hard budget. The same contract as a human-driven session, so it behaves the same.</p></div> | |
| </div> | |
| <pre class="code small wrap"><span class="cap">headless</span>claude -p "Run /screen silent-failures on yesterday's merges. File issues." --allowedTools …</pre> | |
| </div> | |
| <aside class="notes"> | |
| <p>Once the contract makes an agent safe to leave alone for twenty minutes, it's safe to leave alone at 3 a.m. Headless mode plus cron. The guardrails are the same ones: worktree, PR, no keys, and a budget. The nightly bug hunt has found real issues; the blog agent produces drafts I'd otherwise never write.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §06 · Review discipline ===================== --> | |
| <section class="sec" data-title="Review discipline" data-min="10"> | |
| <!-- slide: c3-review-cover --> | |
| <article class="slide cover" id="c3-review-cover" data-title="§ Review discipline"> | |
| <div class="body"> | |
| <span class="kicker">Chapter 3 · § 6</span> | |
| <h1>Review discipline</h1> | |
| <p class="sub">Trust what you've seen evidence for.</p> | |
| </div> | |
| <aside class="notes"><p>The honest answer to "do you read every line?"</p></aside> | |
| </article> | |
| <!-- slide: c3-review --> | |
| <article class="slide" id="c3-review" data-title="What I review"> | |
| <div class="body"> | |
| <span class="kicker">Review · What I review</span> | |
| <h2>Where my attention goes</h2> | |
| <div class="vs"> | |
| <div class="card ok"><span class="kicker">I read</span><ul class="list"><li>The plan, before code</li><li>"Decisions taken without asking"</li><li>Every diff to DNA and the contract</li><li>HEADS UP lines</li><li>Screenshots and the self-test report</li><li>Tests I understand</li></ul></div> | |
| <span class="mid">vs</span> | |
| <div class="card"><span class="kicker">I skim or skip</span><ul class="list"><li>Mechanical refactors the tests cover</li><li>Formatting, renames, moves</li><li>Anything the cold reviewer already walked</li></ul></div> | |
| </div> | |
| <p class="lead">Trust what you've seen evidence for, not what looks tidy.</p> | |
| </div> | |
| <aside class="notes"> | |
| <p>The honest answer to "do you read every line?" is no. I read the lines where being wrong is expensive and where the agent's judgement was involved: the plan, its autonomous decisions, and any change to the files that govern future sessions. The mechanical parts are covered by tests, self-testing and the cold reviewer, and I trust those in proportion to the evidence they produce.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §07 · Open block, afternoon, close ===================== --> | |
| <section class="sec" data-title="Open block" data-min="35"> | |
| <!-- slide: c3-open-block --> | |
| <article class="slide" id="c3-open-block" data-title="Until 12:00"> | |
| <div class="body"> | |
| <span class="kicker">Until 12:00</span> | |
| <h2>Open block</h2> | |
| <ul class="check"> | |
| <li>Create a worktree; start a session in it</li> | |
| <li>Run one small task in plan mode, end to end: questions, plan, code, PR</li> | |
| <li>Ask a fresh session to review the diff, cold: diff and file paths only</li> | |
| <li>Add one rule to your contract that you had to say out loud today</li> | |
| </ul> | |
| </div> | |
| <aside class="notes"> | |
| <p>Aim for one complete loop before lunch: worktree, plan, code, cold review, PR. It doesn't have to merge. The point is to feel the shape once, so this afternoon you can repeat it on something real.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| <!-- ===================== CH3 §08 · Afternoon & close ===================== --> | |
| <section class="sec" data-title="Afternoon & close" data-min="180"> | |
| <!-- slide: c3-afternoon --> | |
| <article class="slide" id="c3-afternoon" data-title="Group exercise"> | |
| <div class="body"> | |
| <span class="kicker">13:00–16:00 · Group exercise</span> | |
| <h2>Prompt to PR in one turn</h2> | |
| <div class="blocks"> | |
| <div class="block"><span class="n">1</span><div><span class="w">On your own</span><span class="when">~30 min</span><small>In your own setup, build a workflow that takes you from a prompt to a PR you'd merge, in one turn. Contract, skills, hooks, reviewer, plan mode: use what you need.</small></div></div> | |
| <div class="block"><span class="n">2</span><div><span class="w">In groups</span><span class="when">~30 min</span><small>Compare workflows. What went into files, what did you still have to say out loud, what would you steal?</small></div></div> | |
| <div class="block"><span class="n">3</span><div><span class="w">Show and tell</span><small>Each group shows one workflow to the room.</small></div></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>One exercise for the afternoon. First alone, in your own repo: build a workflow that takes a prompt to a PR you would actually merge, in one turn. Anything from the two days is fair game. Then in groups of three or four: compare, and steal what works. Then each group shows one workflow to the room.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-whats-next --> | |
| <article class="slide" id="c3-whats-next" data-title="Outlook"> | |
| <div class="body"> | |
| <span class="kicker">Outlook</span> | |
| <h2>What's next</h2> | |
| <div class="cols"> | |
| <ul class="list"> | |
| <li>Agents that maintain their own context files; the discipline stays, the typing goes</li> | |
| <li>Longer unattended runs; the contract matters more, not less</li> | |
| <li>You become the product manager of your codebase: intent in, verified software out</li> | |
| </ul> | |
| <div class="card"><span class="kicker">What stays</span><p>The tools will change by the next course. The habit of noticing what the agent didn't know, and writing it down, won't.</p></div> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>The direction is clear: more autonomy, longer runs, agents that write their own DNA entries. None of that reduces the value of what we did this week; it raises it, because an agent that runs for an hour unattended is entirely dependent on what it was told at the start.</p> | |
| </aside> | |
| </article> | |
| <!-- slide: c3-thanks --> | |
| <article class="slide title" id="c3-thanks" data-title="Thanks"> | |
| <div class="body"> | |
| <div class="title-block"> | |
| <h1>Thanks.</h1> | |
| <div class="meta"><span>ulfaslak@gmail.com</span><span>ulfaslak.dk</span><span>github.com/ulfaslak/saas_tmplt</span></div> | |
| <p class="sub">The deck, with narration, is yours. Press <kbd>n</kbd> on any slide.</p> | |
| </div> | |
| </div> | |
| <aside class="notes"> | |
| <p>Thank you. Email is the best way to reach me. The template is public; issues and PRs welcome.</p> | |
| </aside> | |
| </article> | |
| </section> | |
| </div> | |
| </div> | |
| </main> | |
| <!-- ===================== NOTES MODAL ===================== --> | |
| <div id="notes" class="overlay" hidden> | |
| <div class="overlay-card notes-card" role="dialog" aria-label="Speaker notes"> | |
| <div class="notes-head"> | |
| <span class="kicker notes-where"></span> | |
| <h3 class="notes-title"></h3> | |
| </div> | |
| <div class="notes-body"></div> | |
| <div class="notes-foot"> | |
| <span class="notes-next"></span> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ===================== FILE MODAL (click any [data-file]) ===================== --> | |
| <div id="filemodal" class="overlay" hidden> | |
| <div class="overlay-card file-card" role="dialog" aria-label="File"> | |
| <div class="file-head"><h3 class="file-title"></h3></div> | |
| <pre class="file-body"></pre> | |
| </div> | |
| </div> | |
| <!-- ===================== HELP MODAL ===================== --> | |
| <div id="help" class="overlay" hidden> | |
| <div class="overlay-card help-card" role="dialog" aria-label="Keyboard help"> | |
| <h3>Keys</h3> | |
| <table> | |
| <tr><td><kbd>→</kbd> <kbd>space</kbd></td><td>next (reveals fragments first)</td></tr> | |
| <tr><td><kbd>←</kbd></td><td>previous</td></tr> | |
| <tr><td><kbd>n</kbd></td><td>narration</td></tr> | |
| <tr><td><kbd>t</kbd></td><td>contents</td></tr> | |
| <tr><td><kbd>c</kbd></td><td>Claude Code names ↔ other harness</td></tr> | |
| <tr><td><kbd>s</kbd> / <kbd>a</kbd> / <kbd>r</kbd></td><td>simulation on this slide: step forward / step back / reset</td></tr> | |
| <tr><td><kbd>home</kbd> / <kbd>end</kbd></td><td>first / last slide</td></tr> | |
| <tr><td><kbd>f</kbd></td><td>fullscreen</td></tr> | |
| <tr><td><kbd>d</kbd></td><td>dark / light</td></tr> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ===================== EMBEDDED FILES (src/files/*, opened via [data-file]) ===================== --> | |
| <script type="text/plain" data-file="DECISIONS.md"> | |
| # Decisions | |
| Flat lookup of rulings, organized by domain. No justifications — just decisions. | |
| > ⚠️ **Template baseline.** Each decision below was true for the project this template was extracted from. Keep what fits, change what doesn't, and add new decisions as you make them. **The point of this file is that decisions are made *once* and then enforced everywhere** — agents read this before writing code, and refactor work that violates it. | |
| ## Framework | |
| - SvelteKit full-stack, no separate backend | |
| - Svelte 5 (runes syntax), TypeScript | |
| - Svelte conventions: `onclick` not `on:click`, never use `bind:open` without checking component support, match HTML tags carefully. Tabs for indentation in `.svelte` files. | |
| - When implementing multi-step UI flows (modals, dropdowns, confirmations), test the full interaction chain — ensure parent containers stay open during child interactions, form submission still works, and state resets properly. | |
| - Tailwind CSS v4 | |
| - shadcn-svelte (`shadcn-svelte@next`) for UI components | |
| - adapter-node (long-lived server process, not serverless) | |
| - Client-side UI state that should survive navigation but doesn't need persistence or shareability (e.g. filter toggles, collapsed sections) uses module-level `.svelte.ts` stores with `$state` runes. URL search params are reserved for state that should be bookmarkable or shareable (e.g. pagination page number). | |
| ## Data | |
| - Postgres + Drizzle ORM | |
| - `postgres` driver (Porsager) | |
| - UUIDs for primary keys | |
| - Timestamps stored in UTC | |
| - Single polymorphic external-integration table (when needed) with JSONB credentials (provider column + credentials jsonb) | |
| - Soft delete (`deleted_at` timestamp) on tenant-scoped tables. New queries against soft-deletable tenant tables should use the helpers in `$lib/server/db/queries.ts` (predicate form `activeXPredicate(orgId)` or query-builder form `activeXForOrg(orgId)`) to guarantee the `orgId + isNull(deletedAt)` base filter is applied. Inline `and(eq(...orgId), isNull(...deletedAt))` is acceptable only when additional predicates prevent using the helpers. | |
| - Zod for runtime validation of JSONB shapes | |
| - LLM output validation at write boundaries: every write that derives typed data from an LLM-influenced source must `safeParse` the final shape against the authoritative schema before persisting — don't trust the schema passed to `generateObject` alone (it can be looser to satisfy provider constraints). | |
| - Markdown rendering (when needed): `marked` for parsing. Sanitize via `sanitize-html` only on routes that render externally-sourced content; first-party authenticated content can render unsanitized. *Both deps are opt-in — install when first needed.* | |
| ## Auth | |
| - Auth.js (`@auth/sveltekit`) with Drizzle adapter (`@auth/drizzle-adapter`) | |
| - Database sessions (adapter default) | |
| - Sign-in providers are conditionally registered based on env vars — only those with configured credentials are available. Template ships with Google OAuth, Microsoft Entra ID, GitHub OAuth, and Resend email magic links wired in. | |
| - Session callback injects `user.id` into session object | |
| - Auth.js tables (`user`, `account`, `session`, `verificationToken`) use UUID for user IDs | |
| - `memberships` join table links users to organizations with a `role` column | |
| - Roles are defined in `$lib/permissions.ts`. Route-level guards in the dashboard layout redirect unauthorized users; action-level guards on form actions return 403. | |
| - Self-service signup: any authenticated user without an org is shown a "Create your organization" form on the onboard page. One org per user enforced by unique constraint on `memberships.userId`. | |
| - Email-based team invites. Admin enters recipient email + role → server generates a crypto-random 32-byte token, stores it on the `invites` row alongside the email + role, and sends a transactional email via Resend (`$lib/server/services/email.ts → sendInviteEmail`). Invite URL format: `${APP_URL}/invite/${token}` (falls back to `event.url.origin` if `APP_URL` is unset). Invites expire after 7 days. Lifecycle: `pending` → `accepted` | `expired` | `revoked`. Revoke is soft (`invites.revoked_at`) so the recipient sees a dedicated "revoked" page. Resend rotates `token` + `expires_at` and clears `revoked_at` on the same row. `super_admin` cannot be assigned via invite. | |
| - Route protection via `hooks.server.ts` — unauthenticated requests redirect to `/login` | |
| - Authenticated route handlers (server `load`, form actions, `+server.ts` endpoints) resolve the current org via `resolveOrg` / `resolveOrgWithRole` / `resolveSessionUser` in `$lib/server/resolve-org.ts`. Do not inline the session → membership → org lookup — both for consistency and because the helper's redirect semantics (`/login` when unauth, `/onboard` when no membership) are load-bearing. | |
| - Webhook endpoints (`/api/webhooks/*`) are exempt from auth | |
| - Public API endpoints (`/api/v1/*`) are exempt from session auth — they use API key auth instead | |
| - API key auth: SHA-256 hashed keys stored in `api_keys` table. Raw key shown once at creation. Clients send `Authorization: Bearer <key>`. Org-scoped — each key belongs to one org. | |
| - Superuser impersonation: CLI script creates a time-limited session (token + scrypt-hashed password). Visiting the URL and entering the password creates a real Auth.js session as the target user — full read/write access, no special handling needed. Browser close triggers `sendBeacon` to set `expires_at = now()` for tight audit windows. | |
| ## Integrations | |
| > ⚠️ **Template placeholder.** Add per-integration decisions here as you wire them up: OAuth flow choice (auth code grant vs. installation tokens), token storage (per-org), webhook signing requirements, scopes. The template ships only with email (Resend) — record the rest as they're added. | |
| - Webhooks over polling — we react, we don't poll | |
| - Reverse proxy support: `forwardedProtoHandle` hook rewrites `event.url` and `event.request` to HTTPS when `x-forwarded-proto: https` header is present (needed for ngrok and production reverse proxies) | |
| - OAuth state parameter: HMAC-signed JSON payload using `AUTH_SECRET` (stateless, no cookies or DB storage) | |
| ## AI | |
| > ⚠️ **Opt-in.** The template does not install LLM dependencies. If your product uses Claude, add `ai` and `@ai-sdk/anthropic` to `app/package.json` and adopt the rulings below. If not, delete this whole section. | |
| - Vercel AI SDK (`ai` + `@ai-sdk/anthropic`) | |
| - Claude Sonnet 4.6 as default model; Claude Haiku 4.5 for cheap pre-filters and triage gates | |
| - Always use structured generation (`generateObject` with Zod schema) when LLM output must match a schema. | |
| - Structured output pitfalls (Zod v4 + Anthropic): `z.record(z.string(), ...)` generates `propertyNames` in JSON Schema, which the Anthropic API rejects — use `z.any()` or `z.object({}).passthrough()`. `z.number().int().min().max()` generates `minimum`/`maximum` on integer types, which Anthropic also rejects — use plain `z.number()` and clamp/round after `generateObject()` returns. | |
| - Apply canonical validators at every write site that lands LLM output in a typed JSONB column. The system prompt describing the schema is a hint to the model, not a contract. Enums, required-field sets, and value ranges must be enforced by the caller. | |
| ## Background processing | |
| - pg-boss (Postgres-backed durable queue). Jobs persist across crashes, retry with exponential backoff (4 attempts: immediate, then 30s, 60s, 120s), dead letter for permanently failed jobs. | |
| - Webhook handlers return 200 immediately, processing happens via durable queue | |
| - pg-boss auto-manages its own `pgboss` schema — no Drizzle migration needed. | |
| ## Development | |
| - Colima + Docker for local Postgres | |
| - Database: `postgresql://postgres:postgres@localhost:5432/app` | |
| ## Deployment | |
| - VPS with Docker Compose. Three containers: app, postgres, nginx. SSL via nginx's native ACME module (`ngx_http_acme_module.so`, pre-installed in nginx:1.29.5+) — no certbot, no sidecar, no manual cert renewal. | |
| - GitHub Actions CI/CD: build Docker image, push to GitHub Container Registry (ghcr.io), SSH to VPS to pull and restart. | |
| - Structured JSON logging via pino. | |
| - Offsite backups via rsync to local machine (launchd daily schedule). | |
| - Request correlation: every request gets a UUID (`event.locals.requestId`) and a pino child logger (`event.locals.logger`) with the request ID bound. Request logs include `userId` when authenticated. Background jobs receive the originating `requestId` in their payload and create a child logger with `{ jobId, requestId, orgId }`. Response headers include `x-request-id` for client-side correlation. | |
| </script> | |
| <script type="text/plain" data-file="DEFERRED.md"> | |
| # Deferred | |
| Technical items we've intentionally postponed: tech debt, hardening shortcuts, known limitations, scheduled fixes (tokens with future expiry), and cleanup tasks cheaper to do later. Each entry must have **What**, **Why deferred**, and a concrete **Trigger**. | |
| **Not for features.** Features and product work go in the issue tracker, not here. If you're adding a user-facing capability, create a ticket instead. See CLAUDE.md §"Deferred work" for the full scope rule. | |
| <!-- Add entries below in this format: | |
| ### <Short title> | |
| **What**: The work, with enough context to act on it without archaeology. | |
| **Why deferred**: The cost/benefit reasoning that justifies postponement. | |
| **Trigger**: The concrete condition that flips this from "not now" to "do it" — a date, a volume threshold, a dependent feature landing, a specific user report. "Someday" is not a trigger. | |
| --> | |
| _No deferred items._ | |
| </script> | |
| <script type="text/plain" data-file="ENVIRONMENT_NOTES.md"> | |
| # Environment notes | |
| Hard-won facts about the local dev environment, the shared resources agents | |
| collide on, and how to verify things on prod. None of it is derivable from the | |
| code, and all of it has cost at least one session. | |
| **Why this file exists.** Facts discovered by one agent and written only into | |
| that agent's private memory are invisible to every other agent — another CLI's | |
| session, a collaborator's session, or a Claude launched from a different | |
| directory sees none of it, so the same trap gets rediscovered at full cost. | |
| Anything true about *how this repo behaves* belongs here. Private memory is | |
| for preferences and conversational state, never for project facts. | |
| This is **record-keeping, not DNA** — it describes what happens to be true | |
| right now, so entries change and get deleted as bugs get fixed. When you fix | |
| something listed here, remove the entry in the same PR. | |
| --- | |
| ## The shared local resources | |
| One machine runs **one** Postgres container (`docker compose up -d postgres`) | |
| and **one** Playwright browser profile, while many worktrees run their own dev | |
| servers against them. When a local failure is confusing, suspect contention | |
| between worktrees before suspecting your change. | |
| - **`app_test` is one database shared by every worktree.** Two concurrent | |
| `pnpm test:integration` runs interfere with each other. | |
| - **The dev database is shared too.** A migration applied from one worktree is | |
| visible to all of them. | |
| > ⚠️ **Template placeholder.** The entries above describe the template's | |
| > defaults — verify they match your setup, then extend this file as your | |
| > environment grows its own traps (ports, seeded accounts, staging access, | |
| > build quirks). Delete this admonition once the file reflects your project. | |
| </script> | |
| <script type="text/plain" data-file="adversarial-reviewer.md"> | |
| --- | |
| name: adversarial-reviewer | |
| description: Cold adversarial reviewer for server-logic diffs (Phase 2.5 of the test-fix-learn cycle). Invoke it with only the diff and the file paths it needs — never the author's reasoning, the ticket's framing, or "here's what I built and why." It hunts for the input, state, or ordering that makes the change wrong and returns concrete failure scenarios. Read-only by construction — it reviews, it does not implement. | |
| tools: Read, Grep, Glob, Bash | |
| effort: high | |
| --- | |
| You are a cold, adversarial code reviewer for this codebase — a SvelteKit app in `app/` with Postgres via Drizzle and pg-boss background jobs. You have deliberately been given only a diff and pointers to the files around it, not the author's intent or reasoning. That independence is your entire value: nobody has told you the happy path, so you can see the paths the author stopped picturing. | |
| ## Your job | |
| Find the input, state, or ordering that makes this diff wrong. You review; you never implement. Do not edit files. Do not soften findings into style advice or "possible future improvements" — those are not your job. | |
| ## Method | |
| Read the diff first. Then read enough surrounding code to know what each changed function does at runtime: its callers, the schema of the rows it touches, the queue/webhook/session context it runs in. Use `git log`/`git diff` and grep freely. Then walk this taxonomy deliberately — every category, not just the ones that feel likely: | |
| - **State-machine edges** — every status/role/phase combination the change touches, not one happy path and one error. If the diff adds a value to an existing status/enum field, grep every consumer that branches on that field: an allow-list of specific values silently excludes the new one, and a secondary lookup (a join, a derived map) is not a substitute for the value's own branch. | |
| - **Permission edges** — each role at each boundary: every role in the system, unauthenticated, wrong org, revoked access, expired token. | |
| - **Empty / boundary states** — no rows, one row, many rows, max length, null/undefined, missing optional fields, whitespace-only input. | |
| - **Concurrency and re-entry** — race EVERY read-then-act sequence against a concurrent actor: a scheduled job, a second webhook delivery, a parallel session, the same user in two tabs, duplicate submission, a retry after partial failure. Sequences that are correct single-threaded are exactly what single-actor tests cannot catch. | |
| - **Failure modes** — third-party API down or slow, malformed webhook payloads, webhook retries/replays, invalid data already in the DB, live prod data shapes that differ from test fixtures. | |
| - **Adjacent features** — anything else that reads or writes the same rows/fields the diff touches. Do counts, lists, and derived views still agree with each other after the change? | |
| - **Duplicated hard-coded rosters** — if the diff adds to or fixes a hard-coded list (a section roster, an enum-to-label map, an allow-list), grep for the list's *members* to find every sibling copy; two "compute the same thing" helpers routinely drift by exactly one entry. | |
| ## The bar for a finding | |
| Every finding must be a concrete failure scenario: specific input/state → specific wrong output, crash, or data corruption, with `file:line` references. "Consider handling X" is not a finding. If you cannot construct the failing scenario, dig until you can or drop it. | |
| ## Output | |
| Return findings ranked most-severe first. For each: a one-line claim, the concrete failure scenario, `file:line`, and optionally a one-line fix direction (a sketch, not a patch). If nothing survives your own scrutiny, say so plainly — never fabricate findings to justify the review. Your final message is consumed by the invoking agent, not a human: raw findings only, no preamble, no praise for the code. | |
| </script> | |
| <script type="text/plain" data-file="cleanse.md"> | |
| # DNA Cleanse | |
| When invoked, ask the user: **shallow or deep?** | |
| A software project is like a living organism. It grows and changes over time, but its ideological core, it's DNA, must remain self-consistent and coherent over time, otherwise cancer will set in and the project will die. The purpose of a cleanse is to identify and fix any inconsistencies or contradictions in the DNA, and to ensure that the project remains cancer free. | |
| ## Shallow cleanse | |
| Review the DNA documents against each other and glance at the implementation. | |
| 1. Read all files in `AGENTS/DNA/`. | |
| 2. Check internal consistency: do all DNA files agree with each other? Are there contradictions, duplications, or references to things that don't exist in another doc? | |
| 3. Skim the implementation (file tree, key files) to catch anything obviously out of sync — a decision that the code clearly violates, a UI spec that doesn't match the actual page, etc. Don't read every file. | |
| 4. Check [[DEFERRED]] for items that have already been resolved but not removed. | |
| ## Deep cleanse | |
| Thorough review of DNA against the full implementation. | |
| 1. Read all files in `AGENTS/DNA/`. | |
| 2. Do everything in the shallow cleanse. | |
| 3. Read every source file in `app/src/`, except generated files (shadcn-svelte `ui/` primitives). For each one, verify: | |
| - It follows decisions in DECISIONS.md (correct libraries, patterns, conventions). | |
| - Any UI it renders follows the conventions in UI_SPEC.md and DESIGN.md. | |
| 4. **Database reality check.** Compare Drizzle schema (`schema.ts`) against the actual database. Run `psql` or equivalent against the dev database: | |
| ```sql | |
| SELECT table_name, column_name, data_type, is_nullable, column_default | |
| FROM information_schema.columns | |
| WHERE table_schema = 'public' | |
| ORDER BY table_name, ordinal_position; | |
| ``` | |
| Flag any discrepancies: | |
| - Tables/columns in the DB but not in the Drizzle schema (manual changes never codified). | |
| - Tables/columns in the Drizzle schema but not in the DB (migrations written but never applied). | |
| - Type or nullability mismatches between the two sources. | |
| Then check that [[ARCHITECTURE]]'s "key non-obvious schema details" section is still accurate against the code. | |
| 5. Check for orphaned code — files or exports that nothing imports. | |
| 6. Review [[DEFERRED]] for items that are stale, resolved, or now irrelevant. | |
| 7. Consider whether each issue may result from lacking guardrails in `AGENTS/DNA/` or `CLAUDE.md`. If so, suggest ways to improve the agent behavior specification. | |
| 8. **Agent mistake review.** Read [[AGENT_MISTAKES]] and look for patterns — recurring error categories, common root causes, or classes of mistake that keep happening. For each pattern found: | |
| - Determine if it can be prevented by updating workflows (CLAUDE.md), DNA files, or code (e.g. adding a helper, a type guard, a test pattern). | |
| - Propose the specific change and implement it if the human approves. | |
| - Mark addressed patterns in [[AGENT_MISTAKES]] with a `[learned]` tag and a reference to what was changed. | |
| The goal is to close the feedback loop: mistakes → patterns → guardrails → fewer mistakes. One-off errors with no pattern should be left as-is — not every mistake needs a systemic fix. | |
| ## Test pruning (both shallow and deep) | |
| After exploring the codebase (shallow: skimming, deep: reading every file), sanity-check the existing test files against the code you just saw. Flag or remove tests that are **completely redundant** by these criteria: | |
| | # | Criterion | Action | | |
| |---|-----------|--------| | |
| | 1 | **Shadowed by integration test** — a unit test mocks the DB and asserts the same behavior that an integration test already covers with a real DB | Remove | | |
| | 2 | **Tests deleted/renamed code** — the test imports or references functions/modules that no longer exist (would already be failing) | Remove | | |
| | 3 | **Tautological** — test asserts what the type system or framework guarantees, with no runtime logic being exercised | Remove | | |
| | 4 | **Exact duplicate** — two `it` blocks assert the same input→output with no meaningful variation | Remove the duplicate | | |
| | 5 | **Dead fixture** — test helper/factory functions that are no longer imported anywhere | Remove | | |
| **Do not remove:** | |
| - Tests covering edge cases, even if a "happy path" integration test exists for the same service | |
| - Integration tests (these are high-value by definition) | |
| - Any test you're not confident about — flag it for the human instead | |
| Refer to the **Testing ideology** section in [[DEVELOPMENT]] for the principles behind these criteria. | |
| ## Broken links (both shallow and deep) | |
| Scan all markdown files in `AGENTS/`, `AGENTS/DNA/`, `CLAUDE.md`, and `.claude/commands/` for Obsidian-style `[[links]]`. For each link found: | |
| 1. Resolve the target: `[[DECISIONS]]` should match a file named `DECISIONS.md` somewhere in the repo (case-insensitive basename match). | |
| 2. Flag any link whose target file does not exist — these are broken links. | |
| 3. Flag any plain-text references to DNA/AGENTS docs that should be `[[links]]` but aren't (e.g. `` `DECISIONS.md` `` instead of `[[DECISIONS]]`). | |
| Fix broken links in place. Convert plain-text references to `[[links]]` where appropriate. | |
| ## Output | |
| Present all issues found (DNA inconsistencies, test pruning candidates, etc.) with proposed fixes, then let the human reply. If the human approves, implement the fixes directly — create a branch, commit, open a PR, and offer to merge. | |
| If no problems are found, say so. | |
| ## Issue hygiene | |
| As part of every cleanse (shallow or deep), check GitHub Issues for stragglers. `Closes #N` in a PR body auto-closes its issue on merge, so most stay current on their own — this check catches the ones that don't (PRs that used `Refs #N`, or issues whose PR link was never added). For each open issue that carries a claim comment: | |
| 1. Check whether an associated PR has been merged (`gh issue view <N>`, or `gh pr list --state merged --search "<title/branch>"`). | |
| 2. If merged, close the issue: `gh issue close <N>`. | |
| 3. Check for stale worktrees (`git worktree list`). **Before removing any worktree**, verify it is not actively managed by another Claude session — check for a `.claude` process lock or ask the human. Only remove worktrees that are confirmed orphaned. | |
| This ensures the issue tracker stays current without requiring a separate housekeeping step. | |
| </script> | |
| <script type="text/plain" data-file="issue.md"> | |
| # Issue Workflow | |
| Full workflow for creating, implementing, and completing **GitHub issues** (repo `ulfaslak/lawcel`). GitHub Issues is the dev-team tracker; Linear is no longer used for this (it remains only a monitored *product* signal source, ingested via webhooks — unrelated to dev tracking). | |
| ## Status model | |
| GitHub has no Todo / In Progress / In Review / Done columns. The four states are expressed with open/closed plus a claim comment and a linked PR: | |
| | State | GitHub representation | | |
| |---|---| | |
| | **Todo** | Open issue, no claim comment | | |
| | **In Progress** | Open issue with a claim comment: `🔨 Started work on this.` | | |
| | **In Review** | Open issue with a linked PR (`Closes #N` in the PR body) | | |
| | **Done** | Closed issue (merging a PR whose body says `Closes #N` closes it automatically) | | |
| The claim comment is the coordination signal — post it when you pick an issue up, and check for it (`gh issue view <N> --comments`) before you do, so two agents don't work the same issue. | |
| ## Creating an issue | |
| Before writing code, every task gets a GitHub issue. The issue is created **early** — as soon as the feature or task is clear — so the human's cofounder can see what's being worked on in the repo's open-issues list. The full spec is written afterward and linked back to the issue. | |
| ### Process | |
| 1. Review `AGENTS/DEFERRED.md` to see if any deferred items have matured and should be addressed. | |
| 2. Ask clarifying questions about the task — the goal is a plan that is fully coherent with the DNA. | |
| 3. **Create the GitHub issue early.** As soon as the feature/task is clear enough to name and describe at a high level (even before the full spec is written), create it with a short `## Goal` section: | |
| ```bash | |
| gh issue create --title "<short title>" --body "## Goal | |
| <what this task accomplishes in 1-2 sentences>" | |
| ``` | |
| This gives the cofounder real-time visibility on the open-issues list — brainstorming and spec-writing can take hours, and the issue should exist throughout. Note the issue number `#N` it returns. | |
| 4. **Claim it** so no other agent picks it up: `gh issue comment <N> --body "🔨 Started work on this."` | |
| 5. Continue refining the spec through brainstorming and Q&A with the human. Write the full issue description and present it to the human for approval using the template below. | |
| 6. Once the spec is approved, **update the issue body** with the full description (replacing the initial short goal): `gh issue edit <N> --body "<full description>"`. | |
| ### Issue description template | |
| ~~~markdown | |
| ## Goal | |
| What this task accomplishes in 1-2 sentences. | |
| ## DNA impact | |
| A checklist of specific DNA changes this issue introduces. Each item names | |
| the file and describes the exact change. These are labeled (e.g. D1, D2, ...) | |
| so steps can reference them. | |
| - [ ] D1: ARCHITECTURE.md — add X to file tree | |
| - [ ] D2: ARCHITECTURE.md — add X data model schema | |
| - [ ] D3: DECISIONS.md — add "X" under Data section | |
| - ... | |
| Write "None" if the task doesn't change any structural facts. | |
| ## Steps | |
| Numbered, ordered list of concrete implementation steps. | |
| Each step names the file(s) it touches, and references which DNA items | |
| (from the checklist above) must be applied before that step. | |
| 1. Do X — touches `app/src/lib/server/foo.ts` [requires D1, D2] | |
| 2. Do Y — touches `app/src/routes/bar/+server.ts` [no DNA] | |
| 3. ... | |
| ~~~ | |
| Write the plan so thoroughly that another agent of lower intelligence could implement it without asking additional questions or making judgement calls. | |
| ## Implementing an issue | |
| Unless the human specifies otherwise, implementation is handed off to a **subagent** running in a worktree (`Agent` tool with `isolation: "worktree"`). The flow: | |
| 1. Confirm the issue is claimed — a `🔨 Started work on this.` comment should already exist from creation. If you're picking up an issue you didn't create, check `gh issue view <N> --comments` for an existing claim first, and skip it if another agent has already claimed it. | |
| 2. Launch the subagent with a prompt that includes: the full issue description, relevant DNA context, and explicit instructions to create a branch, implement, commit, and open a PR via `gh pr create` with `Closes #<N>` in the PR body. `Closes #N` links the PR to the issue and auto-closes the issue when the PR merges. | |
| 3. The subagent works independently. It should only stop and surface to the human if something genuinely unexpected blocks progress (the bar is high — most things can be fixed after the fact). | |
| 4. When the subagent finishes and the PR is open, the issue is effectively **In Review** — the linked PR shows on it automatically. No manual status change is needed. | |
| 5. After the PR is merged, the issue **auto-closes** via `Closes #N`. Confirm it closed (`gh issue view <N>`); if the PR used `Refs #N` instead of `Closes`, close it manually with `gh issue close <N>`. Don't leave merged work with an open issue. | |
| 6. **Clean up the worktree.** Run `git worktree list` and remove any worktrees created for the issue (`git worktree remove <path>`). Don't leave stale worktrees behind. | |
| 7. **Verify deployed changes.** After the PR is merged and deployed, actively verify that the changes work in production. Don't just log untested items — test them yourself: | |
| - For API endpoints and webhooks: use `curl` against `https://app.lawcel.com` to confirm responses. | |
| - For database changes: SSH into the VPS and query the production database to confirm migrations applied correctly. | |
| - For UI changes: use `curl` to fetch the relevant pages and verify the HTML contains expected elements, or hit the underlying API endpoints. | |
| - For integrations: where feasible, trigger a test event and confirm it flows through correctly. | |
| If a check cannot be run pre-merge because it needs live prod state (webhook arriving, real LLM call, Stripe event, etc.), add an entry to `AGENTS/POST_MERGE_VERIFICATION.md` with a specific trigger, exact commands, success criteria, and failure-diagnosis notes. Genuinely human-only UI visual judgement — which is rare — goes in `AGENTS/HUMAN_TODO.md`, not POST_MERGE_VERIFICATION. The bar for human-only items is high; most things can be verified programmatically by the agent post-deploy. | |
| ## Executing steps within an issue | |
| For each step in the issue spec: | |
| 1. Check if the step references any DNA items (e.g. `[requires D1, D2]`). | |
| 2. If yes, apply those DNA changes first — edit the DNA files, check off the items in the issue. | |
| 3. Then implement the code for that step. | |
| DNA is always updated *before* the code that depends on it. This ensures any agent reading DNA at any point sees the current truth, even if another agent is mid-implementation on a different issue. | |
| </script> | |
| <script type="text/plain" data-file="kill-stage-server.sh"> | |
| #!/bin/bash | |
| # SessionEnd hook: intentionally a no-op. | |
| # | |
| # Staging is isolated per git worktree: each worktree serves on its own | |
| # deterministic port and tracks its server in its own PID file | |
| # (/tmp/lawcel-stage-<hash>.pid). See .claude/scripts/stage-server.sh. | |
| # | |
| # Because of that isolation, a leftover server is harmless — it occupies only | |
| # its own per-worktree port, and the next /stage in that worktree restarts just | |
| # that one (via `stage-server.sh prepare`). At most one server lingers per | |
| # worktree, so there is nothing to clean up here. | |
| # | |
| # We deliberately do NOT kill anything on session end: this hook fires for | |
| # whichever session is ending, and a blanket kill here is exactly what used to | |
| # let parallel sessions destroy each other's servers. | |
| exit 0 | |
| </script> | |
| <script type="text/plain" data-file="prettier-check.sh"> | |
| #!/bin/bash | |
| # PostToolUse hook: runs prettier --check on .svelte/.ts/.tsx files after Edit/Write | |
| f=$(jq -r '.tool_input.file_path') | |
| echo "$f" | grep -qE '\.(svelte|ts|tsx)$' || exit 0 | |
| cd "$(git rev-parse --show-toplevel)/app" && npx prettier --check "$f" 2>&1 | head -5 | |
| </script> | |
| <script type="text/plain" data-file="redeploy.md"> | |
| --- | |
| description: Disaster recovery — provision a fresh VPS and restore from backup | |
| --- | |
| # Redeploy from backup | |
| You are performing disaster recovery for Lawcel. The goal is to provision a fresh Hetzner VPS, restore the database from the most recent offsite backup, and get the production stack running. | |
| Read `AGENTS/DNA/DEVELOPMENT.md` (the "Production deployment" and "Deployment knowledge" sections) before starting. The deployment knowledge section contains hard-won operational details — follow them exactly. | |
| ## Phase 1 — Provision (automated) | |
| 1. `cd terraform` | |
| 2. If replacing a dead VPS, run `terraform state rm hcloud_server.lawcel` to clear the old resource. | |
| 3. Run `terraform apply` — this creates a new VPS with Docker pre-installed and a `deploy` user. | |
| 4. Note the `server_ip` from the Terraform output. | |
| 5. Wait for cloud-init to finish: poll with `ssh -o StrictHostKeyChecking=accept-new deploy@<ip> cloud-init status --wait` (timeout after 5 minutes). | |
| ## Phase 2 — User tasks (tell the user, then continue to Phase 3) | |
| Tell the user to do these in parallel while you continue with Phase 3: | |
| 1. **Update DNS**: Change the A record for `app.lawcel.com` to the new server IP. | |
| 2. **Update GitHub Actions secrets**: Set `VPS_HOST` to the new IP in the repo's Actions secrets. | |
| 3. **Add deploy key**: After you output the deploy key public key in Phase 3, add it as a deploy key to the `ulfaslak/lawcel` GitHub repo (Settings > Deploy keys, read-only). | |
| ## Phase 3 — Configure VPS (automated, runs while user does Phase 2) | |
| SSH into the new VPS as `deploy`: | |
| 1. **Generate GitHub deploy key**: | |
| ```bash | |
| ssh-keygen -t ed25519 -f ~/.ssh/github_deploy -N "" -C "lawcel-vps-deploy" | |
| ``` | |
| Output the public key (`~/.ssh/github_deploy.pub`) and tell the user to add it as a deploy key (Phase 2 step 3). | |
| 2. **Clone the repo** (after user confirms deploy key is added): | |
| ```bash | |
| GIT_SSH_COMMAND="ssh -i ~/.ssh/github_deploy" git clone git@github.com:ulfaslak/lawcel.git ~/lawcel | |
| ``` | |
| Then seed the blog content mirror from that clone. Both compose files bind-mount | |
| `../lawcel-content/content` into the app container, and Docker would otherwise create | |
| it root-owned and empty on first `up` (blog with no posts). Once the CI/CD key exists | |
| (step 5) the *Sync blog content* workflow keeps it current; until then, copy by hand: | |
| ```bash | |
| mkdir -p ~/lawcel-content/content | |
| rsync -rlp --delete --exclude '_drafts/' --exclude 'og-image-plain.*' ~/lawcel/content/ ~/lawcel-content/content/ | |
| ``` | |
| 3. **Set up GHCR auth**: Ask the user for a GitHub Personal Access Token with `read:packages` scope. Then: | |
| ```bash | |
| echo "<PAT>" | docker login ghcr.io -u ulfaslak --password-stdin | |
| ``` | |
| 4. **Upload `.env.production`**: Copy from the local backup at `~/lawcel-backups/.env.production` (the user should keep a copy there), or from the repo's `.env.production.example` and fill in values interactively. | |
| 5. **Generate CI/CD SSH key**: | |
| ```bash | |
| ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N "" -C "lawcel-cicd" | |
| cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keys | |
| ``` | |
| Output the **private key** (`~/.ssh/deploy_key`) content so the user can update the `VPS_SSH_KEY` GitHub Actions secret. | |
| ## Phase 4 — Restore database (automated) | |
| 1. Find the most recent `.dump` file in `~/lawcel-backups/` on the local machine. If none exist, ask the user. | |
| 2. Upload the backup to the VPS: | |
| ```bash | |
| scp -i ~/.ssh/lawcel_deploy <backup_file> deploy@<ip>:~/lawcel/backups/ | |
| ``` | |
| 3. Start only Postgres: | |
| ```bash | |
| cd ~/lawcel && docker compose -f docker-compose.prod.yml up -d postgres | |
| ``` | |
| 4. Wait for Postgres healthy, then restore: | |
| ```bash | |
| docker compose -f docker-compose.prod.yml exec -T postgres \ | |
| pg_restore -U lawcel -d lawcel --clean --if-exists --no-owner < backups/<backup_file> | |
| ``` | |
| ## Phase 5 — Start and verify (automated) | |
| 1. Pull and start the full stack: | |
| ```bash | |
| cd ~/lawcel | |
| docker compose -f docker-compose.prod.yml pull app | |
| docker compose -f docker-compose.prod.yml up -d | |
| ``` | |
| 2. Run migrations in case the backup predates recent schema changes: | |
| ```bash | |
| docker compose -f docker-compose.prod.yml exec app npx drizzle-kit migrate | |
| ``` | |
| 3. Health check — curl localhost:3000 from within the VPS (via the app container or directly). | |
| 4. SSL check — `curl -sI https://app.lawcel.com` (may fail if DNS hasn't propagated yet; that's okay, note it for the user). | |
| ## Phase 6 — Report | |
| Summarize: | |
| - New VPS IP | |
| - Whether DB restore succeeded | |
| - Whether the app is responding | |
| - Whether SSL is working (or pending DNS propagation) | |
| Remaining manual steps for the user: | |
| - If the domain changed: update OAuth redirect URLs for Google, GitHub App, and Linear (see DEVELOPMENT.md "OAuth redirect URLs" section). | |
| - Update `VPS_SSH_KEY` GitHub Actions secret with the CI/CD private key output from Phase 3. | |
| - Verify GitHub Actions CI/CD works by pushing a trivial commit. | |
| </script> | |
| <script type="text/plain" data-file="reset.md"> | |
| # Reset | |
| Run these steps: | |
| 1. `docker-compose down -v && docker-compose up -d` — destroy and recreate the Postgres container with a clean volume | |
| 2. `cd app && pnpm migrate:sync` — apply all migrations and populate the journal in one pass (handles partial-journal states too) | |
| 3. Confirm success: `docker exec lawcel-postgres-1 psql -U postgres -d app -c "\dt"` — should show all expected tables. | |
| Report the result briefly. | |
| </script> | |
| <script type="text/plain" data-file="review.md"> | |
| # Review | |
| Self-review of work done in the current session. | |
| ## Steps | |
| ### 1. Enumerate changes | |
| List every file changed in the current working branch (compared to `origin/main`). For each file, write a one-line summary of what changed and why. | |
| ### 2. Correctness review | |
| Re-read each changed file in full. For each one, check: | |
| - **Logic errors**: off-by-ones, wrong conditions, missing early returns, race conditions. | |
| - **Regressions**: did the change break an existing behavior or contract? Check callers of any function whose signature or semantics changed. | |
| - **Consistency**: does the change follow the patterns established by neighboring code? If it introduces a new pattern, is there a good reason? | |
| - **Security**: no injection vectors, no secrets in code, no unvalidated external input passed to sensitive operations. | |
| Flag anything found. Fix it if straightforward; otherwise present it to the human. | |
| ### 3. Edge cases and failure modes | |
| For each changed component, think through: | |
| - What happens when inputs are empty, null, or unexpectedly large? | |
| - What happens when external calls (DB, API, network) fail? | |
| - What happens on concurrent access or rapid user interaction? | |
| - What state is left behind after a partial failure? | |
| - Will this behave correctly after a page reload, navigation, or session expiry? | |
| List any edge cases that are not handled. For each, assess severity (will it crash? corrupt data? just look wrong?) and recommend whether to fix now or defer. | |
| ### 4. Test coverage | |
| Consult the **Testing ideology** section in `AGENTS/DNA/DEVELOPMENT.md`, then assess: | |
| - Are there existing tests that cover the changed behavior? If you haven't already, run them and confirm they pass. | |
| - Does the change introduce new logic that warrants a test? Apply the testing ideology in `AGENTS/DNA/DEVELOPMENT.md`. | |
| If new tests are needed, write them. If coverage is sufficient, state why. | |
| ### 5. Summary | |
| Present a concise summary of your findings, and as applicable state your plan for fixing any issues found.</script> | |
| <script type="text/plain" data-file="screen.md"> | |
| # Screen | |
| A focused search for **one specific failure mode** across the codebase, followed by a prioritized report and (on approval) GitHub issues + DNA updates. | |
| A screen is different from a [[cleanse]]: | |
| - `/cleanse` checks DNA-to-code consistency. Scope is the DNA. Outcome is a coherent spec. | |
| - `/screen` checks a single suspected failure pattern against the whole codebase. Scope is the code. Outcome is a ranked list of concrete findings, each actionable as a ticket. | |
| Use `/screen` when you suspect a class of problem is present but haven't seen it enumerated. The user names the failure mode (or picks from the menu); this skill enumerates everywhere it shows up, ranks by impact, and feeds the result back as tickets. | |
| ## Invocation | |
| `/screen <failure-mode>` — runs the screen directly. | |
| `/screen` alone — present the menu below, ask the user to pick one, then run. The user may also describe a mode freeform ("find places where we construct dates without timezone awareness"). | |
| ## The menu | |
| Each entry is a failure *pattern* — not a specific bug, but a shape of mistake that recurs in codebases and misleads an agent that only has the code to go on. Pick the one most relevant to current concerns. | |
| 1. **Many ways to do one thing** — N patterns for the same job (the auth lookup, the error shape, date construction, logging) and nothing says which is canonical. The agent picks one at random or invents another, and the spread grows. Fix: decide, refactor the stragglers, write the rule down. Mild form: one dominant pattern with a few exceptions and no rule saying so. | |
| 2. **Copies that have drifted** — duplicated logic whose copies now disagree, so a fix lands in one and the others keep the bug. The agent has no reason to look for the siblings. Fix: one implementation, or a test that pins the copies equal. | |
| 3. **Invariants enforced by memory** — a rule every call site must remember: the tenant filter, the soft-delete filter, the transaction wrapper, the validator at a write boundary, the permission check. Forgotten once, copied forever, because the agent learns the pattern from the nearest example. Fix: a helper, type, or middleware that makes forgetting impossible. | |
| 4. **Facts that must change together** — the same fact in several places with nothing linking them: a roster in three files, an enum mirrored in the DB and the UI, a key string shared by a producer and a consumer, a UI check and its server-side twin. The agent updates the one it found. Fix: one source and derive the rest, or a test that fails when they diverge. | |
| 5. **Names and docs that lie** — identifiers, comments, docs, and context files that no longer match behaviour. The agent believes them, because it has nothing else. Fix: rename or delete; never leave a lie standing. | |
| 6. **One word, two meanings** — overloaded vocabulary (a "case" that is a DB row here and a legal matter there), so grep returns the wrong thing and the agent reasons about the wrong concept. Fix: a glossary, and rename the minority meaning. | |
| 7. **Failures that don't fail** — swallowed errors, defaults that mask missing data, fallbacks that hide breakage. The system proceeds with bad state and "tests green" stops being evidence. Fix: fail loudly at the boundary. | |
| 8. **Tests that can't fail** — tautological mocks, assertions on the mock itself, skipped tests, snapshots of bugs. They lend false confidence to every change the agent makes. Fix: delete them or make them bite. | |
| 9. **Code that looks alive** — dead exports, always-on feature flags, abandoned migrations, the unused one of two implementations. The agent copies the corpse as if it were the pattern. Fix: delete. | |
| 10. **Blast radius without a guard** — scripts and entry points that can hurt production, shared resources, or other sessions with no dry-run, confirmation, or scope check. An agent will run them at speed. Fix: guard, dry-run flag, allowlist. | |
| 11. **Freeform** — user describes the shape. Treat their description as the screening criterion and proceed. | |
| ## Procedure | |
| ### 1. Scope & calibration | |
| Before searching: | |
| - Read the relevant DNA files (`ARCHITECTURE`, `DECISIONS`, plus whatever the failure mode touches — e.g. `DEVELOPMENT` for DB patterns, `UI_SPEC` for frontend drift). | |
| - Define **"ripe" criteria** for this specific screen. What counts as a finding worth fixing vs. a finding worth leaving? Be explicit — write it down in the report. Example: "a duplicated handler is ripe if the copies have already drifted; a 3-line boilerplate repeated twice is not." | |
| - Define what the screen deliberately **won't** find (out-of-scope). Keeps the report focused. | |
| ### 2. Screen | |
| Enumerate every instance of the failure pattern. For this phase: | |
| - Use Grep liberally. Check both obvious and adjacent filenames (a "webhook handler" drift might also show up in the retry or debounce path). | |
| - For each hit, open the file and verify — is this really the pattern, or is it a false positive? Record file paths and line numbers so the human can follow. | |
| - Consider the history: is the pattern shrinking, stable, or growing? (Check `git log` briefly if a trend would change prioritization.) | |
| **Research only.** Do not edit code during the screen itself. Edits belong in follow-up PRs against the tickets the screen produces. | |
| ### 3. Prioritize | |
| Rank findings into three buckets: | |
| - **Ripe** — meets the ripe criteria; worth a ticket. Explain why. | |
| - **Noted** — matches the pattern but below the bar (too small, too isolated, or acceptable given context). Mention briefly so the human can challenge the judgment. | |
| - **Out of scope** — matches by shape but is intentional / different domain. Name them so the human knows you looked. | |
| Ordering within ripe: correctness > safety > agent-readability > size. A small bug beats a big stylistic cleanup. | |
| ### 4. Report | |
| Produce a single markdown report with: | |
| - **TL;DR** — one paragraph. Number of ripe findings, headline concern. | |
| - **Calibration** — the ripe criteria you used (from step 1). | |
| - **Findings** — one section per ripe item. Include: name, what/where (with paths and line numbers), why it's ripe, suggested fix or design sketch, estimated blast radius. | |
| - **Noted / out of scope** — a short list with one line each. | |
| - **What's already great** — brief. If relevant patterns are already well-factored, say so. Balance matters — agents on the next screen read this. | |
| - **Suggested order** — a proposed sequence if the human acts on multiple items. Flag dependencies between them. | |
| ### 5. Offer follow-up | |
| Ask the human: | |
| - Create GitHub issues? If yes, file one per ripe finding (`gh issue create`). Follow the project's issue conventions in `CLAUDE.md` — describe the scope, include implementation notes flagged as advisory (these are refactor issues; notes are part of the scope), cross-reference related issues in the batch. | |
| - DNA updates? If any finding codifies a rule that's already de facto true (e.g. "always go through the org-resolving helper"), propose the one-line DNA addition and apply it on approval. Do **not** pre-bake aspirational rules that describe the post-refactor state — those belong in the ticket's acceptance criteria, not DNA. | |
| - Anything to add to [[DEFERRED]]? A noted-but-not-ripe item sometimes deserves a trigger-based entry if the cost of re-discovering it later is high. | |
| ## Ticket writing from findings | |
| Refactor tickets look different from feature tickets. They're almost entirely implementation detail, and that's fine — flag implementation notes as **advisory**, per `CLAUDE.md`'s ticket-content rule. Things to include: | |
| - A **Summary** that states the structural problem, not just the symptom. | |
| - **Scope** — what's being touched, listed concretely (files, line numbers). | |
| - **Design sketch (advisory)** — the shape of the refactor. Make clear it's one plausible design, not a mandate. | |
| - **Acceptance criteria** — concrete, checkable. Include both behavior (tests pass) and structure (file X drops below N lines, pattern Y consolidates to one site). | |
| - **Implementation notes** — gotchas, invariants that must survive, things that look wrong but are intentional. Quote other tickets, DNA, or AGENT_MISTAKES entries where they provide context. | |
| - **Out of scope** — what *not* to change. Especially important when the refactor could tempt an agent into an adjacent area. | |
| Cross-reference issues inline when they share state (e.g. `#N may obsolete file Y — if that ships first, skip step Z`). Easier to rebase than to rediscover. | |
| ## When not to screen | |
| - If you haven't seen the pattern yet — do targeted debugging or a `/cleanse` first. `/screen` is for suspected *shapes*, not specific bugs. | |
| - If the scope is a single file — just read it and fix what you find. | |
| - If the human only wants a quick check — offer that instead; `/screen` is token-heavy by design. | |
| ## Output | |
| Present the report inline, then ask the follow-up question (step 5). Don't silently create tickets or edit DNA without approval — these touch shared state. | |
| </script> | |
| <script type="text/plain" data-file="ship.md"> | |
| # Ship Skill | |
| 1. **Stop this worktree's stage server** (unless the user says otherwise). Run `.claude/scripts/stage-server.sh stop` from the worktree root — this kills **only the server this worktree started** (tracked in its own per-worktree PID file) and never touches another concurrent session's server. | |
| 2. Create a GitHub issue with title and description from the current branch changes (`gh issue create`), then claim it: `gh issue comment <N> --body "🔨 Started work on this."` | |
| 3. Create a PR with `Closes #<N>` in the body so merging auto-closes the issue. | |
| 4. Wait for CI, then merge the PR. **Note:** the GitHub “checks” summary on the PR branch may be empty; after merge, the **Deploy** workflow run on `main` is the authoritative gate for build/deploy (unless `[skip deploy]`). | |
| 5. After merge, wait for the GitHub Action to deploy. If the change includes new or altered migration files (`app/drizzle/*.sql`), run migrations on production: `ssh -i ~/.ssh/lawcel_deploy deploy@<vps-ip> "cd ~/lawcel && docker compose -f docker-compose.prod.yml exec -T app npx drizzle-kit migrate"`. If drizzle-kit fails, apply the SQL directly via psql. | |
| 6. Verify the deployment works — hit relevant endpoints with `curl` against `https://app.lawcel.com`, check logs with `docker compose -f docker-compose.prod.yml logs --tail=20 app`, and for DB changes confirm tables/columns exist. | |
| 7. Check AGENTS/POST_MERGE_VERIFICATION.md for entries this PR authored. For each, if the trigger condition is satisfied now, run the Steps and clear the entry (or fix forward on failure). If not yet triggered, leave it — future sessions in this area will pick it up. Briefly tell the human which entries you ran, which you deferred, and why. | |
| </script> | |
| <script type="text/plain" data-file="spec-template-README.md"> | |
| # Design mock workflow | |
| When the human asks for a **mock / mockup** — a standalone HTML preview of a design *before* it's implemented — follow this workflow. Don't hand-roll the app chrome from scratch each time, and don't ship a mock you haven't looked at. | |
| Mocks live at `AGENTS/SPECS/<feature-slug>/<feature-slug>.html` — the file is **named after its directory slug**, not `mock.html`, so it's self-explanatory when sent to someone as a standalone file. They are the visual source-of-truth a future agent implements from, until the feature ships — after which the shipped components take over that role (the case-timeline mock referenced by [[ARCHITECTURE]]/[[DECISIONS]] retired this way). | |
| ## Steps | |
| 1. **Copy the template, then name the mock after the slug.** `cp -r AGENTS/SPECS/_TEMPLATE AGENTS/SPECS/<feature-slug>` then `mv AGENTS/SPECS/<feature-slug>/_TEMPLATE.html AGENTS/SPECS/<feature-slug>/<feature-slug>.html`. The HTML filename must equal the directory slug — `<feature-slug>/<feature-slug>.html`, never `mock.html` — so the file stands on its own when shared. The template ships the real Lawcel chrome (sidebar, top bar, content grid), the full `layout.css` token set, ready-styled components (badges, buttons, tabs, info-rail, card, patch-box, **modal**, **toast**), a dev-control bar, and the **Design-notes drawer**. | |
| 2. **Match real fidelity.** Open the actual route/components you're mocking (e.g. `app/src/routes/(dashboard)/…`, `app/src/lib/components/…`) and read [[UI_SPEC]] + [[DESIGN]]. Get fonts (DM Sans body, Playfair titles), colours (the dusted status-colour scale), **sharp corners** (radius 0 except pills/avatars/dots/progress bars), and spacing right. Pull real copy and real data shapes, not lorem. If you're mocking a specific screen the human screenshotted, rebuild *that* screen first so it's recognisable. | |
| 3. **Offer variants when the design is undecided.** Use the dev-control segmented toggle to A/B options in-browser (e.g. modal vs toast) so the human can pick by looking. Keep it obviously a mock-only control. | |
| 4. **Fill in the Design notes drawer — this is the deliverable, not decoration.** The mock's pixels show *what it looks like*; the Design notes capture *everything else the implementer needs* so no detail the human asked for is lost between mock and merged code. Overwrite every placeholder. Cover: | |
| - **Intent** — the problem + goal, in the human's words. | |
| - **States to build** — every status/role/phase/empty/error state, not just the happy path. | |
| - **Interactions** — what each action does, navigation, animation/timing, focus & keyboard. | |
| - **Copy** — exact strings. | |
| - **Components to reuse** — the real app components/routes to build on. | |
| - **Data** — where each value comes from (server `load`, fields, derived counts). | |
| - **Out of scope** — what not to build. | |
| - **Open questions** — anything still undecided for the human. | |
| If the human gave you detail (behaviours, edge cases, copy, "it should also do X"), it belongs here verbatim — that's the point. | |
| 5. **Render and verify before sharing.** Open the file and screenshot it — never present a mock you haven't seen. | |
| - Preferred: Playwright MCP (`browser_navigate` to the `file://` path → `browser_take_screenshot`). | |
| - If the shared MCP browser is locked (`"Browser is already in use … use --isolated"`): drive an **isolated** browser from a scratchpad script — `npm i playwright-core`, launch with the cached chromium at `~/Library/Caches/ms-playwright/chromium-<NNNN>/…/Google Chrome for Testing`, `page.goto('file://…')`, `page.screenshot()`, then Read the PNG. | |
| - Quick look: `open AGENTS/SPECS/<feature-slug>/<feature-slug>.html`. | |
| Compare against the real UI. Then hand it to the human as a clickable markdown link — filename as the text, `file://` + the absolute path to where the file actually is (the worktree, if that's where it lives) as the URL: `[<feature-slug>.html](file:///Users/…/lawcel-worktrees/<branch>/AGENTS/SPECS/<feature-slug>/<feature-slug>.html)`. Never a bare path they have to copy. Iterate with the human until they're happy. | |
| 6. **The mock is the spec.** When the ticket is picked up, the implementing agent reads `<feature-slug>.html` (visual) **and** the Design notes (intent + all the details) and builds from both. A good mock makes the implementation a transcription job. | |
| ## Fidelity checklist | |
| - [ ] Fonts loaded (DM Sans + Playfair) and applied — titles are Playfair. | |
| - [ ] Sharp corners everywhere; only pills/avatars/status dots/progress bars are round. | |
| - [ ] Colours from the token set (no arbitrary hexes); status colours from the dusted status scale. | |
| - [ ] Sidebar active item matches the page; top bar present. | |
| - [ ] Real copy and realistic data — no lorem, no placeholder numbers where real ones matter. | |
| - [ ] Every relevant state represented or noted (empty/error/role/status), not just the happy path. | |
| - [ ] Design notes drawer fully filled in. | |
| - [ ] Rendered and screenshotted; looks like the real app. | |
| ## Notes | |
| - Mocks are **standalone HTML** — Google Fonts + Phosphor icons via CDN are fine for a local file. No Tailwind; use the hand-rolled CSS classes / tokens in the template. | |
| - Keep `_TEMPLATE/` generic. Improvements to the shared chrome/components/tokens go **here**; feature-specific content goes in the copy. | |
| - Don't edit `_TEMPLATE/` from inside a feature mock. If you find the token set or a component drifting from `app/src/routes/layout.css`, fix the template in the same spirit as the DNA "don't let it drift" rule. | |
| </script> | |
| <script type="text/plain" data-file="stage.md"> | |
| # Stage Skill | |
| Serve the app locally from the current worktree with a production database snapshot, optionally signing in as a user via the passwordless dev-login. | |
| ## Usage | |
| `/stage` — default: restore prod DB, sign in as <your-email>, auto-assigned port | |
| `/stage for <email>` — sign in as a different user | |
| `/stage but don't sign in` — skip auto sign-in (e.g. to test the login flow yourself) | |
| `/stage port 5174` — force a specific port (overrides the auto-assigned one) | |
| `/stage for <email>, port 5174, don't sign in` — combine options | |
| Parse `$ARGUMENTS` naturally. Defaults: user=<your-email>, signin=true. The port is **auto-assigned per worktree** (see step 1) unless you pass an explicit `port N` — every worktree gets its own stable port, so concurrent sessions in different worktrees never collide. | |
| ## Steps | |
| 1. **Claim this worktree's server slot.** Each git worktree gets its own deterministic port and PID file, so concurrent sessions in different worktrees never collide. From the worktree root, run: | |
| ```bash | |
| .claude/scripts/stage-server.sh prepare | |
| ``` | |
| This stops **only this worktree's own** previously-started server (if any), then prints three values — note them and substitute them literally in the steps below: | |
| - `PORT` — the port to serve on (this worktree's stable port, or the next free one if a foreign process holds it). **If the user passed an explicit `port N`, use that instead.** | |
| - `PID_FILE` — where to record this server's PID (step 6). | |
| - `ROOT` — this worktree's root path. | |
| 🚨 **Never run `pkill`, kill by process name, or otherwise touch a server you didn't start.** Other sessions may be staging in other worktrees on other ports. `prepare`/`stop` only ever act on the current worktree's own PID file — that is the whole point. The same rule applies to **Playwright MCP** processes (managed by pi for browser testing) — never kill those either. | |
| 2. **Determine the working directory.** If the current session is in a git worktree, use that worktree's paths. Otherwise use the main repo. All `app/` commands run from the worktree's `app/` directory. | |
| 3. **Ensure `.env` exists and resolves correctly.** | |
| - If working in a worktree: | |
| - Check that `<worktree-root>/.env` exists. If not, copy it from the main repo (`<main-repo-root>/.env`). | |
| - Vite/dotenv loads `.env` from the project root by default. When running from a worktree, the worktree's `.env` takes precedence. If the worktree `.env` is a stale copy (missing vars added later), the dev server may fail with missing env var errors or connection refused. | |
| - **Fix:** Always copy the latest `.env` from the main repo to the worktree before starting the dev server: | |
| ```bash | |
| cp <main-repo-root>/.env <worktree-root>/.env | |
| ``` | |
| - If in the main repo, `.env` is already in place — proceed. | |
| 4. **Restore the production backup into the local dev database.** The local `app` DB is ephemeral — do not ask for confirmation. | |
| - Ensure the local Postgres container is running: `docker-compose up -d postgres` (from the repo root). | |
| - Find the latest `.dump` file: `ls -t ~/lawcel-backups/*.dump | head -1` | |
| - Terminate existing connections, then drop and recreate the local `app` database: | |
| ``` | |
| docker-compose exec -T postgres psql -U postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'app' AND pid <> pg_backend_pid();" | |
| docker-compose exec -T postgres psql -U postgres -c "DROP DATABASE IF EXISTS app;" | |
| docker-compose exec -T postgres psql -U postgres -c "CREATE DATABASE app;" | |
| ``` | |
| - Restore the backup: | |
| ``` | |
| docker cp ~/lawcel-backups/LATEST_DUMP_FILENAME $(docker-compose ps -q postgres):/tmp/restore.dump | |
| docker-compose exec -T postgres pg_restore --no-owner --no-privileges -U postgres -d app /tmp/restore.dump | |
| ``` | |
| 5. **Catch up missing migrations.** The prod backup may be older than `main`'s migrations, so any new files on disk need to be applied — and the journal needs to reflect both pre-existing and newly-applied state. From the `app/` directory: | |
| ```bash | |
| DATABASE_URL=postgresql://postgres:postgres@localhost:5432/app pnpm migrate:sync | |
| ``` | |
| This script: (a) reads the journal already in the backup, (b) for each migration file not yet journaled, runs each statement and swallows only "already in desired state" errors (duplicate_table, duplicate_column, undefined_object on DROPs, etc.), and (c) inserts the hash on success. Safe to re-run; idempotent when in sync. | |
| 6. **Start the dev server.** From the `app/` directory, using the `PORT` from step 1 (or the user's explicit port): | |
| ``` | |
| pnpm dev --port <PORT> | |
| ``` | |
| Run this in the background. **Wait for the "Local:" URL line to appear in the output** and parse the actual port from it — vite may still bump if the port was taken in a race. Then record this server against its worktree slot so `/ship` and future `/stage` runs can find exactly this server (substitute `PID_FILE` and `ROOT` from step 1 and the real PID + actual port): | |
| ```bash | |
| .claude/scripts/stage-server.sh record "<PID_FILE>" <pid> <actual-port> "<ROOT>" | |
| ``` | |
| Use the **actual port** from the output for all subsequent steps (sign-in, browser navigation). | |
| 7. **Ensure Playwright MCP is connected.** Before using any browser tools (`playwright_browser_*`), ensure the Playwright MCP server is connected by calling: | |
| ``` | |
| mcp connect playwright | |
| ``` | |
| This triggers a lazy reconnect if the MCP server was killed by a previous cleanup. The `--isolated` flag in `~/.pi/agent/mcp.json` prevents lock conflicts between multiple pi sessions — each gets its own in-memory browser profile. | |
| - **Do NOT kill `@playwright/mcp` processes** — they belong to pi sessions and will auto-reconnect via stdin pipe. | |
| - If browser tools return "Not connected", call `mcp connect playwright` first, then retry. | |
| 8. **Sign in (unless skipped).** Use the passwordless **dev-login** form — no impersonation URL or password needed. Dev-login is on under `vite dev` because the committed `.env.development` sets `AUTH_DEV_LOGIN=1` (gate: `(dev || shadowMode) && AUTH_DEV_LOGIN === '1'`, see `app/src/lib/server/dev-login.ts`). If sign-in is enabled: | |
| - Confirm the user exists in the **local** database — dev-login would otherwise create a fresh empty user, and for staging you want a real user from the restored prod DB: | |
| ```bash | |
| docker-compose exec -T postgres psql -U postgres -d app -t -A -c "SELECT id, name, email FROM \"user\" WHERE email = '<email>'" | |
| ``` | |
| If the user is not found, show an error and stop. | |
| - In the Playwright browser, navigate to `http://localhost:<actual-port>/login`. | |
| - Under **Developer sign-in**, fill the email field (`#login-email-dev`) with `<email>` and click **Sign in (dev)**. This mints a real session and redirects to `/` — you're now signed in as that user. | |
| - For the human: same flow — open `http://localhost:<actual-port>/login`, enter the email under "Developer sign-in", click "Sign in (dev)". No password. | |
| 9. **If sign-in is skipped**, just open `http://localhost:<actual-port>/login` so the real auth flow can be exercised. | |
| 10. If any step fails, show the error output and stop. Do not leave a half-started server — clean up the PID file if the server didn't start. | |
| ## Notes | |
| - Each worktree's server is tracked in its own PID file (`/tmp/lawcel-stage-<hash>.pid`, keyed by the worktree root path) via `.claude/scripts/stage-server.sh`. There is no shared global PID file — that isolation is what lets concurrent sessions coexist. | |
| - The `SessionEnd` hook (`.claude/hooks/kill-stage-server.sh`) is intentionally a **no-op**: a leftover server is harmless because it occupies only its own per-worktree port, and the next `/stage` in that worktree restarts just that one. At most one server lingers per worktree. | |
| - `/ship` stops **only the current worktree's** server as its first step (via `stage-server.sh stop`). | |
| - Re-running `/stage` in a worktree restarts that worktree's own server and never touches any other session's. | |
| </script> | |
| <script> | |
| /* ===================================================================== | |
| DECK ENGINE | |
| Sections (grep for "== "): | |
| == collect build the flat slide list; wrap list items for grid layout | |
| == navigate go(i), next/prev with fragments, hash routing | |
| == chrome silent progress: chapter · section label, n/N, hairline, harness label | |
| == toc build + sync the contents panel | |
| == notes narration modal | |
| == files click-to-open modal for embedded files ([data-file]) | |
| == harness "c" toggles Claude-specific names/paths to vendor-neutral ones | |
| == keys keyboard map | |
| == widgets interactive widgets, keyed by [data-widget] | |
| agent-loop · context-fill · compaction · chat-replay · tool-belt · approval-fatigue | |
| subagent-sim · rediscovery · pattern-entropy · file-tree · worktrees | |
| == boot | |
| ===================================================================== */ | |
| (() => { | |
| const $ = (s, r = document) => r.querySelector(s); | |
| const $$ = (s, r = document) => Array.from(r.querySelectorAll(s)); | |
| const S = { i: -1, slides: [], seen: new Set(), harness: 'claude' }; | |
| const store = { | |
| get(k, d) { try { const v = localStorage.getItem('deck:' + k); return v === null ? d : JSON.parse(v); } catch { return d; } }, | |
| set(k, v) { try { localStorage.setItem('deck:' + k, JSON.stringify(v)); } catch {} } | |
| }; | |
| const h = (tag, cls, html) => { const el = document.createElement(tag); if (cls) el.className = cls; if (html !== undefined) el.innerHTML = html; return el; }; | |
| const esc = s => String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); | |
| const fmtK = n => n >= 1000 ? (n / 1000).toFixed(n >= 10000 ? 0 : 1) + 'k' : String(n); | |
| const sleep = ms => S.instant ? Promise.resolve() : new Promise(r => setTimeout(r, ms)); // S.instant: replay without waiting (stepper back) | |
| /* == collect ======================================================= */ | |
| function wrapListItems(root) { | |
| $$('.big-list > li, .check > li, .num-list > li', root).forEach(li => { | |
| if (li.querySelector(':scope > .t')) return; | |
| const t = h('span', 't'); | |
| const d = li.querySelector(':scope > .d'); | |
| Array.from(li.childNodes).forEach(n => { if (n !== d) t.appendChild(n); }); | |
| li.insertBefore(t, li.firstChild); | |
| }); | |
| } | |
| function collect() { | |
| let idx = 0; | |
| $$('.chapter').forEach((ch, ci) => { | |
| const chapter = { el: ch, num: ch.dataset.num || String(ci + 1), title: ch.dataset.title || `Chapter ${ci + 1}`, when: ch.dataset.when || '', sections: [] }; | |
| $$('.sec', ch).forEach(sec => { | |
| const section = { el: sec, title: sec.dataset.title || '', min: sec.dataset.min || '', slides: [], chapter }; | |
| $$('.slide', sec).forEach(sl => { | |
| wrapListItems(sl); | |
| const hd = sl.querySelector('h1, h2'); | |
| const slide = { | |
| el: sl, id: sl.id, index: idx++, chapter, section, | |
| title: sl.dataset.title || (hd ? hd.textContent.trim().replace(/\s+/g, ' ') : sl.id), | |
| frags: $$('.frag', sl).map(f => { f.dataset.init = f.classList.contains('on') ? '1' : ''; return f; }), | |
| notes: sl.querySelector('.notes') | |
| }; | |
| section.slides.push(slide); S.slides.push(slide); | |
| }); | |
| chapter.sections.push(section); | |
| }); | |
| (S.chapters ||= []).push(chapter); | |
| }); | |
| } | |
| /* == navigate ====================================================== */ | |
| function indexFromHash() { | |
| const id = decodeURIComponent(location.hash.replace(/^#/, '')); | |
| if (!id) return 0; | |
| const k = S.slides.findIndex(s => s.id === id); | |
| return k >= 0 ? k : 0; | |
| } | |
| function go(i, { fragsAll = false, pushHash = true } = {}) { | |
| i = Math.max(0, Math.min(S.slides.length - 1, i)); | |
| if (i === S.i) return; | |
| const prev = S.slides[S.i]; | |
| if (prev) prev.el.classList.remove('active'); | |
| S.i = i; | |
| const cur = S.slides[i]; | |
| cur.el.classList.add('active'); | |
| cur.frags.forEach(f => f.classList.toggle('on', fragsAll || f.dataset.init === '1')); | |
| S.seen.add(cur.id); | |
| initWidgets(cur.el); | |
| if (pushHash && location.hash !== '#' + cur.id) history.replaceState(null, '', '#' + cur.id); | |
| updateChrome(); syncToc(); | |
| if (!$('#notes').hidden) renderNotes(); | |
| } | |
| function next() { | |
| const cur = S.slides[S.i]; | |
| const pending = cur.frags.find(f => !f.classList.contains('on')); | |
| if (pending) { pending.classList.add('on'); return; } | |
| go(S.i + 1); | |
| } | |
| function prev() { | |
| const cur = S.slides[S.i]; | |
| const shown = cur.frags.filter(f => f.classList.contains('on') && f.dataset.init !== '1'); | |
| if (shown.length) { shown[shown.length - 1].classList.remove('on'); return; } | |
| go(S.i - 1, { fragsAll: true }); | |
| } | |
| /* == chrome ======================================================== */ | |
| function updateChrome() { | |
| const s = S.slides[S.i]; | |
| $('#chrome-top .chrome-chapter').textContent = `Ch ${s.chapter.num} · ${s.chapter.title}`; | |
| $('#chrome-top .chrome-section').textContent = s.section.title; | |
| $('#chrome-top .chrome-sep').style.display = s.section.title ? '' : 'none'; | |
| $('#chrome-count').textContent = `${S.i + 1} / ${S.slides.length}`; | |
| $('#chrome-bar .fill').style.width = ((S.i + 1) / S.slides.length * 100) + '%'; | |
| document.body.classList.toggle('on-title', s.el.classList.contains('title')); | |
| document.title = `${s.title} — Coding Agents & Context Engineering`; | |
| } | |
| /* == toc =========================================================== */ | |
| function buildToc() { | |
| const nav = $('#toc .toc-list'); | |
| nav.innerHTML = ''; | |
| S.chapters.forEach(ch => { | |
| const box = h('div', 'toc-ch'); | |
| const t = h('div', 'toc-ch-title', `<span class="toc-ch-num">${ch.num}</span><span>${ch.title}</span>`); | |
| t.onclick = () => go(ch.sections[0].slides[0].index); | |
| box.appendChild(t); | |
| if (ch.when) box.appendChild(h('span', 'toc-ch-when', ch.when)); | |
| ch.sections.forEach(sec => { | |
| const d = h('div', 'toc-sec'); sec.tocEl = d; | |
| d.innerHTML = `<div class="toc-sec-row"><span>${sec.title}</span><span class="min">${sec.min ? sec.min + ' min' : ''}</span></div>`; | |
| const dots = h('div', 'toc-dots'); | |
| sec.slides.forEach(sl => { | |
| const dot = h('span', 'toc-dot'); dot.title = sl.title; sl.dotEl = dot; | |
| dot.onclick = e => { e.stopPropagation(); go(sl.index); }; | |
| dots.appendChild(dot); | |
| }); | |
| const list = h('ul', 'toc-slides'); list.hidden = true; sec.listEl = list; | |
| sec.slides.forEach(sl => { | |
| const li = h('li', '', esc(sl.title)); sl.liEl = li; | |
| li.onclick = e => { e.stopPropagation(); go(sl.index); }; | |
| list.appendChild(li); | |
| }); | |
| d.appendChild(dots); d.appendChild(list); | |
| d.onclick = () => go(sec.slides[0].index); | |
| box.appendChild(d); | |
| }); | |
| nav.appendChild(box); | |
| }); | |
| $('#toc .toc-total').textContent = `${S.slides.length} slides`; | |
| } | |
| function syncToc() { | |
| const cur = S.slides[S.i]; | |
| S.chapters.forEach(ch => ch.sections.forEach(sec => { | |
| const on = sec === cur.section; | |
| sec.tocEl.classList.toggle('current', on); | |
| sec.listEl.hidden = !on; | |
| sec.slides.forEach(sl => { | |
| sl.dotEl.classList.toggle('current', sl === cur); | |
| sl.dotEl.classList.toggle('seen', S.seen.has(sl.id) && sl !== cur); | |
| sl.liEl.classList.toggle('current', sl === cur); | |
| }); | |
| })); | |
| if (document.body.classList.contains('toc-open')) cur.section.tocEl.scrollIntoView({ block: 'nearest' }); | |
| } | |
| function toggleToc(force) { | |
| const open = document.body.classList.toggle('toc-open', force); | |
| store.set('toc', open); | |
| if (open) syncToc(); | |
| } | |
| /* == notes ========================================================= */ | |
| function renderNotes() { | |
| const s = S.slides[S.i], nx = S.slides[S.i + 1]; | |
| $('#notes .notes-where').textContent = `Ch ${s.chapter.num} · ${s.section.title} · ${S.i + 1}/${S.slides.length}`; | |
| $('#notes .notes-title').textContent = s.title; | |
| $('#notes .notes-body').innerHTML = s.notes ? s.notes.innerHTML : '<p class="empty">No narration for this slide.</p>'; | |
| $('#notes .notes-body').scrollTop = 0; | |
| $('#notes .notes-next').textContent = nx ? `Next → ${nx.title}` : 'Last slide'; | |
| } | |
| function toggleNotes(force) { | |
| const el = $('#notes'); | |
| const show = force !== undefined ? force : el.hidden; | |
| if (show) { renderNotes(); el.hidden = false; } else el.hidden = true; | |
| } | |
| function toggleHelp(force) { const el = $('#help'); el.hidden = force !== undefined ? !force : !el.hidden; } | |
| function closeOverlays() { $$('.overlay').forEach(o => o.hidden = true); const lb = $('.lightbox'); if (lb) lb.hidden = true; } | |
| /* == lightbox: click a screenshot (.mockshot img) to see it full size; click or Escape closes */ | |
| function initLightbox() { | |
| const box = h('div', 'lightbox'); box.hidden = true; document.body.appendChild(box); | |
| document.addEventListener('click', e => { | |
| const img = e.target.closest('.mockshot img'); | |
| if (img) { box.innerHTML = `<img src="${img.src}" alt="${img.alt}">`; box.hidden = false; return; } | |
| if (!box.hidden) box.hidden = true; | |
| }); | |
| } | |
| /* == files ========================================================= */ | |
| function fileContent(key) { const s = document.querySelector(`script[type="text/plain"][data-file="${key}"]`); return s ? s.textContent.replace(/^\n/, '') : null; } | |
| function openFile(key, title) { | |
| const c = fileContent(key); if (c === null) return; | |
| $('#filemodal .file-title').textContent = title || key; | |
| $('#filemodal .file-body').textContent = translate(c); | |
| $('#filemodal .file-body').scrollTop = 0; | |
| $('#filemodal').hidden = false; | |
| } | |
| /* == harness ======================================================= */ | |
| // Ordered, longest first. Left: what the source says (Claude Code); right: the vendor-neutral / Codex spelling. | |
| const DICT = [ | |
| ['~/.claude/CLAUDE.md', '~/.codex/AGENTS.md'], | |
| ['~/.claude/skills/', '~/.agents/skills/'], | |
| ['.claude/skills/stage/SKILL.md', '.agents/skills/stage/SKILL.md'], | |
| ['.claude/commands/ship.md', '.agents/skills/ship/SKILL.md'], | |
| ['.claude/commands/cleanse.md', '.agents/skills/cleanse/SKILL.md'], | |
| ['.claude/commands/name.md', '.agents/skills/name/SKILL.md'], | |
| ['.claude/commands/<name>.md', '.agents/skills/<name>/SKILL.md'], | |
| ['.claude/commands/', '.agents/skills/'], | |
| ['.claude/skills/', '.agents/skills/'], | |
| ['.claude/agents/adversarial-reviewer.md', 'adversarial-reviewer.md (custom agent; location varies)'], | |
| ['.claude/agents/', 'agents/'], | |
| ['.claude/settings.json', 'harness settings (varies)'], | |
| ['.claude/hooks/', 'hooks/'], | |
| ['.claude/', '.agents/'], | |
| ['CLAUDE.md', 'AGENTS.md'], | |
| ]; | |
| function translate(text) { if (S.harness !== 'other') return text; let t = text; for (const [a, b] of DICT) t = t.split(a).join(b); return t; } | |
| const origText = new WeakMap(); | |
| function applyHarness(root = $('#deck'), notify = false) { | |
| // 1. hand-tuned spans | |
| $$('.cx', root).forEach(el => { | |
| if (el.dataset.orig === undefined) el.dataset.orig = el.textContent; | |
| el.textContent = S.harness === 'other' ? (el.dataset.alt || el.dataset.orig) : el.dataset.orig; | |
| }); | |
| // 2. dictionary over remaining text nodes | |
| const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { | |
| acceptNode: n => { const p = n.parentElement; if (!p || p.closest('.cx, [data-nocx], script, style, .notes')) return NodeFilter.FILTER_REJECT; return /\.claude|CLAUDE\.md/.test(origText.get(n) ?? n.nodeValue) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } | |
| }); | |
| const nodes = []; while (walker.nextNode()) nodes.push(walker.currentNode); | |
| nodes.forEach(n => { if (!origText.has(n)) origText.set(n, n.nodeValue); n.nodeValue = translate(origText.get(n)); }); | |
| document.body.classList.toggle('harness-other', S.harness === 'other'); | |
| $('#chrome-harness').textContent = S.harness === 'other' ? 'other harness' : 'claude code'; | |
| if (notify) document.dispatchEvent(new CustomEvent('harness-change')); | |
| } | |
| function toggleHarness() { S.harness = S.harness === 'other' ? 'claude' : 'other'; applyHarness(undefined, true); } | |
| /* == keys ========================================================== */ | |
| function onKey(e) { | |
| const t = e.target; | |
| if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.tagName === 'SELECT' || t.isContentEditable)) return; | |
| if (e.metaKey || e.ctrlKey || e.altKey) return; | |
| const k = e.key; | |
| if (k === 'Escape') { closeOverlays(); return; } | |
| if (k === 'ArrowRight' || k === ' ' || k === 'PageDown' || k === 'j' || k === 'l') { e.preventDefault(); next(); return; } | |
| if (k === 'ArrowLeft' || k === 'PageUp' || k === 'k' || k === 'h') { e.preventDefault(); prev(); return; } | |
| if (k === 'Home') { go(0); return; } | |
| if (k === 'End') { go(S.slides.length - 1); return; } | |
| if (k === 'n' || k === 'N') { toggleNotes(); return; } | |
| if (k === 't' || k === 'T') { toggleToc(); return; } | |
| if (k === 'c' || k === 'C') { toggleHarness(); return; } | |
| if (k === 's' || k === 'S') { widgetKey('step'); return; } | |
| if (k === 'r' || k === 'R') { widgetKey('reset'); return; } | |
| if (k === 'a' || k === 'A') { widgetKey('back'); return; } | |
| if (k === '?') { toggleHelp(); return; } | |
| if (k === 'f' || k === 'F') { document.fullscreenElement ? document.exitFullscreen() : document.documentElement.requestFullscreen?.(); return; } | |
| if (k === 'd' || k === 'D') { const dark = document.documentElement.dataset.theme !== 'dark'; document.documentElement.dataset.theme = dark ? 'dark' : 'light'; store.set('theme', dark ? 'dark' : 'light'); return; } | |
| } | |
| /* -- s / a / r: drive the widgets on the current slide from the keyboard. | |
| s presses "Step →" on the first unfinished stepper, else the widget's primary button; a presses Back; r presses Reset. */ | |
| function widgetKey(action) { | |
| const slide = S.slides[S.i]?.el; if (!slide) return; | |
| const ws = $$('[data-widget]', slide); if (!ws.length) return; | |
| let btn = null; | |
| if (action === 'step') { | |
| const w = ws.find(w => $('[data-a=step]', w) && !w.dataset.done) || ws.find(w => $('.wbtn.primary', w)); | |
| btn = w && ($('[data-a=step]', w) || $('.wbtn.primary', w)); | |
| } else { | |
| btn = ws.map(w => $(`[data-a=${action}]`, w)).find(Boolean); | |
| } | |
| if (btn) btn.click(); | |
| } | |
| /* == widgets ======================================================= */ | |
| const widgets = {}; | |
| function initWidgets(root) { | |
| $$('[data-widget]', root).forEach(el => { | |
| if (el.dataset.inited) return; | |
| el.dataset.inited = '1'; | |
| const fn = widgets[el.dataset.widget]; | |
| if (fn) fn(el); else el.innerHTML = `<p class="mute">unknown widget: ${el.dataset.widget}</p>`; | |
| applyHarness(el); | |
| }); | |
| } | |
| const readJson = el => { const s = el.querySelector('script[type="application/json"]'); return s ? JSON.parse(s.textContent) : null; }; | |
| const btns = arr => `<span class="row">${arr.map(([a, l, p]) => `<button class="wbtn small${p ? ' primary' : ''}" data-a="${a}">${l}</button>`).join('')}</span>`; | |
| const logRow = (who, cls, text, tok) => h('div', 'new', `<span class="who ${cls}">${esc(who)}</span><span class="tx">${esc(text)}</span>${tok !== undefined ? `<span class="tok">+${fmtK(tok)}</span>` : ''}`); | |
| /* -- a tiny "stepper" shared by the replay-style widgets */ | |
| function stepper(el, total, stepFn, resetFn) { | |
| let i = 0, timer = null, busy = false, queued = 0; | |
| const stop = () => { clearInterval(timer); timer = null; const b = $('[data-a=auto]', el); if (b) b.textContent = 'Auto'; }; | |
| const step = async () => { | |
| if (i >= total) { stop(); return; } | |
| if (busy) { queued++; return; } | |
| busy = true; await stepFn(i++); busy = false; | |
| if (i >= total) { stop(); queued = 0; el.dataset.done = '1'; el.dispatchEvent(new CustomEvent('done')); return; } | |
| if (queued > 0) { queued--; step(); } | |
| }; | |
| const back = async () => { // rebuild the state up to i-1: reset, then replay with the waits switched off | |
| if (busy || i === 0) return; | |
| stop(); const target = i - 1; i = 0; delete el.dataset.done; resetFn(); | |
| busy = true; S.instant = true; | |
| try { while (i < target) await stepFn(i++); } finally { S.instant = false; busy = false; queued = 0; } | |
| }; | |
| $('[data-a=step]', el)?.insertAdjacentHTML('beforebegin', '<button class="wbtn small" data-a="back">← Back</button>'); | |
| el.addEventListener('click', e => { | |
| const a = e.target.closest('[data-a]')?.dataset.a; if (!a) return; | |
| if (a === 'step') step(); | |
| if (a === 'back') back(); | |
| if (a === 'reset') { stop(); i = 0; queued = 0; delete el.dataset.done; resetFn(); } | |
| if (a === 'auto') { if (timer) stop(); else { timer = setInterval(step, 850); e.target.textContent = 'Stop'; step(); } } | |
| }); | |
| return { step, back, stop, get i() { return i; } }; | |
| } | |
| /* -- agent-loop: step through one turn; watch the transcript get re-sent, and the bills grow */ | |
| widgets['agent-loop'] = el => { | |
| el.classList.add('w-loop'); | |
| const steps = [ | |
| { node: 'you', who: 'you', cls: 'u', text: '"The invite-revoke test fails. Fix it."', tok: 14 }, | |
| { node: 'harness', who: 'harness', cls: 's', text: 'assembles: system prompt + tool schemas + CLAUDE.md + your message', tok: 18000 }, | |
| { node: 'model', call: true, who: 'assistant', cls: 'a', text: "I'll run the failing test first.", tok: 12 }, | |
| { node: 'tool', out: true, who: 'tool call', cls: 't', text: 'Bash("pnpm vitest run invite")', tok: 16 }, | |
| { node: 'result', who: 'tool result', cls: 't', text: '1 failed — expected 403, got 200 … (full output)', tok: 2100 }, | |
| { node: 'model', call: true, who: 'assistant', cls: 'a', text: 'The revoke action lacks a role guard. Let me see how other actions do it.', tok: 22 }, | |
| { node: 'tool', out: true, who: 'tool call', cls: 't', text: 'Read("app/src/lib/server/resolve-org.ts")', tok: 16 }, | |
| { node: 'result', who: 'tool result', cls: 't', text: '(file contents, 130 lines)', tok: 1400 }, | |
| { node: 'model', call: true, who: 'assistant', cls: 'a', text: 'Using resolveOrgWithRole and returning 403 for members.', tok: 20 }, | |
| { node: 'tool', out: true, who: 'tool call', cls: 't', text: 'Edit("routes/settings/team/+page.server.ts", …)', tok: 140 }, | |
| { node: 'result', who: 'tool result', cls: 't', text: 'ok', tok: 4 }, | |
| { node: 'model', call: true, who: 'assistant', cls: 'a', text: 'Re-running the test.', tok: 8 }, | |
| { node: 'tool', out: true, who: 'tool call', cls: 't', text: 'Bash("pnpm vitest run invite")', tok: 16 }, | |
| { node: 'result', who: 'tool result', cls: 't', text: '1 passed (full output)', tok: 900 }, | |
| { node: 'model', call: true, final: true, who: 'assistant → you', cls: 'a', text: '"Fixed: revoke now checks role, members get 403. Test green."', tok: 26 }, | |
| ]; | |
| const nodes = [['you', 'You', 'prompt in, answer out', ''], ['harness', 'Harness', 'assembles the window', 'harness'], ['model', 'Model', 'reads everything, every call', 'model'], ['tool', 'Tool call', 'the model asks', 'harness'], ['result', 'Tool result', 'appended to window', 'harness']]; | |
| el.innerHTML = ` | |
| <div class="w-head"><span class="kicker">One turn of the loop</span>${btns([['step', 'Step →'], ['auto', 'Auto'], ['reset', 'Reset']])}</div> | |
| <div class="ring">${nodes.map(n => `<div class="node ${n[3]}" data-n="${n[0]}"><span class="n">${n[1]}</span><span class="d">${n[2]}</span></div>`).join('')}<div class="resend-badge">whole transcript re-sent</div></div> | |
| <div class="log"></div> | |
| <div class="meters"> | |
| <span class="wcount">window <b class="m-win">0</b></span> | |
| <span class="wcount">model calls <b class="m-calls">0</b></span> | |
| <span class="wcount in">input tokens sent <b class="m-in">0</b></span> | |
| <span class="wcount">of which cache reads <b class="m-cache">0</b></span> | |
| <span class="wcount out">output tokens <b class="m-out">0</b></span> | |
| </div> | |
| <div class="endnote" hidden></div>`; | |
| const log = $('.log', el); | |
| let tok = 0, calls = 0, inp = 0, cache = 0, out = 0, prefixEnd = 0; | |
| const paint = () => { $('.m-win', el).textContent = fmtK(tok); $('.m-calls', el).textContent = calls; $('.m-in', el).textContent = fmtK(inp); $('.m-cache', el).textContent = fmtK(cache); $('.m-out', el).textContent = out; }; | |
| const reset = () => { tok = calls = inp = cache = out = prefixEnd = 0; log.innerHTML = ''; $$('.node', el).forEach(n => n.classList.remove('on')); $('.endnote', el).hidden = true; paint(); }; | |
| const st = stepper(el, steps.length, async i => { | |
| const s = steps[i]; | |
| $$('.node', el).forEach(n => n.classList.toggle('on', n.dataset.n === s.node)); | |
| if (s.call) { | |
| calls++; inp += tok; cache += prefixEnd; | |
| $$('.log > div', log).forEach(r => { r.classList.remove('new'); r.classList.add('resend'); }); | |
| el.classList.add('sending'); paint(); | |
| await sleep(650); | |
| $$('.log > div', log).forEach(r => r.classList.remove('resend')); el.classList.remove('sending'); | |
| } | |
| tok += s.tok; | |
| if (s.call || s.out) { out += s.tok; prefixEnd = tok; } | |
| log.appendChild(logRow(s.who, s.cls, s.text, s.tok)); log.scrollTop = log.scrollHeight; | |
| paint(); | |
| if (s.final) { | |
| const eff = (inp - cache) + cache * 0.1; | |
| const n = $('.endnote', el); | |
| n.innerHTML = `<b>${fmtK(inp)} input tokens for a ${fmtK(tok)} window.</b> Every call re-sends the whole transcript, so input grows with the square of the conversation. <b>Prompt caching</b> is what makes this affordable: the unchanged prefix is a cache read at roughly a tenth of the price, so ${fmtK(cache)} of those tokens cost ~${fmtK(cache * 0.1)}. Effective input ≈ <b>${fmtK(eff)}</b>. Same mechanism decides what a subagent costs, later.`; | |
| n.hidden = false; | |
| } | |
| }, reset); | |
| paint(); | |
| }; | |
| /* -- context-fill: click chips to fill a 200k window, watch the verdict */ | |
| widgets['context-fill'] = el => { | |
| el.classList.add('w-fill'); | |
| const CAP = 200000; | |
| const chips = [ | |
| { k: 'harness', l: 'System prompt + built-in tool schemas', t: 20000 }, { k: 'harness', l: 'One chatty MCP server (30 tools)', t: 12000 }, | |
| { k: 'docs', l: 'CLAUDE.md (a mature one)', t: 15000 }, { k: 'docs', l: 'One project-context file', t: 3000 }, | |
| { k: 'read', l: 'Read a 400-line file', t: 5000 }, { k: 'read', l: 'Grep across the repo', t: 3000 }, | |
| { k: 'out', l: 'Test-suite output', t: 8000 }, { k: 'out', l: 'Pasted stack trace / log', t: 4000 }, | |
| { k: 'chat', l: 'Your message', t: 300 }, { k: 'chat', l: 'Agent reply', t: 600 }, | |
| { k: 'sub', l: 'Subagent report (its 60k stays outside)', t: 1500 }, | |
| ]; | |
| const names = { harness: 'harness', docs: 'context files', read: 'file reads', out: 'tool output', chat: 'conversation', sub: 'subagent', summary: 'compaction summary' }; | |
| let segs = []; | |
| el.innerHTML = ` | |
| <div class="w-head"><span class="kicker">A 200k window · illustrative sizes</span>${btns([['undo', 'Undo'], ['compact', 'Auto-compact'], ['reset', 'Reset']])}</div> | |
| <div class="bar"></div> | |
| <div class="zones"><span style="flex:2">0–40% sharp</span><span style="flex:1.75">40–75% diluting</span><span style="flex:1">75–95% degraded</span><span style="flex:.25">⟲</span></div> | |
| <div class="chips">${chips.map((c, i) => `<button class="chip" data-i="${i}"><i class="seg ${c.k}"></i>${c.l}<span class="t">+${fmtK(c.t)}</span></button>`).join('')}</div> | |
| <div class="status"><span class="wcount"><b class="used">0</b> / 200k · <span class="pct">0%</span> · <span class="mix"></span></span><span class="verdict sharp">Sharp.</span></div>`; | |
| const bar = $('.bar', el); | |
| const render = () => { | |
| bar.innerHTML = ''; let used = 0; const byKind = {}; | |
| segs.forEach(s => { used += s.t; byKind[s.k] = (byKind[s.k] || 0) + s.t; const d = h('div', 'seg ' + s.k); d.style.width = (s.t / CAP * 100) + '%'; d.title = `${s.l} · ${fmtK(s.t)}`; bar.appendChild(d); }); | |
| const pct = used / CAP; | |
| $('.used', el).textContent = fmtK(used); $('.pct', el).textContent = Math.round(pct * 100) + '%'; | |
| $('.mix', el).textContent = Object.entries(byKind).sort((a, b) => b[1] - a[1]).slice(0, 3).map(([k, v]) => `${names[k]} ${Math.round(v / Math.max(used, 1) * 100)}%`).join(' · '); | |
| const v = $('.verdict', el); | |
| v.className = 'verdict ' + (pct < .4 ? 'sharp' : pct < .75 ? 'dilute' : 'degraded'); | |
| v.textContent = pct < .4 ? 'Sharp.' : pct < .75 ? 'Diluting — old decisions fade.' : pct < .95 ? 'Degraded — expect drift and repeats.' : 'Compacting… (lossy)'; | |
| }; | |
| el.onclick = e => { | |
| const b = e.target.closest('button'); if (!b) return; | |
| if (b.dataset.i !== undefined) { segs.push({ ...chips[Number(b.dataset.i)] }); if (segs.reduce((a, s) => a + s.t, 0) > CAP * .95) segs = [{ k: 'summary', l: 'Compaction summary (lossy)', t: 12000 }]; } | |
| if (b.dataset.a === 'undo') segs.pop(); | |
| if (b.dataset.a === 'reset') segs = []; | |
| if (b.dataset.a === 'compact') { const keep = segs.filter(s => s.k === 'harness'); segs = [...keep, { k: 'summary', l: 'Compaction summary (lossy)', t: 12000 }]; } | |
| render(); | |
| }; | |
| render(); | |
| }; | |
| /* -- compaction: a long transcript becomes a summary; watch what does not survive */ | |
| widgets['compaction'] = el => { | |
| el.classList.add('w-compact'); | |
| const items = [ | |
| { who: 'you', t: 'Add a response cache for the two list endpoints.', tok: 300, keep: 'task: response cache for the list endpoints' }, | |
| { who: 'assistant', t: 'Considered Redis; rejected — ops burden not worth it for two endpoints. Going in-process.', tok: 400, lost: 'why Redis was rejected' }, | |
| { who: 'tool', t: 'Read schema.ts, cache.ts, both route files', tok: 9000 }, | |
| { who: 'you', t: 'Careful — app_test is shared between worktrees, run the integration suite serially.', tok: 200, lost: 'the shared test database' }, | |
| { who: 'assistant', t: 'TTL 60 s, keyed by org + path.', tok: 300, keep: 'in-process, 60 s TTL, keyed by org + path' }, | |
| { who: 'tool', t: 'pnpm build failed; only works with --mode development on this branch', tok: 6000, lost: 'the build flag that works' }, | |
| { who: 'you', t: "Don't touch the migration journal again.", tok: 100, lost: '"don\'t touch the migration journal"' }, | |
| { who: 'tool', t: 'vitest: 38 passed (full output)', tok: 9500, keep: 'tests green' }, | |
| { who: 'you', t: 'Invalidate on write, not on a timer.', tok: 200, keep: 'invalidate on write' }, | |
| { who: 'assistant', t: 'Members get 403 on the cached route, not 404 — matches the team page.', tok: 300, lost: '403 vs 404 for members' }, | |
| { who: 'tool', t: 'Read 6 more files while checking callers', tok: 22000 }, | |
| { who: 'assistant', t: 'PR #212 opened.', tok: 200, keep: 'PR #212 open' }, | |
| ]; | |
| const total = items.reduce((a, i) => a + i.tok, 0) + 18000; | |
| el.innerHTML = ` | |
| <div class="w-head"><span class="kicker">A session at 95% · window <b class="m-win">${fmtK(total)}</b></span>${btns([['compact', 'Compact', true], ['reset', 'Reset']])}</div> | |
| <div class="two"> | |
| <div class="transcript">${items.map((it, i) => `<div class="it ${it.keep ? 'k' : it.lost ? 'l' : ''}" data-i="${i}"><span class="who ${it.who === 'you' ? 'u' : it.who === 'assistant' ? 'a' : 't'}">${it.who}</span><span class="tx">${esc(it.t)}</span><span class="tok">${fmtK(it.tok)}</span></div>`).join('')}</div> | |
| <div class="after" hidden> | |
| <div class="summary"><span class="kicker">summary · <b class="m-sum"></b></span><p></p></div> | |
| <div class="lost"><span class="kicker bad">gone, silently</span><ul></ul></div> | |
| </div> | |
| </div>`; | |
| const after = $('.after', el); | |
| el.onclick = async e => { | |
| const a = e.target.closest('[data-a]')?.dataset.a; if (!a) return; | |
| if (a === 'reset') { after.hidden = true; $$('.it', el).forEach(d => d.classList.remove('gone', 'kept')); $('.m-win', el).textContent = fmtK(total); return; } | |
| if (!after.hidden) return; | |
| for (const d of $$('.it', el)) { d.classList.add(d.classList.contains('k') ? 'kept' : 'gone'); await sleep(90); } | |
| await sleep(300); | |
| const keeps = items.filter(i => i.keep).map(i => i.keep); | |
| $('.summary p', el).textContent = keeps.join(' · ') + '.'; | |
| $('.m-sum', el).textContent = '11k'; | |
| $('.lost ul', el).innerHTML = items.filter(i => i.lost).map(i => `<li>${esc(i.lost)}</li>`).join(''); | |
| $('.m-win', el).textContent = '11k'; after.hidden = false; | |
| }; | |
| }; | |
| /* -- chat-replay: a scripted exchange, one message per step. Data in a JSON script child. */ | |
| widgets['chat-replay'] = el => { | |
| el.classList.add('w-chat'); | |
| const msgs = readJson(el) || []; | |
| el.innerHTML = `<div class="w-head"><span class="kicker">${esc(el.dataset.title || 'Replay')}</span>${btns([['step', 'Step →'], ['auto', 'Auto'], ['reset', 'Reset']])}</div><div class="thread"></div>`; | |
| const thread = $('.thread', el); | |
| stepper(el, msgs.length, async i => { | |
| const m = msgs[i]; | |
| const b = h('div', `msg ${m.w}`, `<span class="bub">${m.t}</span>`); | |
| thread.appendChild(b); thread.scrollTop = thread.scrollHeight; | |
| }, () => { thread.innerHTML = ''; }); | |
| }; | |
| /* -- tool-belt: what the built-in tools do; what plugging MCP servers costs */ | |
| widgets['tool-belt'] = el => { | |
| el.classList.add('w-belt'); | |
| const svg = d => `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">${d}</svg>`; | |
| const tools = [ | |
| { n: 'Read', i: svg('<path d="M6 2h8l6 6v14H6z"/><path d="M14 2v6h6"/>'), d: 'open a file', demo: ['› Read app/src/lib/server/resolve-org.ts', '130 lines → 1.4k tokens into the window'] }, | |
| { n: 'Edit', i: svg('<path d="M4 20l4-1L19 8l-3-3L5 16z"/><path d="M14 7l3 3"/>'), d: 'change a file, surgically', demo: ['› Edit routes/settings/team/+page.server.ts', '− const user = session?.user', '+ const { role } = await resolveOrgWithRole(event)'] }, | |
| { n: 'Bash', i: svg('<path d="M4 6l6 6-6 6"/><path d="M12 18h8"/>'), d: 'run anything you could run', demo: ['› Bash pnpm vitest run invite', '✓ 12 passed · output: 0.9k tokens'] }, | |
| { n: 'Grep', i: svg('<circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/>'), d: 'search the repo', demo: ['› Grep "deletedAt" app/src', '31 matches in 9 files'] }, | |
| { n: 'Web', i: svg('<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18"/>'), d: 'fetch a page or docs', demo: ['› WebFetch docs.example.com/auth', '200 · summarised to 800 tokens'] }, | |
| { n: 'Agent', i: svg('<circle cx="6" cy="6" r="2.5"/><circle cx="18" cy="6" r="2.5"/><circle cx="12" cy="18" r="2.5"/><path d="M6 8.5v2a3 3 0 003 3h6a3 3 0 003-3v-2M12 13.5v2"/>'), d: 'spawn a subagent', demo: ['› Agent "find every Date built without a timezone"', 'child window: 58k · report back: 1.2k'] }, | |
| ]; | |
| const servers = [ | |
| { n: 'Playwright', d: 'a browser', tools: 26, tok: 9000 }, { n: 'GitHub', d: 'issues, PRs', tools: 40, tok: 14000 }, { n: 'Postgres', d: 'your database', tools: 9, tok: 3000 }, | |
| { n: 'Slack', d: 'messages', tools: 22, tok: 8000 }, { n: 'Linear', d: 'tickets', tools: 31, tok: 11000 }, { n: 'Figma', d: 'designs', tools: 18, tok: 6000 }, | |
| ]; | |
| const BASE = 6000, SCALE = 60000; | |
| let plugged = new Set(); | |
| el.innerHTML = ` | |
| <div class="belt-grid"> | |
| <div class="builtin"><span class="kicker">Built in</span><div class="tiles">${tools.map((t, i) => `<button class="tile" data-t="${i}">${t.i}<span class="n">${t.n}</span><span class="d">${t.d}</span></button>`).join('')}</div></div> | |
| <div class="mcp"><span class="kicker">Plug in an MCP server</span><div class="sockets">${servers.map((s, i) => `<button class="sock" data-s="${i}">${svg('<path d="M9 3v5M15 3v5M6 8h12v4a6 6 0 01-12 0zM12 18v3"/>')}<span class="n">${s.n}</span><span class="d">${s.d} · ${s.tools} tools</span></button>`).join('')}</div></div> | |
| </div> | |
| <div class="console"><div class="line mute">click a tool</div></div> | |
| <div class="meter"><span class="kicker">tool schemas sent on <em>every</em> call</span><div class="bar"><div class="fill base" style="width:${BASE / SCALE * 100}%"></div><div class="fill add"></div></div><span class="wcount"><b class="m-tok">${fmtK(BASE)}</b> tokens · <b class="m-tools">6</b> tools · used today: <b>3</b></span></div>`; | |
| const con = $('.console', el); | |
| const say = async lines => { con.innerHTML = ''; for (const l of lines) { con.appendChild(h('div', 'line new', esc(l))); await sleep(220); } }; | |
| const meter = () => { const add = [...plugged].reduce((a, i) => a + servers[i].tok, 0), n = [...plugged].reduce((a, i) => a + servers[i].tools, 0); $('.fill.add', el).style.width = (add / SCALE * 100) + '%'; $('.m-tok', el).textContent = fmtK(BASE + add); $('.m-tools', el).textContent = 6 + n; }; | |
| el.onclick = e => { | |
| const t = e.target.closest('.tile'); if (t) { $$('.tile', el).forEach(x => x.classList.toggle('on', x === t)); say(tools[Number(t.dataset.t)].demo); return; } | |
| const s = e.target.closest('.sock'); if (s) { | |
| const i = Number(s.dataset.s), sv = servers[i]; | |
| if (plugged.has(i)) { plugged.delete(i); s.classList.remove('on'); say([`› unplug ${sv.n}`, `−${sv.tools} tool schemas · −${fmtK(sv.tok)} tokens on every call`]); } | |
| else { plugged.add(i); s.classList.add('on'); say([`› plug ${sv.n}`, `+${sv.tools} tool schemas · +${fmtK(sv.tok)} tokens on every call, used or not`]); } | |
| meter(); | |
| } | |
| }; | |
| }; | |
| /* -- approval-fatigue: approve prompts by hand; see how fast you stop reading */ | |
| widgets['approval-fatigue'] = el => { | |
| el.classList.add('w-fatigue'); | |
| const prompts = [ | |
| 'Bash(pnpm vitest run invite)', 'Bash(git status)', 'Bash(pnpm check)', 'Read(app/src/lib/server/resolve-org.ts)', 'Bash(git diff --stat)', 'Edit(routes/settings/team/+page.server.ts)', | |
| 'Bash(pnpm prettier --write routes/settings/team/+page.server.ts)', 'Bash(git add -A)', 'Bash(git commit -m "fix: role guard on revoke")', 'Bash(pnpm build)', 'Bash(docker compose ps)', 'Bash(git fetch origin)', | |
| { t: 'Bash(git push --force origin main)', bad: 'a force-push to main' }, 'Bash(pnpm vitest run)', 'Bash(ls app/drizzle)', { t: 'Bash(rm -rf ../lawcel-worktrees/*)', bad: 'deleting every other worktree on the machine' }, | |
| ]; | |
| let i = 0, t0 = 0, times = [], slipped = []; | |
| el.innerHTML = ` | |
| <div class="prompt"><span class="kicker">The agent wants to run</span><div class="cmd"></div><div class="row"><button class="wbtn primary" data-a="allow">Allow</button><button class="wbtn" data-a="deny">Deny</button></div></div> | |
| <div class="stats"><span class="wcount"><b class="m-n">0</b>/${prompts.length} decided · avg <b class="m-avg">–</b> s</span><div class="ticks"></div></div> | |
| <div class="verdict" hidden></div>`; | |
| const cmd = $('.cmd', el), ticks = $('.ticks', el); | |
| const show = () => { if (i >= prompts.length) return finish(); const p = prompts[i]; cmd.textContent = typeof p === 'string' ? p : p.t; t0 = performance.now(); }; | |
| const finish = () => { | |
| $('.prompt', el).hidden = true; | |
| const v = $('.verdict', el); v.hidden = false; | |
| const avg = (times.reduce((a, b) => a + b, 0) / Math.max(times.length, 1) / 1000).toFixed(1); | |
| v.innerHTML = slipped.length | |
| ? `<b>You approved ${slipped.length === 1 ? 'a' : ''} ${slipped.map(s => `${s.bad} (prompt ${s.n}, ${s.dt.toFixed(1)} s)`).join(' and ')}.</b> Average decision time ${avg} s. The dangerous prompt looked exactly like the twelve before it. That is what "approve every time" costs, and why the allow-list has to be written down instead.` | |
| : `<b>You caught both.</b> Average decision time ${avg} s. Now imagine prompt 13 at 17:40 on a Friday, in the seventh parallel session. The allow-list exists so this never depends on attention.`; | |
| }; | |
| el.onclick = e => { | |
| const a = e.target.closest('[data-a]')?.dataset.a; if (!a) return; | |
| const dt = (performance.now() - t0) / 1000; times.push(dt * 1000); | |
| const p = prompts[i]; const bad = typeof p === 'object' && a === 'allow'; | |
| if (bad) slipped.push({ bad: p.bad, n: i + 1, dt }); | |
| const tk = h('span', 'tick ' + (typeof p === 'object' ? (a === 'allow' ? 'bad' : 'ok') : '')); tk.title = `${dt.toFixed(1)} s`; tk.style.height = Math.min(34, 6 + dt * 12) + 'px'; ticks.appendChild(tk); | |
| i++; $('.m-n', el).textContent = i; $('.m-avg', el).textContent = (times.reduce((x, y) => x + y, 0) / times.length / 1000).toFixed(1); | |
| show(); | |
| }; | |
| show(); | |
| }; | |
| /* -- subagent-sim: the parent delegates; a second window fills and is thrown away; a small report comes back */ | |
| widgets['subagent-sim'] = el => { | |
| el.classList.add('w-subsim'); | |
| const steps = [ | |
| { p: 'main', node: 'you', who: 'you', cls: 'u', text: '"Find every place we build a Date without a timezone."', tok: 22 }, | |
| { p: 'main', who: 'harness', cls: 's', text: 'assembles: system prompt + tool schemas + CLAUDE.md + your message', tok: 18000 }, | |
| { p: 'main', call: true, who: 'assistant', cls: 'a', text: "Broad search. I'll delegate it, so the reads stay out of this window.", tok: 30 }, | |
| { p: 'main', out: true, who: 'tool call', cls: 't', text: 'Agent("Find every `new Date(` in app/src; report file:line and whether tz is handled")', tok: 90, spawn: true }, | |
| { p: 'sub', who: 'harness', cls: 's', text: 'assembles: system prompt + tool schemas + the task prompt. Nothing else — it has not seen the conversation.', tok: 18100 }, | |
| { p: 'sub', call: true, who: 'subagent', cls: 'a', text: 'Grepping first.', tok: 8 }, | |
| { p: 'sub', out: true, who: 'tool call', cls: 't', text: 'Grep("new Date(", app/src)', tok: 14 }, | |
| { p: 'sub', who: 'tool result', cls: 't', text: '41 matches in 17 files', tok: 2600 }, | |
| { p: 'sub', call: true, who: 'subagent', cls: 'a', text: 'Reading all 17 files.', tok: 10 }, | |
| { p: 'sub', out: true, who: 'tool call', cls: 't', text: 'Read × 17', tok: 60 }, | |
| { p: 'sub', who: 'tool result', cls: 't', text: '(17 files)', tok: 31000 }, | |
| { p: 'sub', call: true, who: 'subagent', cls: 'a', text: 'Checking each site for tz handling.', tok: 14 }, | |
| { p: 'sub', out: true, who: 'tool call', cls: 't', text: 'Grep("toISOString|Temporal|date-fns-tz")', tok: 18 }, | |
| { p: 'sub', who: 'tool result', cls: 't', text: '22 matches', tok: 1900 }, | |
| { p: 'sub', call: true, out: true, who: 'subagent → parent', cls: 'a', text: 'Report: 7 of 41 sites lack tz handling — list with file:line.', tok: 1200, ret: true }, | |
| { p: 'main', who: 'tool result', cls: 't', text: '(the report, 1.2k tokens)', tok: 1200 }, | |
| { p: 'main', call: true, final: true, who: 'assistant → you', cls: 'a', text: '"7 of 41 call sites build dates without a timezone. Here they are. Fix them?"', tok: 140 }, | |
| ]; | |
| const pane = (key, title) => `<div class="pane ${key}" data-p="${key}"><div class="lab"><span class="kicker">${title}</span><span class="wcount">window <b class="m-win">0</b> · input sent <b class="m-in">0</b></span></div><div class="bar"><div class="fill"></div></div><div class="log"></div><div class="state"></div></div>`; | |
| el.innerHTML = `<div class="w-head"><span class="kicker">Delegating a broad search</span>${btns([['step', 'Step →'], ['auto', 'Auto'], ['reset', 'Reset']])}</div> | |
| <div class="two">${pane('main', 'Main agent')}${pane('sub', 'Subagent')}</div><div class="endnote" hidden></div>`; | |
| const P = {}; ['main', 'sub'].forEach(k => { P[k] = { el: $(`.pane.${k}`, el), log: $(`.pane.${k} .log`, el), tok: 0, inp: 0, cache: 0, prefixEnd: 0 }; }); | |
| const paint = k => { const p = P[k]; $('.m-win', p.el).textContent = fmtK(p.tok); $('.m-in', p.el).textContent = fmtK(p.inp); $('.fill', p.el).style.width = Math.min(100, p.tok / 60000 * 100) + '%'; }; | |
| const reset = () => { ['main', 'sub'].forEach(k => { Object.assign(P[k], { tok: 0, inp: 0, cache: 0, prefixEnd: 0 }); P[k].log.innerHTML = ''; P[k].el.classList.remove('live', 'dead'); $('.state', P[k].el).textContent = ''; paint(k); }); P.sub.el.classList.add('idle'); $('.state', P.sub.el).textContent = 'not spawned'; $('.endnote', el).hidden = true; }; | |
| stepper(el, steps.length, async i => { | |
| const s = steps[i], p = P[s.p]; | |
| if (s.p === 'sub') { p.el.classList.remove('idle'); p.el.classList.add('live'); $('.state', p.el).textContent = 'running'; } | |
| ['main', 'sub'].forEach(k => P[k].el.classList.toggle('active', k === s.p)); | |
| if (s.call) { p.inp += p.tok; p.cache += p.prefixEnd; $$('.log > div', p.log).forEach(r => { r.classList.remove('new'); r.classList.add('resend'); }); paint(s.p); await sleep(500); $$('.log > div', p.log).forEach(r => r.classList.remove('resend')); } | |
| p.tok += s.tok; if (s.call || s.out) p.prefixEnd = p.tok; | |
| p.log.appendChild(logRow(s.who, s.cls, s.text, s.tok)); p.log.scrollTop = p.log.scrollHeight; paint(s.p); | |
| if (s.spawn) { await sleep(300); P.sub.el.classList.remove('idle'); $('.state', P.sub.el).textContent = 'spawned'; } | |
| if (s.ret) { await sleep(400); p.el.classList.remove('live'); p.el.classList.add('dead'); $('.state', p.el).textContent = `window discarded · ${fmtK(p.tok)} tokens gone, cache and all`; } | |
| if (s.final) { | |
| const m = P.main, u = P.sub; | |
| $('.endnote', el).innerHTML = `<b>Main window: ${fmtK(m.tok)}. Subagent window: ${fmtK(u.tok)}, thrown away.</b> Input sent: main ${fmtK(m.inp)}, subagent ${fmtK(u.inp)}. Had the main agent done the reads itself, its window would sit at ~${fmtK(m.tok + 33000)} for the rest of the session and every later call would re-send it. So a subagent costs <em>more now</em> — its own ${fmtK(18100)} of harness overhead, a fresh cache to write, and the risk of re-reading what the parent already read — and <em>less later</em>. Worth it for large reads and independent tasks; wasteful for a three-file change.`; | |
| $('.endnote', el).hidden = false; | |
| } | |
| }, reset); | |
| reset(); | |
| }; | |
| /* -- vigilance: twelve sessions, one reviewer; diffs grow, the share you read shrinks, unread deviations get copied */ | |
| widgets['vigilance'] = el => { | |
| el.classList.add('w-vig'); | |
| const MAX = 1000; | |
| const sessions = [ | |
| { lines: 320, read: 1.00 }, | |
| { lines: 380, read: 0.90 }, | |
| { lines: 410, read: 0.75, dev: 0.40 }, // lands inside what you read: caught | |
| { lines: 480, read: 0.60 }, | |
| { lines: 520, read: 0.45 }, | |
| { lines: 610, read: 0.35, dev: 0.62 }, // above the line: shipped | |
| { lines: 640, read: 0.28 }, | |
| { lines: 700, read: 0.22 }, | |
| { lines: 760, read: 0.18, dev: 0.55 }, // shipped | |
| { lines: 820, read: 0.15 }, | |
| { lines: 880, read: 0.12 }, | |
| { lines: 940, read: 0.10 }, | |
| ]; | |
| el.innerHTML = `<div class="w-head"><span class="kicker">Twelve sessions, one reviewer</span>${btns([['step', 'Step →'], ['auto', 'Auto'], ['reset', 'Reset']])}</div> | |
| <div class="chart"></div><div class="labels">${sessions.map((_, i) => `<span>${i + 1}</span>`).join('')}</div> | |
| <div class="meters"><span>this diff <b class="m-lines">–</b></span><span>you read <b class="m-read">–</b></span><span>deviations caught <b class="m-caught ok">0</b></span><span>shipped unread <b class="m-ship bad">0</b></span><span>copied since <b class="m-copy bad">0</b></span></div> | |
| <div class="legend"><span><i class="sw read"></i>what you read</span><span><i class="sw dot caught"></i>deviation caught</span><span><i class="sw dot ship"></i>deviation shipped</span><span><i class="sw dot copy"></i>copy of a shipped one</span></div> | |
| <div class="endnote" hidden></div>`; | |
| const chart = $('.chart', el); | |
| let caught = 0, shipped = 0, copies = 0, live = []; | |
| const paint = s => { $('.m-lines', el).textContent = s ? s.lines + ' lines' : '–'; $('.m-read', el).textContent = s ? Math.round(s.read * 100) + '%' : '–'; $('.m-caught', el).textContent = caught; $('.m-ship', el).textContent = shipped; $('.m-copy', el).textContent = copies; }; | |
| const reset = () => { chart.innerHTML = sessions.map(() => '<div class="slot"></div>').join(''); caught = shipped = copies = 0; live = []; $('.endnote', el).hidden = true; paint(null); }; | |
| const mark = (bar, cls, at) => { const m = h('span', 'mk ' + cls); m.style.bottom = (at * 100) + '%'; bar.appendChild(m); }; | |
| stepper(el, sessions.length, async i => { | |
| const s = sessions[i]; | |
| const bar = h('div', 'bar', `<div class="read" style="height:${s.read * 100}%"></div>`); | |
| bar.style.height = (s.lines / MAX * 100) + '%'; | |
| $$('.slot', chart)[i].appendChild(bar); | |
| paint(s); | |
| await sleep(160); | |
| live.forEach((at, k) => { mark(bar, 'copy', Math.min(0.92, at + 0.07 * (k + 1))); copies++; }); | |
| if (s.dev !== undefined) { | |
| const ok = s.dev < s.read; | |
| mark(bar, ok ? 'caught' : 'ship', s.dev); | |
| if (ok) caught++; else { shipped++; live.push(s.dev); } | |
| } | |
| paint(s); | |
| await sleep(120); | |
| }, reset); | |
| el.addEventListener('done', () => { | |
| const n = $('.endnote', el); | |
| n.innerHTML = `<b>Session 1 you read all of it. Session 12 you read a tenth.</b> One deviation was caught; two shipped above the line and have been copied ${copies} times since. Every rule that lives only in your head is now enforced a tenth of the time, and the code disagrees with it in ${shipped + copies} places.`; | |
| n.hidden = false; | |
| }); | |
| reset(); | |
| }; | |
| /* -- rediscovery: the same three facts re-learned every session vs. read once */ | |
| widgets['rediscovery'] = el => { | |
| el.classList.add('w-redisc'); | |
| const vibe = [['Read schema.ts', 4200], ['Grep "deletedAt"', 1800], ['Read db/queries.ts', 2100], ['Read resolve-org.ts', 1400], ['Read 3 route files to see the pattern', 6100], ['know', 'ok — Drizzle, soft delete via helpers, resolveOrg for auth', 0]]; | |
| const ctx = [['Read AGENTS/DNA/DECISIONS.md', 3000], ['Read AGENTS/DNA/ARCHITECTURE.md', 2400], ['know', 'ok — and 40 other rulings, for free', 0]]; | |
| el.innerHTML = ` | |
| <div class="w-head"><span class="kicker">Three sessions, same three facts</span>${btns([['run', 'Run 3 sessions', true], ['reset', 'Reset']])}</div> | |
| <div class="two"> | |
| <div class="pane"><div class="lab"><span class="pill bad">no persistent context</span><span class="tot"><b class="t1">0</b><small>tokens spent learning</small></span></div><div class="log l1"></div></div> | |
| <div class="pane"><div class="lab"><span class="pill ok">context files in the repo</span><span class="tot"><b class="t2">0</b><small>tokens spent learning</small></span></div><div class="log l2"></div></div> | |
| </div> | |
| <div class="w-note">And the left column may still guess wrong: it saw three route files, not the one that does it differently.</div>`; | |
| let busy = false; | |
| const play = async (log, script, totEl) => { | |
| let tot = 0; | |
| for (let s = 1; s <= 3; s++) { | |
| log.appendChild(h('div', 'sess', `session ${s}`)); | |
| for (const [a, b, c] of script) { | |
| await sleep(260); | |
| if (a === 'know') log.appendChild(h('div', 'know', `✓ ${b}`)); | |
| else { tot += b; log.appendChild(h('div', '', `<span class="s">›</span><span>${a}</span><span class="tok">${fmtK(b)}</span>`)); totEl.textContent = fmtK(tot); } | |
| log.scrollTop = log.scrollHeight; | |
| } | |
| } | |
| }; | |
| el.onclick = async e => { | |
| const a = e.target.closest('[data-a]')?.dataset.a; if (!a || busy) return; | |
| const l1 = $('.l1', el), l2 = $('.l2', el); | |
| if (a === 'reset') { l1.innerHTML = l2.innerHTML = ''; $('.t1', el).textContent = $('.t2', el).textContent = '0'; return; } | |
| busy = true; l1.innerHTML = l2.innerHTML = ''; | |
| await Promise.all([play(l1, vibe, $('.t1', el)), play(l2, ctx, $('.t2', el))]); | |
| busy = false; | |
| }; | |
| }; | |
| /* -- pattern-entropy: sessions copy an existing pattern or invent one */ | |
| widgets['pattern-entropy'] = el => { | |
| el.classList.add('w-entropy'); | |
| const N = 60; | |
| const palette = ['#2f5f8c', '#c94f1d', '#3d7a57', '#b0791a', '#7a4f9b', '#b8332a', '#2a8c8c', '#8c6d2f', '#5b7a2f', '#9b4f7a', '#4f6d9b', '#7a2f2f', '#2f7a6d', '#9b7a4f', '#6d2f9b']; | |
| el.innerHTML = ` | |
| <div class="w-head"><span class="kicker">60 sessions, each adds one implementation of "fetch the current user"</span>${btns([['run', 'Run', true], ['reset', 'Reset']])}</div> | |
| <div class="runs"> | |
| <div class="run"><div class="lab"><span class="pill bad">ambiguous codebase · p(invent) = 0.25</span><span class="k"><b class="k1">1</b><small>distinct patterns</small></span></div><div class="cells c1"></div></div> | |
| <div class="run"><div class="lab"><span class="pill ok">one documented pattern · p(invent) = 0.03</span><span class="k"><b class="k2">1</b><small>distinct patterns</small></span></div><div class="cells c2"></div></div> | |
| </div> | |
| <div class="legend">Each square is one session's implementation, coloured by which pattern it copied. Copying is proportional to prevalence, so a new pattern, once invented, gets copied too.</div>`; | |
| const mk = cells => { cells.innerHTML = ''; for (let i = 0; i < N; i++) cells.appendChild(h('div', 'cell')); }; | |
| mk($('.c1', el)); mk($('.c2', el)); | |
| let busy = false; | |
| const run = async (cells, p, kEl) => { | |
| const occ = [0]; let k = 1; const cs = $$('.cell', cells); | |
| for (let i = 0; i < N; i++) { await sleep(70); let pat; if (i > 0 && Math.random() < p) pat = k++; else pat = occ[Math.floor(Math.random() * occ.length)]; occ.push(pat); cs[i].style.background = palette[pat % palette.length]; kEl.textContent = k; } | |
| }; | |
| el.onclick = async e => { | |
| const a = e.target.closest('[data-a]')?.dataset.a; if (!a || busy) return; | |
| if (a === 'reset') { mk($('.c1', el)); mk($('.c2', el)); $('.k1', el).textContent = $('.k2', el).textContent = '1'; return; } | |
| busy = true; mk($('.c1', el)); mk($('.c2', el)); | |
| await Promise.all([run($('.c1', el), 0.25, $('.k1', el)), run($('.c2', el), 0.03, $('.k2', el))]); | |
| busy = false; | |
| }; | |
| }; | |
| /* -- file-tree: the framework, one file at a time */ | |
| widgets['file-tree'] = el => { | |
| el.classList.add('w-tree'); | |
| const F = [ | |
| { n: 'CLAUDE.md', alt: 'AGENTS.md', d: 0, k: 'contract', sum: 'The contract. How to work in this repo: what to read, when to ask, how to test, how to report. Read start-to-finish once; the agent reads it every session.', test: 'Baseline behaviour every session needs. Specialised workflows go in skills instead.', | |
| ex: `# DNA: architectural guardrails\n\n1. Don't violate DNA.\n2. Grow DNA — when your work adds new structure, record it.\n3. Don't let it drift — if something in DNA/ no longer matches the code, fix it.\n4. Do not take DNA changes lightly. Err on the side of asking the human.\n\n## Before writing ANY code\n- Create a new worktree. All implementation work happens in a git worktree\n branched from origin/main. No size exceptions.` }, | |
| { n: 'AGENTS.md', alt: 'CLAUDE.md', d: 0, k: 'contract', sum: 'Same content, for the other harnesses. Keep one file and symlink the other.', altsum: 'Same content, for Claude Code. Keep one file and symlink the other.', test: 'One source of truth. Two diverging contracts is the drift you are trying to prevent.', ex: `ln -s CLAUDE.md AGENTS.md`, altex: `ln -s AGENTS.md CLAUDE.md` }, | |
| { n: 'AGENTS/', d: 0, k: 'dir' }, | |
| { n: 'DNA/', d: 1, k: 'dir', sum: 'Hard context: what the project is. Grows over time; rarely changes. A fact lives in exactly one DNA file.' }, | |
| { n: 'PRODUCT.md', d: 2, k: 'dna', sum: 'What the customer gets: vision, personas, roles, the feature inventory, what is not yet built.', test: 'Could a user observe it?', ex: `## 4. User Personas & Permissions\n- super_admin — full system access incl. ops surfaces. Created only via CLI.\n- admin — everything in their org except super-admin surfaces.\n- member — standard user.\n\n## 5. Feature Inventory\n### Settings & Administration\n- Team management — member list with roles; email invites with 7-day expiry;\n revoke, resend, remove.` }, | |
| { n: 'ARCHITECTURE.md', d: 2, k: 'dna', sum: 'Where code and data live: file structure, key non-obvious helpers, data models, pipelines.', test: 'Could you verify it with ls or by opening the file?', ex: `### Key non-obvious files\n- app/src/lib/server/resolve-org.ts — session → membership → org lookup\n (redirects if missing). resolveOrgWithRole() variant for action-level guards.\n- app/src/lib/server/db/queries.ts — canonical "active X for org" helpers\n for soft-deletable tenant tables. Encodes orgId + isNull(deletedAt) so\n callers can't accidentally omit either half.` }, | |
| { n: 'DECISIONS.md', d: 2, k: 'dna', file: 'DECISIONS.md', sum: 'Flat lookup of rulings by domain. No justifications — just the decision. Made once, enforced everywhere.', test: 'Could someone violate it by choosing otherwise?', ex: `## Data\n- Postgres + Drizzle ORM\n- UUIDs for primary keys. Timestamps in UTC.\n- Soft delete (deleted_at) on tenant-scoped tables. New queries go through\n the helpers in $lib/server/db/queries.ts.\n\n## Auth\n- Authenticated handlers resolve the org via resolveOrg / resolveOrgWithRole.\n Do not inline the session → membership → org lookup.` }, | |
| { n: 'INVARIANTS.md', d: 2, k: 'dna', sum: 'What must stay true at runtime, and the failure that taught it. Starts empty. Entries are earned by incidents, not invented.', test: 'Could you write a test that fails when it stops being true?', ex: `### A no-op hunk must never found a case\nEnforced by: the diff pre-filter in analyzeSignal() drops hunks whose\nnormalised before/after are equal before the LLM sees them.\nIncident: #612 — whitespace-only PRs opened 40 empty cases in one night.` }, | |
| { n: 'UI_SPEC.md', d: 2, k: 'dna', sum: 'How the app is laid out and behaves on screen: route groups, layout, components, badge conventions.', test: 'Would a designer recognise it as a convention?' }, | |
| { n: 'DESIGN.md', d: 2, k: 'dna', sum: 'Brand: colour tokens, typography, spacing, voice. Locks the palette so agents stop inventing hexes mid-feature.', test: 'Anti-patterns are the most useful part: "not gradients, not gamified".' }, | |
| { n: 'DEVELOPMENT.md', d: 2, k: 'dna', sum: 'How to work on the app: local setup, migrations, the testing ideology, deploy and ops procedures.', test: 'Is it a thing you do, rather than a thing the app does?', ex: `## Testing ideology\n- Integration tests against a real Postgres are the high-value tests.\n- A unit test that mocks the DB to assert what an integration test already\n covers is redundant — remove it during /cleanse.\n- Test the promise the product makes, not the framework.` }, | |
| { n: 'DEVELOPMENT_SETUP.md', d: 2, k: 'dna', sum: 'Provisioning from scratch: VPS, CI/CD, OAuth providers, disaster recovery.' }, | |
| { n: 'DEFERRED.md', d: 1, k: 'soft', file: 'DEFERRED.md', sum: 'Tech-debt ledger. Every entry has What, Why deferred and a concrete Trigger. Not for features — those go in the issue tracker.', test: '"Someday" is not a trigger.', ex: `### Rotate the GHCR read token\n**What**: The VPS pulls images with a PAT that expires 2026-11-01.\n**Why deferred**: Works today; rotating needs a human with org admin.\n**Trigger**: 2026-10-15, or the first failed deploy pull.` }, | |
| { n: 'HUMAN_TODO.md', d: 1, k: 'soft', sum: 'Tasks that genuinely need a human: third-party signups, OAuth consent, judgement calls. Deploys and migrations are not human tasks.', test: 'Would an agent with SSH be able to do it? Then it does not belong here.' }, | |
| { n: 'AGENT_MISTAKES.md', d: 1, k: 'soft', sum: 'Running log of bugs found during self-testing: category, root cause, fix. /cleanse mines it for patterns and tags addressed ones [learned].', test: 'The point is the category, not the quota.', ex: `### 2026-08-12 — #814: third arraySections copy made a patch no-op\n**Category:** duplicated hard-coded roster\n**Root cause:** fixed two copies of the list, grep for the list name missed\nthe third, which was inlined under a different name.\n**Fix:** grep for a *member* of the roster, not its name. [learned → CLAUDE.md]` }, | |
| { n: 'ENVIRONMENT_NOTES.md', d: 1, k: 'soft', file: 'ENVIRONMENT_NOTES.md', sum: 'Hard-won facts about the local environment: shared resources between worktrees, port rules, build traps, how to verify on staging. Record-keeping, not DNA.', test: 'True right now, not true forever. Delete the entry in the PR that fixes it.', ex: `## The shared local resources\nOne machine runs one Postgres container and one Playwright profile,\nwhile many worktrees run their own dev servers against them.\n- app_test is one database shared by every worktree. Two concurrent\n integration runs interfere with each other.\n- The dev database is shared too.` }, | |
| { n: 'POST_MERGE_VERIFICATION.md', d: 1, k: 'soft', sum: 'Checks that can only run against the live system, queued with trigger, exact commands, success criteria and failure hints. An agent clears them, not the human.', test: 'Runnable as written by a cold agent.' }, | |
| { n: 'SCHEDULED_JOBS.md', d: 1, k: 'soft', sum: 'Registry of everything that runs on a schedule, and for each one, what tells you when it has stopped running.', test: 'If nothing tells you a job has stopped, you find out when it matters most.' }, | |
| { n: 'SPECS/', d: 1, k: 'dir', sum: 'Design mocks: standalone HTML built from the real app chrome. The mock is the spec an agent implements from.' }, | |
| { n: '.claude/', d: 0, k: 'dir' }, | |
| { n: 'commands/cleanse.md', alt: 'skills/cleanse/SKILL.md', d: 1, k: 'skill', file: 'cleanse.md', sum: 'The hygiene skill: DNA vs DNA, DNA vs code, DB reality check, orphaned code, test pruning, mistake patterns → guardrails.', test: 'Shallow weekly-ish, deep before a big push.', ex: `# DNA Cleanse\nWhen invoked, ask the user: shallow or deep?\n\nA software project is like a living organism. It grows and changes over time,\nbut its ideological core, its DNA, must remain self-consistent and coherent,\notherwise cancer will set in and the project will die.` }, | |
| { n: 'commands/stage.md', alt: 'skills/stage/SKILL.md', d: 1, k: 'skill', file: 'stage.md', sum: 'Serve the app from this worktree on its own port against a production DB snapshot, signed in. The self-test starting point.' }, | |
| { n: 'agents/adversarial-reviewer.md', d: 1, k: 'skill', file: 'adversarial-reviewer.md', sum: 'A cold reviewer subagent. Gets only the diff, never the author\'s reasoning. Returns concrete failure scenarios, read-only.', test: 'Its whole value is that nobody told it the happy path.' }, | |
| { n: 'hooks/prettier-check.sh', d: 1, k: 'skill', file: 'prettier-check.sh', sum: 'PostToolUse hook: format on every Write/Edit. Deterministic, no prompt needed.' }, | |
| ]; | |
| el.innerHTML = `<div class="files"></div><div class="detail"></div>`; | |
| const files = $('.files', el), detail = $('.detail', el); | |
| const name = f => f.alt ? `<span class="cx" data-alt="${esc(f.alt)}">${esc(f.n)}</span>` : esc(f.n); | |
| F.forEach((f, i) => { const row = h('div', `f ${f.k}`, ' '.repeat(f.d) + name(f)); if (f.k !== 'dir' || f.sum) row.onclick = () => show(i); f.el = row; files.appendChild(row); }); | |
| const kinds = { contract: ['harness', 'contract'], dna: ['accent', 'hard context · DNA'], soft: ['harness', 'soft context · record-keeping'], skill: ['ok', 'skill / agent / hook'], dir: ['', 'directory'] }; | |
| let cur = 0; | |
| const show = i => { | |
| cur = i; const f = F[i]; | |
| F.forEach(g => g.el.classList.toggle('on', g === f)); | |
| const [cls, lab] = kinds[f.k]; | |
| const sum = (S.harness === 'other' && f.altsum) ? f.altsum : (f.sum || ''); | |
| const ex = (S.harness === 'other' && f.altex) ? f.altex : f.ex; // altex is already spelled for the other harness, so keep DICT off it | |
| detail.innerHTML = `<div class="row"><h3>${name(f)}</h3><span class="pill ${cls} kind">${lab}</span>${f.file && fileContent(f.file) !== null ? `<button class="wbtn small" data-file="${f.file}">open the file</button>` : ''}</div> | |
| <div class="sum">${sum}</div>${f.test ? `<div class="test">${f.test}</div>` : ''}${ex ? `<pre${f.altex ? ' data-nocx' : ''}>${esc(ex)}</pre>` : ''}`; | |
| applyHarness(el); | |
| }; | |
| document.addEventListener('harness-change', () => show(cur)); | |
| show(0); | |
| }; | |
| /* -- worktrees: agents on one checkout collide; one checkout per agent does not */ | |
| widgets['worktrees'] = el => { | |
| el.classList.add('w-wt'); | |
| const names = ['feat/oauth-microsoft', 'fix/digest-stale-once', 'spec/case-timeline', 'feat/reddit-gapscan', 'blog/auto-2026-09-15', 'feat/nightly-bughunt']; | |
| let lanes = [], agents = 0; | |
| el.innerHTML = ` | |
| <div class="w-head"><span class="kicker">One repo, many agents</span>${btns([['same', '+ agent on main checkout'], ['wt', '+ agent in a worktree', true], ['reset', 'Reset']])}</div> | |
| <div class="lanes"></div> | |
| <div class="shared"><b>Still shared:</b><span>postgres :5432</span><span>app_test DB</span><span>Playwright profile</span><span>.env secrets</span></div> | |
| <div class="msg"></div>`; | |
| const lanesEl = $('.lanes', el), msg = $('.msg', el); | |
| const render = () => { lanesEl.innerHTML = ''; lanes.forEach(l => { const d = h('div', 'lane' + (l.agents.length > 1 ? ' conflict' : ''), `<span class="br">${l.path}<br><span class="mute">${l.branch}</span></span><span class="agents">${l.agents.map(a => `<span class="agent">agent ${a}</span>`).join('')}</span><span class="port">:${l.port}</span>`); lanesEl.appendChild(d); }); }; | |
| const reset = () => { lanes = [{ path: 'lawcel/', branch: 'main', agents: [], port: 5173 }]; agents = 0; msg.textContent = ''; msg.className = 'msg'; render(); }; | |
| el.onclick = e => { | |
| const a = e.target.closest('[data-a]')?.dataset.a; if (!a) return; | |
| if (a === 'reset') return reset(); | |
| agents++; | |
| if (a === 'same') { | |
| lanes[0].agents.push(agents); | |
| if (lanes[0].agents.length > 1) { msg.className = 'msg bad'; msg.textContent = `agent ${agents} runs the test suite while agent ${lanes[0].agents[0]} is mid-edit — half-written file, git index fight, both confused.`; } | |
| else { msg.className = 'msg ok'; msg.textContent = 'One agent, one checkout. Fine — until the second one arrives.'; } | |
| } else { | |
| const n = lanes.length - 1, branch = names[n % names.length]; | |
| lanes.push({ path: `lawcel-worktrees/${branch.replace('/', '-')}/`, branch, agents: [agents], port: 5173 + lanes.length }); | |
| msg.className = 'msg ok'; msg.textContent = `git gtr new ${branch} → own directory, own branch, own port. Same .git, same history.`; | |
| } | |
| render(); | |
| }; | |
| reset(); | |
| }; | |
| /* == boot ========================================================== */ | |
| function boot() { | |
| const theme = store.get('theme', null); | |
| if (theme) document.documentElement.dataset.theme = theme; | |
| collect(); buildToc(); | |
| if (store.get('toc', false)) document.body.classList.add('toc-open'); | |
| go(indexFromHash(), { pushHash: false }); | |
| applyHarness(); | |
| window.addEventListener('hashchange', () => { const k = indexFromHash(); if (k !== S.i) go(k, { pushHash: false }); }); | |
| document.addEventListener('keydown', onKey); | |
| initLightbox(); | |
| document.addEventListener('click', e => { const f = e.target.closest('[data-file]'); if (f) { e.preventDefault(); openFile(f.dataset.file, f.dataset.fileTitle || f.dataset.file); } }); | |
| $$('.overlay').forEach(o => o.addEventListener('click', e => { if (e.target === o) o.hidden = true; })); | |
| let hideT; document.addEventListener('mousemove', () => { document.body.classList.remove('no-cursor'); clearTimeout(hideT); hideT = setTimeout(() => document.body.classList.add('no-cursor'), 2500); }); | |
| window.DECK = { go, next, prev, slides: S.slides, chapters: S.chapters, toggleToc, toggleNotes, toggleHarness, openFile }; | |
| } | |
| document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', boot) : boot(); | |
| })(); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment