1
0
Files
tutorials/agentic-setup/agentic-setup-overview.html
T

1366 lines
90 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title data-i18n data-en="Your Agentic Environment — A Field Guide" data-de="Deine agentische Umgebung — ein Feldführer">Your Agentic Environment — A Field Guide</title>
<style>
/* =========================================================================
YOUR AGENTIC ENVIRONMENT — A FIELD GUIDE (single-file explainer)
Direction: editorial engineering field-guide, onboarding voice.
Family resemblance to the project's roadmap infographic: parchment+ink /
midnight+bone, rust-amber signature accent, Georgia display serif +
system sans body + ui-monospace labels, inline-SVG data viz, faint
engineering grid. Warmer, orientation-first — the "what & why".
Semantic colour language: RO = teal (read-only) · RW = crimson (write)
accent = rust-amber (the signature move)
slate = neutral / domain
i18n: bilingual EN/DE. Each text node carries data-en / data-de (HTML
strings); a tiny inline script swaps innerHTML on toggle. Default
English in markup -> graceful with JS off. navigator.language picks DE,
localStorage override persists. aria carried via data-en-aria/data-de-aria.
========================================================================= */
:root{
/* --- light: warm parchment, ink, rust-amber signature ------------------ */
--bg: #f3efe6;
--bg-grain: #ece6d8;
--surface: #faf7f0;
--surface-2: #f0ebdf;
--ink: #1b1714;
--ink-soft: #45403a;
--muted: #6c655b;
--faint: #948d80;
--border: #ddd5c5;
--border-strong: #c9c0ad;
--rule: #d6cdba;
--accent: #b1481b; /* rust-amber signature */
--accent-ink: #8c3811;
--accent-wash: #f5e3d6;
--ro: #167a6e; /* teal — read-only */
--ro-wash: #d8ebe7;
--rw: #b21e35; /* crimson — read + write */
--rw-wash: #f6dde0;
--slate: #4a5a78; /* neutral / domain */
--slate-wash: #e0e5ee;
--good: #167a6e;
--warn: #c47512;
--bad: #b21e35;
--shadow: 0 1px 0 rgba(27,23,20,.04), 0 10px 30px -22px rgba(27,23,20,.45);
--shadow-lift: 0 2px 0 rgba(27,23,20,.05), 0 24px 50px -28px rgba(27,23,20,.5);
--serif: Georgia, "Iowan Old Style", "Palatino Linotype", "Times New Roman", serif;
--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, "Helvetica Neue", sans-serif;
--mono: ui-monospace, "SF Mono", "Cascadia Code", "JetBrains Mono", "Menlo", "Consolas", monospace;
--step--1: clamp(.78rem, .76rem + .12vw, .85rem);
--step-0: clamp(.95rem, .92rem + .2vw, 1.05rem);
--step-1: clamp(1.15rem, 1.05rem + .4vw, 1.4rem);
--step-2: clamp(1.5rem, 1.3rem + .8vw, 2rem);
--step-3: clamp(2rem, 1.6rem + 1.6vw, 3rem);
--step-4: clamp(2.6rem, 2rem + 3vw, 4.4rem);
--maxw: 1080px;
--gap: clamp(1.5rem, 1rem + 2vw, 3rem);
}
@media (prefers-color-scheme: dark){
:root{
--bg: #15130f;
--bg-grain: #1b1813;
--surface: #1f1c16;
--surface-2: #25211a;
--ink: #f1ece1;
--ink-soft: #d3cdc0;
--muted: #a39c8c;
--faint: #6f6a5d;
--border: #322d24;
--border-strong: #423c30;
--rule: #2c2820;
--accent: #e58a4e;
--accent-ink: #f0a570;
--accent-wash: #3a2418;
--ro: #4fc0b0;
--ro-wash: #163029;
--rw: #e26678;
--rw-wash: #3a2026;
--slate: #8ea3c7;
--slate-wash: #1f2632;
--good: #4fc0b0;
--warn: #e0a64a;
--bad: #e26678;
--shadow: 0 1px 0 rgba(0,0,0,.4), 0 14px 36px -24px rgba(0,0,0,.9);
--shadow-lift: 0 2px 0 rgba(0,0,0,.5), 0 30px 60px -30px rgba(0,0,0,.95);
}
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}}
body{
margin:0;
background:
radial-gradient(120% 80% at 100% 0%, var(--bg-grain) 0%, transparent 55%),
var(--bg);
color:var(--ink);
font-family:var(--sans);
font-size:var(--step-0);
line-height:1.6;
letter-spacing:.005em;
-webkit-font-smoothing:antialiased;
text-rendering:optimizeLegibility;
}
::selection{background:var(--accent);color:#fff}
@media (prefers-color-scheme: dark){::selection{color:#15130f}}
a{color:var(--accent-ink);text-underline-offset:.18em}
:focus-visible{outline:2.5px solid var(--accent);outline-offset:3px;border-radius:3px}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 clamp(1.1rem,4vw,3rem)}
/* faint engineering grid behind everything */
body::before{
content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
background-image:
linear-gradient(to right, var(--rule) 1px, transparent 1px),
linear-gradient(to bottom, var(--rule) 1px, transparent 1px);
background-size:46px 46px;
opacity:.22;
mask-image:radial-gradient(120% 90% at 50% 0%, #000 10%, transparent 80%);
-webkit-mask-image:radial-gradient(120% 90% at 50% 0%, #000 10%, transparent 80%);
}
/* skip link */
.skip{position:absolute;left:-9999px;top:0}
.skip:focus{left:1rem;top:1rem;z-index:50;background:var(--ink);color:var(--bg);
padding:.6rem 1rem;border-radius:6px;font-family:var(--mono);font-size:var(--step--1)}
/* ---- type helpers ------------------------------------------------------- */
.mono{font-family:var(--mono)}
.num{font-family:var(--mono);font-variant-numeric:tabular-nums lining-nums}
.kicker{
font-family:var(--mono);font-size:var(--step--1);
letter-spacing:.22em;text-transform:uppercase;color:var(--accent);font-weight:600;
}
h1,h2,h3,h4{font-family:var(--serif);font-weight:700;line-height:1.06;letter-spacing:-.01em}
code{font-family:var(--mono);font-size:.88em;background:var(--surface-2);
padding:.06em .36em;border-radius:4px;color:var(--accent-ink);border:1px solid var(--border)}
/* =========================================================================
MASTHEAD
========================================================================= */
.masthead{position:relative;padding:clamp(2.4rem,6vw,5rem) 0 0}
.masthead .topline{
display:flex;flex-wrap:wrap;gap:.6rem 1.4rem;align-items:baseline;
font-family:var(--mono);font-size:var(--step--1);
color:var(--muted);letter-spacing:.04em;
border-bottom:1px solid var(--border-strong);
padding-bottom:.9rem;margin-bottom:clamp(1.6rem,4vw,2.8rem);
}
.masthead .topline strong{color:var(--ink);font-weight:600}
.masthead .topline .sep{color:var(--faint)}
.masthead .doc-id{margin-left:auto;color:var(--accent)}
.masthead h1{font-size:var(--step-4);margin:0 0 .5rem;max-width:16ch}
.masthead h1 .accent{color:var(--accent)}
.masthead .sub{
font-family:var(--mono);color:var(--muted);font-size:var(--step-0);letter-spacing:.02em;
}
.masthead .lede{
margin:1.6rem 0 0;max-width:60ch;font-size:var(--step-1);line-height:1.45;
color:var(--ink-soft);font-family:var(--serif);
}
.masthead .lede b{color:var(--ink)}
/* a tiny "read this like a map" orientation strip */
.compass{
display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1.7rem;
font-family:var(--mono);font-size:var(--step--1);
}
.compass a{
text-decoration:none;color:var(--ink-soft);
border:1px solid var(--border);background:var(--surface);
padding:.34em .7em;border-radius:99px;display:inline-flex;gap:.45rem;align-items:center;
transition:border-color .18s ease, color .18s ease;
}
.compass a:hover{border-color:var(--accent);color:var(--accent-ink)}
.compass a .n{color:var(--accent);font-weight:700}
/* ---- language selector (segmented pill, matches mono label system) ----- */
.langbar{
position:absolute;top:clamp(1rem,3vw,1.8rem);right:clamp(1.1rem,4vw,3rem);
display:flex;align-items:center;gap:.55rem;z-index:5;
}
.langbar .lglabel{
font-family:var(--mono);font-size:.6rem;letter-spacing:.18em;text-transform:uppercase;
color:var(--faint);font-weight:700;
}
.langseg{
display:inline-flex;border:1px solid var(--border-strong);border-radius:99px;
background:var(--surface);box-shadow:var(--shadow);overflow:hidden;
padding:2px;gap:2px;
}
.langseg button{
appearance:none;border:0;cursor:pointer;background:transparent;
font-family:var(--mono);font-size:.72rem;font-weight:700;letter-spacing:.1em;
color:var(--muted);padding:.32em .82em;border-radius:99px;
transition:background-color .16s ease, color .16s ease;
line-height:1;
}
.langseg button:hover{color:var(--accent-ink)}
.langseg button[aria-pressed="true"]{
background:var(--accent);color:#fff;box-shadow:0 1px 6px -2px rgba(0,0,0,.4);
}
@media (prefers-color-scheme: dark){
.langseg button[aria-pressed="true"]{color:#15130f}
}
.langseg button:focus-visible{outline:2.5px solid var(--accent);outline-offset:2px}
@media(max-width:560px){
.langbar .lglabel{display:none}
.langbar{top:.7rem;right:.9rem}
}
/* =========================================================================
SECTION SHELL
========================================================================= */
section{padding:clamp(2.6rem,6vw,4.4rem) 0;border-top:1px solid var(--rule)}
.sec-head{display:flex;align-items:baseline;gap:1rem;margin-bottom:2rem;flex-wrap:wrap}
.sec-head .tag{
font-family:var(--mono);font-weight:700;font-size:var(--step--1);
color:var(--bg);background:var(--ink);
padding:.28em .7em;border-radius:3px;letter-spacing:.1em;flex:none;
}
.sec-head h2{font-size:var(--step-3);margin:0;max-width:24ch}
.sec-head .note{
margin-left:auto;font-family:var(--mono);font-size:var(--step--1);
color:var(--muted);align-self:flex-end;text-align:right;max-width:36ch;line-height:1.5;
}
/* =========================================================================
SECTION 1 — ELEVATOR PITCH (split: chat -> org)
========================================================================= */
.pitch{
display:grid;grid-template-columns:1fr;gap:0;
border:1px solid var(--border);border-radius:14px;overflow:hidden;
box-shadow:var(--shadow-lift);background:var(--surface);
}
@media(min-width:760px){.pitch{grid-template-columns:.85fr 1.15fr}}
.pitch .was{
padding:clamp(1.6rem,4vw,2.6rem);
background:repeating-linear-gradient(135deg, var(--surface-2) 0 2px, transparent 2px 9px), var(--surface);
}
.pitch .lab{
font-family:var(--mono);font-size:var(--step--1);
text-transform:uppercase;letter-spacing:.16em;font-weight:700;margin-bottom:.9rem;display:block;
}
.pitch .was .lab{color:var(--muted)}
.pitch .is{padding:clamp(1.6rem,4vw,2.6rem);background:var(--ink);color:var(--bg);position:relative}
.pitch .is .lab{color:var(--accent)}
.pitch blockquote{margin:0;font-family:var(--serif);
font-size:clamp(1.2rem,1rem+1vw,1.6rem);line-height:1.4;letter-spacing:-.01em}
.pitch .was blockquote{color:var(--ink-soft)}
.pitch .was em{font-style:italic;color:var(--muted)}
.pitch .is em{font-style:normal;font-weight:700;color:var(--accent-ink)}
.pitch .oneline{
margin-top:1.2rem;padding-top:1rem;border-top:1px dashed rgba(255,255,255,.22);
font-family:var(--mono);font-size:var(--step--1);letter-spacing:.02em;color:var(--bg);opacity:.92;
}
@media(prefers-color-scheme: dark){.pitch .oneline{border-top-color:rgba(0,0,0,.4)}}
.pitch .arrow-chip{
position:absolute;left:-18px;top:50%;transform:translateY(-50%);
width:36px;height:36px;border-radius:50%;background:var(--accent);color:#fff;
display:grid;place-items:center;font-weight:700;box-shadow:0 6px 18px -6px rgba(0,0,0,.5);
}
@media(max-width:759px){.pitch .arrow-chip{left:50%;top:-18px;transform:translateX(-50%) rotate(90deg)}}
/* the "what it plugs into" micro-facts under the pitch */
.facts{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:18px}
@media(max-width:620px){.facts{grid-template-columns:1fr}}
.fact{background:var(--surface);border:1px solid var(--border);border-radius:11px;
padding:1rem 1.1rem;box-shadow:var(--shadow)}
.fact .ic{color:var(--accent);margin-bottom:.5rem;display:block}
.fact h3{font-size:var(--step-0);margin:0 0 .15rem;font-family:var(--serif)}
.fact p{margin:0;font-size:var(--step--1);color:var(--muted);line-height:1.45}
.fact p code{font-size:.92em}
/* =========================================================================
SECTION 2 — FIVE PILLARS (cards)
========================================================================= */
.pillars{display:grid;gap:14px;grid-template-columns:repeat(6,1fr)}
.pillar{
grid-column:span 2;
background:var(--surface);border:1px solid var(--border);border-radius:13px;
border-top:3px solid var(--accent);box-shadow:var(--shadow);
padding:1.2rem 1.25rem 1.3rem;display:flex;flex-direction:column;
}
/* first two cards take half-width each on the top row for rhythm */
.pillar.wide{grid-column:span 3}
@media(max-width:880px){.pillar,.pillar.wide{grid-column:span 3}}
@media(max-width:560px){.pillar,.pillar.wide{grid-column:span 6}}
.pillar .pnum{
font-family:var(--mono);font-size:var(--step--1);font-weight:700;letter-spacing:.14em;
color:var(--accent);text-transform:uppercase;
}
.pillar .phead{display:flex;align-items:center;gap:.7rem;margin:.5rem 0 .4rem}
.pillar .pic{
width:34px;height:34px;border-radius:9px;flex:none;display:grid;place-items:center;
background:var(--accent-wash);color:var(--accent-ink);border:1px solid var(--border);
}
.pillar h3{font-size:var(--step-1);margin:0;line-height:1.1}
.pillar p{margin:0;color:var(--ink-soft);font-size:var(--step--1);line-height:1.55}
.pillar p b{color:var(--ink)}
.pillar .tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.8rem}
.pillar .tags span{
font-family:var(--mono);font-size:.66rem;letter-spacing:.04em;
background:var(--surface-2);border:1px solid var(--border);color:var(--ink-soft);
padding:.28em .55em;border-radius:5px;
}
/* =========================================================================
SECTION 3 — THE ROSTER (role cards, RO/RW encoded)
========================================================================= */
.access-legend{
display:flex;flex-wrap:wrap;gap:.7rem 1.2rem;margin-bottom:1.3rem;
font-family:var(--mono);font-size:var(--step--1);color:var(--muted);align-items:center;
}
.access-legend .lg{display:inline-flex;align-items:center;gap:.45rem}
.access-legend .sw{width:13px;height:13px;border-radius:4px;flex:none}
.access-legend .sw.ro{background:var(--ro)}
.access-legend .sw.rw{background:var(--rw)}
.access-legend .sw.prop{background:var(--slate)}
.roster{display:grid;gap:13px;grid-template-columns:repeat(4,1fr)}
@media(max-width:900px){.roster{grid-template-columns:repeat(2,1fr)}}
@media(max-width:480px){.roster{grid-template-columns:1fr}}
.role{
background:var(--surface);border:1px solid var(--border);border-radius:12px;
box-shadow:var(--shadow);padding:1rem 1.05rem 1.05rem;
display:flex;flex-direction:column;position:relative;overflow:hidden;
}
.role::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px}
.role[data-a="ro"]::before{background:var(--ro)}
.role[data-a="rw"]::before{background:var(--rw)}
.role[data-a="prop"]::before{background:var(--slate)}
.role .rtop{display:flex;align-items:flex-start;gap:.6rem;margin-bottom:.5rem}
.role .ric{
width:30px;height:30px;border-radius:8px;flex:none;display:grid;place-items:center;
background:var(--surface-2);border:1px solid var(--border);color:var(--ink-soft);
}
.role h3{font-size:var(--step-0);margin:0;line-height:1.15;flex:1;font-family:var(--serif)}
.role .badge{
font-family:var(--mono);font-size:.6rem;font-weight:700;letter-spacing:.08em;
padding:.24em .5em;border-radius:99px;border:1px solid currentColor;white-space:nowrap;flex:none;
}
.role[data-a="ro"] .badge{color:var(--ro)}
.role[data-a="rw"] .badge{color:var(--rw)}
.role[data-a="prop"] .badge{color:var(--slate)}
.role p{margin:0;color:var(--muted);font-size:var(--step--1);line-height:1.45}
.role .em-tag{
margin-top:.7rem;font-family:var(--mono);font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;
color:var(--accent);font-weight:700;
}
/* the key-principle banner under the roster */
.principle{
margin-top:18px;border:1px solid var(--border);border-radius:14px;overflow:hidden;
background:
radial-gradient(120% 140% at 0% 0%, var(--accent-wash) 0%, transparent 55%),
var(--surface);
box-shadow:var(--shadow);display:grid;grid-template-columns:auto 1fr;align-items:center;
}
@media(max-width:640px){.principle{grid-template-columns:1fr}}
.principle .lock{
padding:clamp(1.2rem,3vw,1.8rem);display:grid;place-items:center;
border-right:1px solid var(--border);color:var(--accent);
}
@media(max-width:640px){.principle .lock{border-right:none;border-bottom:1px solid var(--border)}}
.principle .ptxt{padding:clamp(1.2rem,3vw,1.8rem)}
.principle .pk{font-family:var(--mono);font-size:var(--step--1);letter-spacing:.14em;
text-transform:uppercase;color:var(--accent);font-weight:700;display:block;margin-bottom:.5rem}
.principle blockquote{margin:0;font-family:var(--serif);
font-size:clamp(1.15rem,.9rem+1vw,1.5rem);line-height:1.35;color:var(--ink)}
.principle blockquote b{color:var(--accent-ink)}
/* =========================================================================
SECTION 4 — THE SELF-IMPROVING LOOP (centerpiece ring)
========================================================================= */
.loop-wrap{
border:1px solid var(--border);border-radius:16px;
background:
radial-gradient(120% 120% at 50% 0%, var(--accent-wash) 0%, transparent 55%),
var(--surface);
box-shadow:var(--shadow-lift);
padding:clamp(1.4rem,4vw,2.4rem);overflow:hidden;position:relative;
}
.loop-wrap::before{
content:"";position:absolute;inset:0;pointer-events:none;
background-image:
linear-gradient(to right, var(--rule) 1px, transparent 1px),
linear-gradient(to bottom, var(--rule) 1px, transparent 1px);
background-size:34px 34px;opacity:.16;
mask-image:radial-gradient(80% 70% at 50% 45%, transparent 30%, #000 95%);
-webkit-mask-image:radial-gradient(80% 70% at 50% 45%, transparent 30%, #000 95%);
}
.loop-grid{display:grid;gap:clamp(1.2rem,3vw,2rem);grid-template-columns:1fr;
align-items:center;position:relative;z-index:1}
@media(min-width:880px){.loop-grid{grid-template-columns:minmax(0,430px) 1fr}}
.ring{position:relative;width:100%;max-width:430px;margin:0 auto;aspect-ratio:1/1}
.ring > svg{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.ring .hub{
position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
width:40%;aspect-ratio:1/1;border-radius:50%;
background:var(--ink);color:var(--bg);
display:flex;flex-direction:column;align-items:center;justify-content:center;
text-align:center;padding:.6rem;box-shadow:var(--shadow-lift);border:2px solid var(--accent);
}
.ring .hub .hk{font-family:var(--mono);font-size:.56rem;letter-spacing:.2em;text-transform:uppercase;color:var(--accent)}
.ring .hub .ht{font-family:var(--serif);font-weight:700;font-size:clamp(.9rem,.6rem+1.6vw,1.25rem);line-height:1.05;margin-top:.25rem}
.ring .hub .hsub{font-family:var(--mono);font-size:.55rem;letter-spacing:.02em;color:var(--bg);opacity:.62;margin-top:.3rem;line-height:1.3}
.ring .node{
position:absolute;width:30%;transform:translate(-50%,-50%);
background:var(--surface);border:1px solid var(--border-strong);
border-top:3px solid var(--accent);border-radius:11px;
padding:.55rem .5rem .6rem;text-align:center;box-shadow:var(--shadow);
}
.ring .node .nstep{font-family:var(--mono);font-size:.55rem;font-weight:700;letter-spacing:.1em;color:var(--accent);text-transform:uppercase}
.ring .node .ntitle{font-family:var(--serif);font-weight:700;font-size:.92rem;line-height:1.05;margin-top:.1rem}
.ring .node .nicon{display:block;margin:0 auto .15rem;color:var(--accent)}
.ring .node.n1{left:50%;top:6%}
.ring .node.n2{left:94%;top:38%}
.ring .node.n3{left:78%;top:90%}
.ring .node.n4{left:22%;top:90%}
.ring .node.n5{left:6%;top:38%}
.ring .gate{
position:absolute;left:13%;top:14%;transform:translate(-50%,-50%);
display:flex;flex-direction:column;align-items:center;gap:.18rem;
background:var(--bad);color:#fff;border-radius:9px;padding:.4rem .55rem;
box-shadow:0 8px 20px -8px rgba(0,0,0,.5);max-width:8.5rem;text-align:center;
border:1px solid rgba(255,255,255,.2);
}
.ring .gate .gk{font-family:var(--mono);font-size:.5rem;letter-spacing:.16em;text-transform:uppercase;opacity:.9}
.ring .gate .gt{font-family:var(--mono);font-weight:700;font-size:.62rem;letter-spacing:.02em;line-height:1.2}
@media(prefers-color-scheme: dark){.ring .gate{color:#15130f}}
.loop-stages{display:grid;gap:.65rem}
.lstage{
display:grid;grid-template-columns:auto 1fr;gap:.85rem;align-items:start;
background:var(--surface);border:1px solid var(--border);border-radius:10px;
padding:.7rem .9rem;box-shadow:var(--shadow);
}
.lstage .ord{
font-family:var(--serif);font-weight:700;font-size:1.3rem;line-height:1;color:var(--accent);
width:1.4rem;text-align:center;flex:none;border-right:1px solid var(--border);
padding-right:.85rem;align-self:stretch;display:flex;align-items:center;
}
.lstage[data-gate="1"] .ord{color:var(--bad);border-right-color:var(--bad)}
.lstage h4{margin:0;font-family:var(--serif);font-size:var(--step-0);font-weight:700;line-height:1.2}
.lstage h4 .gateflag{
font-family:var(--mono);font-size:.56rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
color:var(--bad);border:1px solid var(--bad);border-radius:99px;padding:.12em .5em;margin-left:.5rem;
vertical-align:.12em;white-space:nowrap;
}
.lstage p{margin:.25rem 0 0;font-size:var(--step--1);line-height:1.5;color:var(--ink-soft)}
.lstage p b{color:var(--ink)}
.loop-cap{
margin-top:1.2rem;font-family:var(--serif);font-size:var(--step-1);line-height:1.4;
color:var(--ink-soft);max-width:62ch;text-align:center;margin-left:auto;margin-right:auto;
}
.loop-cap b{color:var(--accent-ink)}
/* =========================================================================
SECTION 5 — MEMORY ARCHITECTURE (layered stack)
========================================================================= */
.mem-grid{display:grid;gap:clamp(1.2rem,3vw,2rem);grid-template-columns:1fr;align-items:center}
@media(min-width:860px){.mem-grid{grid-template-columns:minmax(0,420px) 1fr}}
.mem-stack{display:grid;gap:12px}
.stratum{
position:relative;border:1px solid var(--border);border-radius:12px;overflow:hidden;
background:var(--surface);box-shadow:var(--shadow);padding:1rem 1.15rem;
border-left:5px solid var(--slate);
}
.stratum[data-l="sem"]{border-left-color:var(--accent)}
.stratum[data-l="epi"]{border-left-color:var(--slate)}
.stratum[data-l="proc"]{border-left-color:var(--ro)}
.stratum .shead{display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap}
.stratum .stype{font-family:var(--mono);font-size:.62rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase}
.stratum[data-l="sem"] .stype{color:var(--accent)}
.stratum[data-l="epi"] .stype{color:var(--slate)}
.stratum[data-l="proc"] .stype{color:var(--ro)}
.stratum h3{font-size:var(--step-1);margin:0;font-family:var(--serif)}
.stratum .when{margin-left:auto;font-family:var(--mono);font-size:.62rem;color:var(--muted);letter-spacing:.04em}
.stratum p{margin:.45rem 0 0;font-size:var(--step--1);line-height:1.5;color:var(--ink-soft)}
.stratum p b{color:var(--ink)}
.stratum .ex{
margin-top:.6rem;font-family:var(--mono);font-size:.7rem;line-height:1.5;color:var(--muted);
background:var(--surface-2);border:1px dashed var(--border-strong);border-radius:7px;padding:.5rem .65rem;
}
.stratum .ex .fk{color:var(--accent-ink)}
.mem-note{display:grid;gap:1rem}
.mem-note .big{font-family:var(--serif);font-size:var(--step-2);line-height:1.2;margin:0;color:var(--ink)}
.mem-note .big .accent{color:var(--accent)}
.mem-note p{margin:0;color:var(--ink-soft);font-size:var(--step-0);line-height:1.6;max-width:54ch}
.mem-note p b{color:var(--ink)}
.timecard{
border:1px solid var(--border);border-left:4px solid var(--warn);border-radius:0 10px 10px 0;
background:var(--surface);padding:.8rem 1rem;box-shadow:var(--shadow);
}
.timecard .tk{font-family:var(--mono);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;
color:var(--warn);font-weight:700;display:block;margin-bottom:.3rem}
.timecard p{font-size:var(--step--1);color:var(--ink-soft);margin:0;line-height:1.5}
/* =========================================================================
SECTION 6 — HOW SETUP WORKS (flow timeline)
========================================================================= */
.setup{display:grid;gap:0;position:relative}
.setup .sline{position:absolute;left:23px;top:18px;bottom:18px;width:2px;
background:linear-gradient(to bottom,var(--accent),var(--ro));opacity:.55}
@media(max-width:640px){.setup .sline{left:19px}}
.sstep{display:grid;grid-template-columns:48px 1fr;gap:1rem;padding:.55rem 0;position:relative}
@media(max-width:640px){.sstep{grid-template-columns:40px 1fr}}
.sstep .dot{
width:48px;height:48px;border-radius:50%;flex:none;display:grid;place-items:center;
background:var(--surface);border:2px solid var(--accent);color:var(--accent);
font-family:var(--serif);font-weight:700;font-size:1.3rem;z-index:1;box-shadow:var(--shadow);
}
@media(max-width:640px){.sstep .dot{width:40px;height:40px;font-size:1.05rem}}
.sstep .scard{
background:var(--surface);border:1px solid var(--border);border-radius:12px;
padding:.9rem 1.1rem;box-shadow:var(--shadow);margin:.1rem 0 .6rem;
}
.sstep .scard h3{font-size:var(--step-1);margin:0 0 .25rem;font-family:var(--serif)}
.sstep .scard p{margin:0;color:var(--ink-soft);font-size:var(--step--1);line-height:1.55}
.sstep .scard p b{color:var(--ink)}
.sstep .phasetag{
font-family:var(--mono);font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;
color:var(--muted);font-weight:700;display:inline-block;margin-bottom:.3rem;
}
.motto{
margin-top:1.4rem;border:1px solid var(--border);border-radius:14px;
background:var(--ink);color:var(--bg);padding:1.2rem 1.4rem;
font-family:var(--serif);font-size:var(--step-1);line-height:1.35;text-align:center;
}
.motto em{font-style:normal;color:var(--accent)}
/* =========================================================================
SECTION 7 — PRINCIPLES & ANTI-PATTERNS (two columns)
========================================================================= */
.dodont{display:grid;gap:18px;grid-template-columns:1fr}
@media(min-width:760px){.dodont{grid-template-columns:1fr 1fr}}
.col-card{border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--shadow);background:var(--surface)}
.col-card .ch{padding:1rem 1.2rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.6rem}
.col-card .ch h3{font-size:var(--step-1);margin:0;font-family:var(--serif)}
.col-card .ch .chk{font-family:var(--mono);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;font-weight:700}
.col-card.do .ch{background:linear-gradient(180deg,var(--ro-wash),transparent 180%)}
.col-card.do .ch .chk{color:var(--good)}
.col-card.dont .ch{background:linear-gradient(180deg,var(--rw-wash),transparent 180%)}
.col-card.dont .ch .chk{color:var(--bad)}
.col-card ul{margin:0;padding:1rem 1.2rem 1.2rem;list-style:none;display:grid;gap:.7rem}
.col-card li{display:grid;grid-template-columns:auto 1fr;gap:.65rem;align-items:start;
font-size:var(--step--1);line-height:1.5;color:var(--ink-soft)}
.col-card li .m{font-family:var(--mono);font-weight:700;flex:none;line-height:1.5}
.col-card.do li .m{color:var(--good)}
.col-card.dont li .m{color:var(--bad)}
.col-card li b{color:var(--ink)}
.col-card.dont li .rj{color:var(--muted);text-decoration:line-through;
text-decoration-color:var(--border-strong);text-decoration-thickness:1px}
.col-card li code{font-size:.92em}
/* =========================================================================
FOOTER
========================================================================= */
footer{border-top:1px solid var(--border-strong);padding:2.4rem 0 4rem;margin-top:1rem}
footer .fnote{font-family:var(--mono);font-size:var(--step--1);color:var(--muted);line-height:1.7;max-width:80ch}
footer .fnote b{color:var(--ink-soft)}
footer .fnote .prims{color:var(--accent-ink)}
footer .sig{
margin-top:1.4rem;display:flex;flex-wrap:wrap;gap:.5rem 1.2rem;align-items:center;
font-family:var(--mono);font-size:var(--step--1);color:var(--faint);
}
footer .sig .dot{width:6px;height:6px;border-radius:50%;background:var(--accent)}
/* =========================================================================
MOTION — single calm reveal, reduced-motion safe
========================================================================= */
@media (prefers-reduced-motion: no-preference){
.reveal{opacity:0;transform:translateY(12px);transition:opacity .6s ease, transform .6s cubic-bezier(.2,.7,.2,1)}
.reveal.in{opacity:1;transform:none}
}
/* =========================================================================
DARK-MODE CONTRAST FIX
The "inverted highlight" blocks use background:var(--ink);color:var(--bg),
which in dark mode turns into a cream box (light --ink) with washed-out
orange accents. Re-skin them as dark surfaces so they fit the dark theme
and the orange/text regain full contrast. Light mode is unaffected.
========================================================================= */
@media (prefers-color-scheme: dark){
.pitch .is,
.ring .hub,
.motto{ background:var(--surface-2); color:var(--ink); }
.pitch .is .oneline{ color:var(--ink-soft); opacity:1; border-top-color:var(--border); }
.ring .hub .hsub{ color:var(--ink-soft); opacity:1; }
.sec-head .tag{ background:var(--accent-wash); color:var(--accent-ink); }
}
/* =========================================================================
PRINT
========================================================================= */
@media print{
:root{--bg:#fff;--surface:#fff;--surface-2:#f4f4f4;--ink:#000;--ink-soft:#222;--muted:#555;--border:#bbb;--rule:#ddd}
body{background:#fff}
body::before{display:none}
section{page-break-inside:avoid;border-top:1px solid #ccc}
.pillar,.role,.fact,.lstage,.stratum,.sstep .scard,.col-card,.loop-wrap,.pitch,.principle{box-shadow:none}
.reveal{opacity:1!important;transform:none!important}
.pitch .is,.motto{background:#111 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.compass,.langbar{display:none}
}
</style>
</head>
<body>
<a class="skip" href="#main" data-i18n data-en="Skip to content" data-de="Zum Inhalt springen">Skip to content</a>
<!-- ============================ MASTHEAD ============================ -->
<header class="masthead wrap">
<div class="langbar" role="group"
data-en-aria="Language" data-de-aria="Sprache" aria-label="Language">
<span class="lglabel" data-i18n data-en="Language" data-de="Sprache">Language</span>
<div class="langseg">
<button type="button" id="lang-en" data-lang="en" aria-pressed="true"
data-en-aria="Switch to English" data-de-aria="Auf Englisch umschalten"
aria-label="Switch to English">EN</button>
<button type="button" id="lang-de" data-lang="de" aria-pressed="false"
data-en-aria="Switch to German" data-de-aria="Auf Deutsch umschalten"
aria-label="Switch to German">DE</button>
</div>
</div>
<div class="topline">
<span><strong data-i18n data-en="YOUR AGENTIC ENVIRONMENT" data-de="DEINE AGENTISCHE UMGEBUNG">YOUR AGENTIC ENVIRONMENT</strong></span>
<span class="sep">/</span>
<span data-i18n data-en="A Field Guide" data-de="Ein Feldführer">A Field Guide</span>
<span class="sep">/</span>
<span data-i18n data-en="Companion to the setup doc" data-de="Begleiter zur Setup-Anleitung">Companion to the setup doc</span>
<span class="doc-id num">ORIENT·01</span>
</div>
<h1 data-i18n
data-en="Your Agentic Environment — <span class=&quot;accent&quot;>A Field Guide</span>"
data-de="Deine agentische Umgebung — <span class=&quot;accent&quot;>ein Feldführer</span>">Your Agentic Environment — <span class="accent">A Field Guide</span></h1>
<p class="sub" data-i18n
data-en="A personal team of AI experts for your homelab, code, and ideas"
data-de="Ein persönliches Team aus KI-Experten für dein Homelab, deinen Code und deine Ideen">A personal team of AI experts for your homelab, code, and ideas</p>
<p class="lede" data-i18n
data-en="Before your AI walks you through building it, here's the <b>shape</b> of the thing: what it is, why it's built this way, and how the pieces fit. This is the <b>what &amp; why</b> — not the how. Read it like a map."
data-de="Bevor deine KI dich Schritt für Schritt durch den Aufbau führt, kommt hier die <b>grobe Form</b> des Ganzen: was es ist, warum es so gebaut ist und wie die Teile zusammenpassen. Das hier ist das <b>Was &amp; Warum</b> — nicht das Wie. Lies es wie eine Landkarte.">Before your AI walks you through building it, here's the <b>shape</b> of the
thing: what it is, why it's built this way, and how the pieces fit. This is the
<b>what &amp; why</b> — not the how. Read it like a map.</p>
<nav class="compass" aria-label="Jump to a section"
data-en-aria="Jump to a section" data-de-aria="Zu einem Abschnitt springen">
<a href="#what"><span class="n">1</span> <span data-i18n data-en="What it is" data-de="Was es ist">What it is</span></a>
<a href="#pillars"><span class="n">2</span> <span data-i18n data-en="Five pillars" data-de="Fünf Säulen">Five pillars</span></a>
<a href="#roster"><span class="n">3</span> <span data-i18n data-en="The roster" data-de="Das Team">The roster</span></a>
<a href="#loop"><span class="n">4</span> <span data-i18n data-en="The loop" data-de="Der Kreislauf">The loop</span></a>
<a href="#memory"><span class="n">5</span> <span data-i18n data-en="Memory" data-de="Gedächtnis">Memory</span></a>
<a href="#setup"><span class="n">6</span> <span data-i18n data-en="Setup" data-de="Setup">Setup</span></a>
<a href="#principles"><span class="n">7</span> <span data-i18n data-en="Do &amp; avoid" data-de="Tun &amp; meiden">Do &amp; avoid</span></a>
</nav>
</header>
<main class="wrap" id="main">
<!-- ============================ SECTION 1 ============================ -->
<section id="what" aria-labelledby="s1-h">
<div class="sec-head">
<span class="tag">1</span>
<h2 id="s1-h" data-i18n data-en="What this is" data-de="Was das ist">What this is</h2>
<p class="note" data-i18n
data-en="The elevator pitch — one idea, two states."
data-de="Der Elevator-Pitch — eine Idee, zwei Zustände.">The elevator pitch — one idea, two states.</p>
</div>
<div class="pitch reveal">
<div class="was">
<span class="lab" data-i18n data-en="Instead of" data-de="Statt">Instead of</span>
<blockquote data-i18n
data-en="One <em>general AI chat</em> that forgets, doesn't know your rules, and answers from a blank slate every time."
data-de="Einem <em>allgemeinen KI-Chat</em>, der vergisst, deine Regeln nicht kennt und jedes Mal bei null anfängt.">One <em>general AI chat</em> that forgets, doesn't know your rules, and answers from a blank slate every time.</blockquote>
</div>
<div class="is">
<span class="arrow-chip" aria-hidden="true">&rarr;</span>
<span class="lab" data-i18n data-en="You get" data-de="Bekommst du">You get</span>
<blockquote data-i18n
data-en="A <em>versioned, personal team of specialized AI agents</em> that share memory, follow your rules, and get sharper over time."
data-de="Ein <em>versioniertes, persönliches Team spezialisierter KI-Agenten</em>, die sich ein Gedächtnis teilen, deinen Regeln folgen und mit der Zeit schärfer werden.">A <em>versioned, personal team of specialized AI agents</em> that share memory, follow your rules, and get sharper over time.</blockquote>
<p class="oneline" data-i18n
data-en="Not a chatbot — a small, governed, self-improving AI org that's yours."
data-de="Kein Chatbot — eine kleine, geregelte, sich selbst verbessernde KI-Organisation, die dir gehört.">Not a chatbot — a small, governed, self-improving AI org that's yours.</p>
</div>
</div>
<div class="facts">
<div class="fact reveal">
<svg class="ic" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3v6a3 3 0 0 0 6 0V3"/><path d="M18 21v-6a3 3 0 0 0-6 0v6"/><circle cx="6" cy="3" r="1.4"/><circle cx="18" cy="21" r="1.4"/></svg>
<h3 data-i18n data-en="It lives in a git repo" data-de="Es lebt in einem git-Repo">It lives in a git repo</h3>
<p data-i18n
data-en="Versioned and backed up from day one — you can read it, diff it, and roll it back."
data-de="Vom ersten Tag an versioniert und gesichert — du kannst es lesen, vergleichen und zurückrollen.">Versioned and backed up from day one — you can read it, diff it, and roll it back.</p>
</div>
<div class="fact reveal">
<svg class="ic" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="14" rx="2"/><path d="M7 9l3 3-3 3M13 15h4"/></svg>
<h3 data-i18n data-en="It plugs into Claude Code" data-de="Es klinkt sich in Claude Code ein">It plugs into Claude Code</h3>
<p data-i18n
data-en="Built on familiar primitives — subagents, slash commands, hooks. <code>No new app</code>."
data-de="Baut auf bekannten Bausteinen auf — Subagenten, Slash-Befehlen, Hooks. <code>Keine neue App</code>.">Built on familiar primitives — subagents, slash commands, hooks. <code>No new app</code>.</p>
</div>
<div class="fact reveal">
<svg class="ic" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path d="M12 12v9M12 12l8-4.5M12 12L4 7.5"/></svg>
<h3 data-i18n data-en="It adapts to YOUR stack" data-de="Es passt sich DEINEM Stack an">It adapts to YOUR stack</h3>
<p data-i18n
data-en="Nothing here is prescribed — your AI interviews you and tailors every specific."
data-de="Nichts davon ist vorgeschrieben — deine KI befragt dich und schneidert jedes Detail auf dich zu.">Nothing here is prescribed — your AI interviews you and tailors every specific.</p>
</div>
</div>
</section>
<!-- ============================ SECTION 2 ============================ -->
<section id="pillars" aria-labelledby="s2-h">
<div class="sec-head">
<span class="tag">2</span>
<h2 id="s2-h" data-i18n data-en="The five pillars" data-de="Die fünf Säulen">The five pillars</h2>
<p class="note" data-i18n
data-en="Five ideas hold the whole thing up. Everything else is detail."
data-de="Fünf Ideen tragen das Ganze. Alles andere ist Detail.">Five ideas hold the whole thing up. Everything else is detail.</p>
</div>
<div class="pillars">
<article class="pillar wide reveal">
<span class="pnum" data-i18n data-en="Pillar 01" data-de="Säule 01">Pillar 01</span>
<div class="phead">
<span class="pic" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="3.2"/><circle cx="17" cy="8" r="2.4"/><path d="M2.5 19a5.5 5.5 0 0 1 11 0M14.5 19a4.5 4.5 0 0 1 7 0"/></svg></span>
<h3 data-i18n data-en="Expert subagents" data-de="Spezialisierte Subagenten">Expert subagents</h3>
</div>
<p data-i18n
data-en="Narrow, <b>role-scoped specialists</b> instead of one do-everything prompt. The infra agent thinks like an ops engineer; the security auditor thinks like an adversary. Each is good at its lane and stays in it."
data-de="Schmale, <b>auf ihre Rolle zugeschnittene Spezialisten</b> statt eines Alleskönner-Prompts. Der Infra-Agent denkt wie ein Ops-Engineer; der Security-Auditor denkt wie ein Angreifer. Jeder ist gut in seiner Spur — und bleibt drin.">Narrow, <b>role-scoped specialists</b> instead of one do-everything prompt. The infra
agent thinks like an ops engineer; the security auditor thinks like an adversary. Each
is good at its lane and stays in it.</p>
<div class="tags"><span data-i18n data-en="scoped roles" data-de="klare Rollen">scoped roles</span><span data-i18n data-en="no jack-of-all-trades" data-de="kein Allrounder">no jack-of-all-trades</span></div>
</article>
<article class="pillar wide reveal">
<span class="pnum" data-i18n data-en="Pillar 02" data-de="Säule 02">Pillar 02</span>
<div class="phead">
<span class="pic" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7c0-1.5 3.6-2.5 8-2.5S20 5.5 20 7s-3.6 2.5-8 2.5S4 8.5 4 7z"/><path d="M4 7v10c0 1.5 3.6 2.5 8 2.5s8-1 8-2.5V7M4 12c0 1.5 3.6 2.5 8 2.5s8-1 8-2.5"/></svg></span>
<h3 data-i18n data-en="Layered memory" data-de="Gedächtnis in Schichten">Layered memory</h3>
</div>
<p data-i18n
data-en="<b>Semantic</b> (facts that are true now) + <b>episodic</b> (a decision journal) + <b>procedural</b> (skills &amp; checklists) — with <b>time-awareness</b> so it doesn't silently go stale and start lying to you."
data-de="<b>Semantisch</b> (Fakten, die jetzt stimmen) + <b>episodisch</b> (ein Entscheidungs-Journal) + <b>prozedural</b> (Skills &amp; Checklisten) — mit <b>Zeitbewusstsein</b>, damit es nicht klammheimlich veraltet und anfängt, dich anzulügen."><b>Semantic</b> (facts that are true now) + <b>episodic</b> (a decision journal) +
<b>procedural</b> (skills &amp; checklists) — with <b>time-awareness</b> so it doesn't
silently go stale and start lying to you.</p>
<div class="tags"><span data-i18n data-en="semantic" data-de="semantisch">semantic</span><span data-i18n data-en="episodic" data-de="episodisch">episodic</span><span data-i18n data-en="procedural" data-de="prozedural">procedural</span><span data-i18n data-en="+ time-aware" data-de="+ zeitbewusst">+ time-aware</span></div>
</article>
<article class="pillar reveal">
<span class="pnum" data-i18n data-en="Pillar 03" data-de="Säule 03">Pillar 03</span>
<div class="phead">
<span class="pic" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l7 3v5c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6z"/><path d="M9 12l2 2 4-4"/></svg></span>
<h3 data-i18n data-en="Governance" data-de="Governance">Governance</h3>
</div>
<p data-i18n
data-en="Always-on rules: <b>no silent behaviour changes</b>, strict <b>secret hygiene</b>, and <b>human approval</b> for anything risky."
data-de="Immer geltende Regeln: <b>keine heimlichen Verhaltensänderungen</b>, strenge <b>Geheimnis-Hygiene</b> und <b>menschliche Freigabe</b> für alles Riskante.">Always-on rules: <b>no silent behaviour changes</b>, strict <b>secret hygiene</b>, and
<b>human approval</b> for anything risky.</p>
<div class="tags"><span data-i18n data-en="your rules" data-de="deine Regeln">your rules</span><span data-i18n data-en="secrets stay safe" data-de="Geheimnisse bleiben sicher">secrets stay safe</span></div>
</article>
<article class="pillar reveal">
<span class="pnum" data-i18n data-en="Pillar 04" data-de="Säule 04">Pillar 04</span>
<div class="phead">
<span class="pic" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 12a8 8 0 1 1-2.3-5.6"/><path d="M20 4v4h-4"/></svg></span>
<h3 data-i18n data-en="Self-improving loop" data-de="Selbstverbessernder Kreislauf">Self-improving loop</h3>
</div>
<p data-i18n
data-en="Agents flag friction &rarr; you run a periodic review &rarr; they get coached and improve. <b>Compounding</b>, <b>human-triggered</b>, <b>no always-on daemon</b>."
data-de="Agenten melden Reibung &rarr; du startest ab und zu ein Review &rarr; sie werden gecoacht und verbessern sich. <b>Mit Zinseszins-Effekt</b>, <b>von dir ausgelöst</b>, <b>kein dauerhaft laufender Daemon</b>.">Agents flag friction &rarr; you run a periodic review &rarr; they get coached and
improve. <b>Compounding</b>, <b>human-triggered</b>, <b>no always-on daemon</b>.</p>
<div class="tags"><span data-i18n data-en="compounds" data-de="wächst mit">compounds</span><span data-i18n data-en="you trigger it" data-de="du löst es aus">you trigger it</span></div>
</article>
<article class="pillar reveal">
<span class="pnum" data-i18n data-en="Pillar 05" data-de="Säule 05">Pillar 05</span>
<div class="phead">
<span class="pic" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z"/><circle cx="12" cy="12" r="3"/></svg></span>
<h3 data-i18n data-en="Grounding" data-de="Bodenhaftung">Grounding</h3>
</div>
<p data-i18n
data-en="Agents look at <b>reality</b> — your repos, optionally live systems — instead of guessing. <b>You choose the blast radius.</b>"
data-de="Agenten schauen auf die <b>Realität</b> — deine Repos, optional laufende Systeme — statt zu raten. <b>Du bestimmst die Reichweite.</b>">Agents look at <b>reality</b> — your repos, optionally live systems — instead of
guessing. <b>You choose the blast radius.</b></p>
<div class="tags"><span data-i18n data-en="see, don't guess" data-de="hinschauen statt raten">see, don't guess</span><span data-i18n data-en="you set the limits" data-de="du setzt die Grenzen">you set the limits</span></div>
</article>
</div>
</section>
<!-- ============================ SECTION 3 ============================ -->
<section id="roster" aria-labelledby="s3-h">
<div class="sec-head">
<span class="tag">3</span>
<h2 id="s3-h" data-i18n data-en="The roster" data-de="Das Team">The roster</h2>
<p class="note" data-i18n
data-en="Who's on the team — and what each one is trusted to touch."
data-de="Wer im Team ist — und woran jeder ran darf.">Who's on the team — and what each one is trusted to touch.</p>
</div>
<div class="access-legend" aria-hidden="true">
<span class="lg"><span class="sw ro"></span><span data-i18n data-en="Read-only — looks, never edits" data-de="Nur-Lesen — schaut, ändert nie">Read-only — looks, never edits</span></span>
<span class="lg"><span class="sw rw"></span><span data-i18n data-en="Read + Write — can change files" data-de="Lesen + Schreiben — darf Dateien ändern">Read + Write — can change files</span></span>
<span class="lg"><span class="sw prop"></span><span data-i18n data-en="Proposes — suggests, never applies" data-de="Schlägt vor — empfiehlt, wendet nie an">Proposes — suggests, never applies</span></span>
</div>
<div class="roster">
<article class="role reveal" data-a="ro">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="12" rx="2"/><path d="M8 20h8M12 16v4"/></svg></span>
<h3 data-i18n data-en="Infra / Ops expert" data-de="Infra-/Ops-Experte">Infra / Ops expert</h3>
<span class="badge" data-i18n data-en="RO &rarr; RW" data-de="RO &rarr; RW">RO &rarr; RW</span>
</div>
<p data-i18n
data-en="Knows your homelab. Starts read-only; you decide if it earns write access."
data-de="Kennt dein Homelab. Startet nur lesend; du entscheidest, ob er sich Schreibrechte verdient.">Knows your homelab. Starts read-only; you decide if it earns write access.</p>
</article>
<article class="role reveal" data-a="rw">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 8l-4 4 4 4M16 8l4 4-4 4M13 5l-2 14"/></svg></span>
<h3 data-i18n data-en="Dev expert(s)" data-de="Dev-Experte(n)">Dev expert(s)</h3>
<span class="badge">RW</span>
</div>
<p data-i18n
data-en="Writes and refactors code in your repos, following your conventions."
data-de="Schreibt und refaktoriert Code in deinen Repos — und hält sich an deine Konventionen.">Writes and refactors code in your repos, following your conventions.</p>
</article>
<article class="role reveal" data-a="rw">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l2.5 5.5L20 9l-4 4 1 6-5-3-5 3 1-6-4-4 5.5-.5z"/></svg></span>
<h3 data-i18n data-en="UI / UX designer" data-de="UI-/UX-Designer">UI / UX designer</h3>
<span class="badge">RW</span>
</div>
<p data-i18n
data-en="Designs and builds interfaces with a committed point of view, not templates."
data-de="Entwirft und baut Interfaces mit einer klaren Haltung — keine Templates von der Stange.">Designs and builds interfaces with a committed point of view, not templates.</p>
</article>
<article class="role reveal" data-a="ro">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l7 3v5c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6z"/></svg></span>
<h3 data-i18n data-en="Security auditor" data-de="Security-Auditor">Security auditor</h3>
<span class="badge" data-i18n data-en="READ-ONLY" data-de="NUR-LESEN">READ-ONLY</span>
</div>
<p data-i18n
data-en="Hunts for risks and leaks. Reports them — never edits anything itself."
data-de="Jagt Risiken und Lecks. Meldet sie — ändert aber selbst nie etwas.">Hunts for risks and leaks. Reports them — never edits anything itself.</p>
</article>
<article class="role reveal" data-a="ro">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 9a2.5 2.5 0 1 1 3.4 2.3c-.6.3-.9.8-.9 1.7M12 17h.01"/><circle cx="12" cy="12" r="9"/></svg></span>
<h3 data-i18n data-en="Devil's advocate" data-de="Advocatus Diaboli">Devil's advocate</h3>
<span class="badge" data-i18n data-en="READ-ONLY" data-de="NUR-LESEN">READ-ONLY</span>
</div>
<p data-i18n
data-en="Argues the other side and pokes holes in plans before you commit to them."
data-de="Vertritt die Gegenseite und schießt Löcher in Pläne, bevor du dich festlegst.">Argues the other side and pokes holes in plans before you commit to them.</p>
</article>
<article class="role reveal" data-a="ro">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18h6M10 21h4M12 3a6 6 0 0 1 4 10.5c-.7.7-1 1.3-1 2.5H9c0-1.2-.3-1.8-1-2.5A6 6 0 0 1 12 3z"/></svg></span>
<h3 data-i18n data-en="Product / Idea partner" data-de="Produkt-/Ideenpartner">Product / Idea partner</h3>
<span class="badge" data-i18n data-en="READ-ONLY" data-de="NUR-LESEN">READ-ONLY</span>
</div>
<p data-i18n
data-en="Helps you turn raw ideas into shaped specs. Thinks with you, doesn't ship."
data-de="Hilft dir, rohe Ideen in ausgeformte Specs zu gießen. Denkt mit dir, liefert aber nicht aus.">Helps you turn raw ideas into shaped specs. Thinks with you, doesn't ship.</p>
</article>
<article class="role reveal" data-a="ro">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l2 2 4-4"/><rect x="4" y="4" width="16" height="16" rx="2"/></svg></span>
<h3 data-i18n data-en="Remediation planner" data-de="Behebungs-Planer">Remediation planner</h3>
<span class="badge" data-i18n data-en="READ-ONLY" data-de="NUR-LESEN">READ-ONLY</span>
</div>
<p data-i18n
data-en="Turns audit findings into an ordered fix plan. Plans the work; doesn't do it."
data-de="Macht aus Audit-Befunden einen geordneten Maßnahmenplan. Plant die Arbeit; erledigt sie aber nicht.">Turns audit findings into an ordered fix plan. Plans the work; doesn't do it.</p>
</article>
<article class="role reveal" data-a="prop">
<div class="rtop">
<span class="ric" aria-hidden="true"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20h18M6 20V9m4 11V5m4 15v-7m4 7V8"/></svg></span>
<h3 data-i18n data-en="Engineering-manager" data-de="Engineering-Manager">Engineering-manager</h3>
<span class="badge" data-i18n data-en="PROPOSES" data-de="SCHLÄGT VOR">PROPOSES</span>
</div>
<p data-i18n
data-en="Runs the review and coaches the roster. Proposes changes — <b>you</b> approve them."
data-de="Leitet das Review und coacht das Team. Schlägt Änderungen vor — <b>du</b> gibst sie frei.">Runs the review and coaches the roster. Proposes changes — <b>you</b> approve them.</p>
<span class="em-tag" data-i18n
data-en="&rsaquo; runs the self-improving loop"
data-de="&rsaquo; treibt den selbstverbessernden Kreislauf an">&rsaquo; runs the self-improving loop</span>
</article>
</div>
<div class="principle reveal">
<div class="lock" aria-hidden="true">
<svg width="46" height="46" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="10" width="16" height="11" rx="2"/><path d="M8 10V7a4 4 0 0 1 8 0v3"/><circle cx="12" cy="15" r="1.4"/><path d="M12 16.4V18"/></svg>
</div>
<div class="ptxt">
<span class="pk" data-i18n data-en="The principle to remember" data-de="Das Prinzip, das hängen bleiben soll">The principle to remember</span>
<blockquote data-i18n
data-en="<b>Read-only by default; write is a privilege</b> — and the agent that decides what to change <b>never applies it unattended</b>. The reviewer is never the applier."
data-de="<b>Standardmäßig nur lesen; Schreiben ist ein Privileg</b> — und der Agent, der entscheidet, was geändert wird, <b>wendet es nie unbeaufsichtigt an</b>. Wer prüft, ist nie auch der, der ausführt."><b>Read-only by default; write is a privilege</b> — and the agent that
decides what to change <b>never applies it unattended</b>. The reviewer is never the applier.</blockquote>
</div>
</div>
</section>
<!-- ============================ SECTION 4 — CENTERPIECE ============================ -->
<section id="loop" aria-labelledby="s4-h">
<div class="sec-head">
<span class="tag">4</span>
<h2 id="s4-h" data-i18n data-en="The self-improving loop" data-de="Der selbstverbessernde Kreislauf">The self-improving loop</h2>
<p class="note" data-i18n
data-en="The heart of it. A closed cycle with one explicit <em>human-approval gate</em>."
data-de="Das Herzstück. Ein geschlossener Kreislauf mit genau einem expliziten <em>Freigabe-Tor</em>.">The heart of it. A closed cycle with one explicit <em>human-approval gate</em>.</p>
</div>
<div class="loop-wrap reveal">
<div class="loop-grid">
<!-- ----- the ring diagram ----- -->
<div class="ring" role="img"
data-en-aria="A clockwise five-stage cycle: 1 Capture friction during a session, 2 it lands in a local private Journal, 3 you run slash eng-review, 4 the Engineering-manager proposes coaching, then a human-approval gate where YOU approve the diffs, after which 5 the agents improve and the loop returns to Capture. The gate between Coach and Capture is the only place changes are applied."
data-de-aria="Ein im Uhrzeigersinn laufender fünfstufiger Kreislauf: 1 Reibung während einer Session festhalten, 2 sie landet in einem lokalen, privaten Journal, 3 du startest Slash eng-review, 4 der Engineering-Manager schlägt Coaching vor, dann ein menschliches Freigabe-Tor, an dem DU die Diffs freigibst, woraufhin sich 5 die Agenten verbessern und der Kreislauf zurück zu Festhalten führt. Das Tor zwischen Coachen und Festhalten ist der einzige Ort, an dem Änderungen angewendet werden."
aria-label="A clockwise five-stage cycle: 1 Capture friction during a session, 2 it lands in a local private Journal, 3 you run slash eng-review, 4 the Engineering-manager proposes coaching, then a human-approval gate where YOU approve the diffs, after which 5 the agents improve and the loop returns to Capture. The gate between Coach and Capture is the only place changes are applied.">
<svg viewBox="0 0 100 100" aria-hidden="true">
<defs>
<marker id="ah" viewBox="0 0 10 10" refX="6" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M0,0 L10,5 L0,10 z" fill="var(--accent)"/>
</marker>
<marker id="ahg" viewBox="0 0 10 10" refX="6" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M0,0 L10,5 L0,10 z" fill="var(--bad)"/>
</marker>
</defs>
<!-- five clockwise arcs on r=34 circle centered at 50,50.
nodes at angles -90, -22, 46, 134, 202 deg (top, upper-right,
lower-right, lower-left, upper-left). The Coach->Capture arc
(n4 upper-left -> n1 top) carries the human gate, drawn dashed. -->
<path d="M 50 16 A 34 34 0 0 1 81.5 38.5" fill="none" stroke="var(--accent)" stroke-width="1.6" stroke-linecap="round" marker-end="url(#ah)" opacity=".85"/>
<path d="M 81.5 38.5 A 34 34 0 0 1 74.5 74.5" fill="none" stroke="var(--accent)" stroke-width="1.6" stroke-linecap="round" marker-end="url(#ah)" opacity=".85"/>
<path d="M 74.5 74.5 A 34 34 0 0 1 25.5 74.5" fill="none" stroke="var(--accent)" stroke-width="1.6" stroke-linecap="round" marker-end="url(#ah)" opacity=".85"/>
<path d="M 25.5 74.5 A 34 34 0 0 1 18.5 38.5" fill="none" stroke="var(--accent)" stroke-width="1.6" stroke-linecap="round" marker-end="url(#ah)" opacity=".85"/>
<!-- the human gate arc: Coach(upper-left) -> Capture(top) -->
<path d="M 18.5 38.5 A 34 34 0 0 1 50 16" fill="none" stroke="var(--bad)" stroke-width="1.9" stroke-linecap="round" stroke-dasharray="3 2.4" marker-end="url(#ahg)"/>
</svg>
<div class="hub" aria-hidden="true">
<span class="hk" data-i18n data-en="Self-improving" data-de="Selbstverbessernd">Self-improving</span>
<span class="ht" data-i18n data-en="The loop" data-de="Der Kreislauf">The loop</span>
<span class="hsub" data-i18n data-en="sharper each<br>turn of the wheel" data-de="schärfer mit jeder<br>Umdrehung">sharper each<br>turn of the wheel</span>
</div>
<div class="node n1" aria-hidden="true">
<svg class="nicon" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h13l3 3v13H4z"/><path d="M8 9h8M8 13h8M8 17h5"/></svg>
<span class="nstep" data-i18n data-en="1 · Capture" data-de="1 · Festhalten">1 · Capture</span>
<span class="ntitle" data-i18n data-en="Friction" data-de="Reibung">Friction</span>
</div>
<div class="node n2" aria-hidden="true">
<svg class="nicon" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 3h11l3 3v15H5z"/><path d="M8 8h8M8 12h8M8 16h5"/></svg>
<span class="nstep" data-i18n data-en="2 · Journal" data-de="2 · Journal">2 · Journal</span>
<span class="ntitle" data-i18n data-en="Private" data-de="Privat">Private</span>
</div>
<div class="node n3" aria-hidden="true">
<svg class="nicon" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M16 16l5 5"/></svg>
<span class="nstep" data-i18n data-en="3 · Review" data-de="3 · Review">3 · Review</span>
<span class="ntitle">/eng-review</span>
</div>
<div class="node n4" aria-hidden="true">
<svg class="nicon" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20h18M6 20V9m4 11V5m4 15v-7m4 7V8"/></svg>
<span class="nstep" data-i18n data-en="4 · Coach" data-de="4 · Coachen">4 · Coach</span>
<span class="ntitle" data-i18n data-en="EM proposes" data-de="EM schlägt vor">EM proposes</span>
</div>
<div class="node n5" aria-hidden="true">
<svg class="nicon" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v5M12 3l-3 3M12 3l3 3"/><path d="M5 13a7 7 0 0 0 14 0"/></svg>
<span class="nstep" data-i18n data-en="5 · Improve" data-de="5 · Verbessern">5 · Improve</span>
<span class="ntitle" data-i18n data-en="Sharper" data-de="Schärfer">Sharper</span>
</div>
<div class="gate" aria-hidden="true">
<span class="gk" data-i18n data-en="Human gate" data-de="Freigabe-Tor">Human gate</span>
<span class="gt" data-i18n data-en="YOU APPROVE<br>the diffs" data-de="DU GIBST<br>die Diffs frei">YOU APPROVE<br>the diffs</span>
</div>
</div>
<!-- ----- stage details ----- -->
<div class="loop-stages">
<div class="lstage">
<span class="ord">1</span>
<div>
<h4 data-i18n data-en="Capture friction" data-de="Reibung festhalten">Capture friction</h4>
<p data-i18n
data-en="While you work, agents <b>flag what got in the way</b> — a missing fact, a gotcha, a correction you had to make."
data-de="Während du arbeitest, <b>markieren die Agenten, was im Weg stand</b> — ein fehlender Fakt, eine Stolperfalle, eine Korrektur, die du machen musstest.">While you work, agents <b>flag what got in the way</b> — a missing fact, a gotcha, a correction you had to make.</p>
</div>
</div>
<div class="lstage">
<span class="ord">2</span>
<div>
<h4 data-i18n data-en="Journal — local &amp; private" data-de="Journal — lokal &amp; privat">Journal — local &amp; private</h4>
<p data-i18n
data-en="Those notes accrue into a <b>local, private decision journal</b>. It's read only at review time, so it never bloats your day-to-day startup."
data-de="Diese Notizen wachsen zu einem <b>lokalen, privaten Entscheidungs-Journal</b> an. Es wird nur beim Review gelesen und bläht so deinen Alltags-Start nie auf.">Those notes accrue into a <b>local, private decision journal</b>. It's read only at review time, so it never bloats your day-to-day startup.</p>
</div>
</div>
<div class="lstage">
<span class="ord">3</span>
<div>
<h4 data-i18n data-en="You run <code>/eng-review</code>" data-de="Du startest <code>/eng-review</code>">You run <code>/eng-review</code></h4>
<p data-i18n
data-en="Periodically — and <b>only when you choose</b>, never on a timer — you kick off the review."
data-de="Ab und zu — und <b>nur wenn du willst</b>, nie nach Zeitplan — stößt du das Review an.">Periodically — and <b>only when you choose</b>, never on a timer — you kick off the review.</p>
</div>
</div>
<div class="lstage">
<span class="ord">4</span>
<div>
<h4 data-i18n data-en="Engineering-manager proposes coaching" data-de="Engineering-Manager schlägt Coaching vor">Engineering-manager proposes coaching</h4>
<p data-i18n
data-en="It reads the journal, finds patterns, and proposes <b>concrete improvements</b> to memory, skills, and agent instructions."
data-de="Er liest das Journal, erkennt Muster und schlägt <b>konkrete Verbesserungen</b> für Gedächtnis, Skills und Agenten-Anweisungen vor.">It reads the journal, finds patterns, and proposes <b>concrete improvements</b> to memory, skills, and agent instructions.</p>
</div>
</div>
<div class="lstage" data-gate="1">
<span class="ord">&starf;</span>
<div>
<h4 data-i18n
data-en="You approve the diffs <span class=&quot;gateflag&quot;>human gate</span>"
data-de="Du gibst die Diffs frei <span class=&quot;gateflag&quot;>Freigabe-Tor</span>">You approve the diffs <span class="gateflag">human gate</span></h4>
<p data-i18n
data-en="Nothing changes until <b>you say yes</b>. Then the agents improve — and the loop returns to Capture, a little sharper."
data-de="Nichts ändert sich, bis <b>du Ja sagst</b>. Dann verbessern sich die Agenten — und der Kreislauf kehrt zum Festhalten zurück, ein Stück schärfer.">Nothing changes until <b>you say yes</b>. Then the agents improve — and the loop returns to Capture, a little sharper.</p>
</div>
</div>
</div>
</div>
<p class="loop-cap" data-i18n
data-en="It compounds — but <b>only if you actually run the review</b>. A start-of-session nudge reminds you when retros are piling up."
data-de="Es wächst mit Zinseszins — aber <b>nur, wenn du das Review auch wirklich startest</b>. Ein Hinweis zu Session-Beginn erinnert dich, wenn sich Retros stapeln.">It compounds — but <b>only if you actually run the review</b>.
A start-of-session nudge reminds you when retros are piling up.</p>
</div>
</section>
<!-- ============================ SECTION 5 ============================ -->
<section id="memory" aria-labelledby="s5-h">
<div class="sec-head">
<span class="tag">5</span>
<h2 id="s5-h" data-i18n data-en="Memory architecture" data-de="Aufbau des Gedächtnisses">Memory architecture</h2>
<p class="note" data-i18n
data-en="Three layers, each with a different job. Together they make it remember."
data-de="Drei Schichten, jede mit einer eigenen Aufgabe. Zusammen geben sie ihm ein Gedächtnis.">Three layers, each with a different job. Together they make it remember.</p>
</div>
<div class="mem-grid">
<div class="mem-stack reveal" role="img"
data-en-aria="A three-layer memory stack. Top layer Semantic: facts that are true now, read at startup. Middle layer Episodic: the journal, what happened and why, read only at review. Bottom layer Procedural: reusable skills and checklists, loaded on demand."
data-de-aria="Ein dreischichtiger Gedächtnis-Stapel. Obere Schicht Semantisch: Fakten, die jetzt stimmen, beim Start gelesen. Mittlere Schicht Episodisch: das Journal, was passiert ist und warum, nur beim Review gelesen. Untere Schicht Prozedural: wiederverwendbare Skills und Checklisten, bei Bedarf geladen."
aria-label="A three-layer memory stack. Top layer Semantic: facts that are true now, read at startup. Middle layer Episodic: the journal, what happened and why, read only at review. Bottom layer Procedural: reusable skills and checklists, loaded on demand.">
<div class="stratum" data-l="sem">
<div class="shead">
<span class="stype" data-i18n data-en="Semantic" data-de="Semantisch">Semantic</span>
<h3 data-i18n data-en="Facts that are true now" data-de="Fakten, die jetzt stimmen">Facts that are true now</h3>
<span class="when" data-i18n data-en="read at startup" data-de="beim Start gelesen">read at startup</span>
</div>
<p data-i18n
data-en="Your current reality — hosts, conventions, the lay of the land. The fast-loading top layer the agents lean on every session."
data-de="Deine aktuelle Realität — Hosts, Konventionen, wie das Land liegt. Die schnell ladende oberste Schicht, auf die sich die Agenten in jeder Session stützen.">Your current reality — hosts, conventions, the lay of the land. The fast-loading
top layer the agents lean on every session.</p>
<div class="ex" aria-hidden="true"><span class="fk" data-i18n data-en="fact:" data-de="Fakt:">fact:</span> <span data-i18n data-en="deploys go through the staging branch first" data-de="Deploys laufen erst über den Staging-Branch">deploys go through the staging branch first</span></div>
</div>
<div class="stratum" data-l="epi">
<div class="shead">
<span class="stype" data-i18n data-en="Episodic" data-de="Episodisch">Episodic</span>
<h3 data-i18n data-en="What happened — the journal" data-de="Was passiert ist — das Journal">What happened — the journal</h3>
<span class="when" data-i18n data-en="read at review only" data-de="nur beim Review gelesen">read at review only</span>
</div>
<p data-i18n
data-en="The decision &amp; activity log. <b>Read only at review</b>, so it can grow rich without ever bloating startup."
data-de="Das Entscheidungs- &amp; Aktivitätsprotokoll. <b>Nur beim Review gelesen</b>, damit es reichhaltig wachsen kann, ohne je den Start aufzublähen.">The decision &amp; activity log. <b>Read only at review</b>, so it can grow rich
without ever bloating startup.</p>
<div class="ex" aria-hidden="true"><span class="fk" data-i18n data-en="entry:" data-de="Eintrag:">entry:</span> <span data-i18n data-en="chose Caddy over nginx — simpler TLS for this box" data-de="Caddy statt nginx gewählt — einfacheres TLS für diese Kiste">chose Caddy over nginx — simpler TLS for this box</span></div>
</div>
<div class="stratum" data-l="proc">
<div class="shead">
<span class="stype" data-i18n data-en="Procedural" data-de="Prozedural">Procedural</span>
<h3 data-i18n data-en="Reusable skills &amp; checklists" data-de="Wiederverwendbare Skills &amp; Checklisten">Reusable skills &amp; checklists</h3>
<span class="when" data-i18n data-en="loaded on demand" data-de="bei Bedarf geladen">loaded on demand</span>
</div>
<p data-i18n
data-en="The &quot;how we do X here&quot; layer — distilled playbooks the agents reach for when a familiar task comes around again."
data-de="Die &quot;So machen wir X hier&quot;-Schicht — eingedampfte Playbooks, zu denen die Agenten greifen, wenn eine vertraute Aufgabe wiederkommt.">The "how we do X here" layer — distilled playbooks the agents reach for when a
familiar task comes around again.</p>
<div class="ex" aria-hidden="true"><span class="fk" data-i18n data-en="skill:" data-de="Skill:">skill:</span> <span data-i18n data-en="secrets-handoff &mdash; the safe cross-repo move" data-de="secrets-handoff &mdash; der sichere Weg über Repos hinweg">secrets-handoff &mdash; the safe cross-repo move</span></div>
</div>
</div>
<div class="mem-note">
<p class="big" data-i18n
data-en="It stores the <span class=&quot;accent&quot;>non-derivable</span> — not what's already in your code."
data-de="Es speichert das <span class=&quot;accent&quot;>nicht Ableitbare</span> — nicht das, was ohnehin in deinem Code steht.">It stores the <span class="accent">non-derivable</span> — not what's already in your code.</p>
<p data-i18n
data-en="Memory captures <b>gotchas and decisions</b>: the things you'd otherwise re-explain every time. It deliberately doesn't duplicate what an agent can just read from your repo."
data-de="Das Gedächtnis hält <b>Stolperfallen und Entscheidungen</b> fest: die Dinge, die du sonst jedes Mal neu erklären müsstest. Es dupliziert bewusst nicht das, was ein Agent ohnehin aus deinem Repo lesen kann.">Memory captures <b>gotchas and decisions</b>: the things you'd otherwise re-explain
every time. It deliberately doesn't duplicate what an agent can just read from your repo.</p>
<div class="timecard">
<span class="tk" data-i18n data-en="⏱ Time-aware on purpose" data-de="⏱ Bewusst zeitbewusst">⏱ Time-aware on purpose</span>
<p data-i18n
data-en="Each layer knows roughly how fresh it is — because <b>staleness is silent</b>. Old facts get flagged and pruned at review, so the system never quietly lies to you."
data-de="Jede Schicht weiß ungefähr, wie frisch sie ist — denn <b>Veralten passiert lautlos</b>. Alte Fakten werden beim Review markiert und aussortiert, damit das System dich nie heimlich anlügt.">Each layer knows roughly how fresh it is — because <b>staleness is silent</b>.
Old facts get flagged and pruned at review, so the system never quietly lies to you.</p>
</div>
</div>
</div>
</section>
<!-- ============================ SECTION 6 ============================ -->
<section id="setup" aria-labelledby="s6-h">
<div class="sec-head">
<span class="tag">6</span>
<h2 id="s6-h" data-i18n data-en="How setup works" data-de="Wie das Setup abläuft">How setup works</h2>
<p class="note" data-i18n
data-en="You don't build it all at once. You grow it as real friction tells you to."
data-de="Du baust nicht alles auf einmal. Du lässt es wachsen, wenn echte Reibung es dir sagt.">You don't build it all at once. You grow it as real friction tells you to.</p>
</div>
<ol class="setup" style="list-style:none;margin:0;padding:0">
<span class="sline" aria-hidden="true"></span>
<li class="sstep reveal">
<span class="dot num" aria-hidden="true">1</span>
<div class="scard">
<span class="phasetag" data-i18n data-en="Interview" data-de="Interview">Interview</span>
<h3 data-i18n data-en="Your AI interviews you" data-de="Deine KI befragt dich">Your AI interviews you</h3>
<p data-i18n
data-en="It asks about your <b>domains, stack, conventions, guardrails, and risk posture</b> — so everything that follows fits <em>you</em>, not a template."
data-de="Sie fragt nach deinen <b>Domänen, deinem Stack, deinen Konventionen, Leitplanken und deiner Risikohaltung</b> — damit alles Weitere zu <em>dir</em> passt, nicht zu einer Vorlage.">It asks about your <b>domains, stack, conventions, guardrails, and risk posture</b>
— so everything that follows fits <em>you</em>, not a template.</p>
</div>
</li>
<li class="sstep reveal">
<span class="dot num" aria-hidden="true">2</span>
<div class="scard">
<span class="phasetag" data-i18n data-en="Scaffold" data-de="Gerüst">Scaffold</span>
<h3 data-i18n data-en="It scaffolds a clean git repo" data-de="Sie legt ein sauberes git-Repo an">It scaffolds a clean git repo</h3>
<p data-i18n
data-en="A tidy structure, <b>committed and backed up from day one</b> — so your knowledge is never sitting in a single fragile local folder."
data-de="Eine aufgeräumte Struktur, <b>vom ersten Tag an committet und gesichert</b> — damit dein Wissen nie in einem einzigen, fragilen lokalen Ordner liegt.">A tidy structure, <b>committed and backed up from day one</b> — so your knowledge is
never sitting in a single fragile local folder.</p>
</div>
</li>
<li class="sstep reveal">
<span class="dot num" aria-hidden="true">3</span>
<div class="scard">
<span class="phasetag" data-i18n data-en="Start small" data-de="Klein anfangen">Start small</span>
<h3 data-i18n data-en="Begin with 23 agents you'll actually use" data-de="Beginne mit 23 Agenten, die du wirklich nutzt">Begin with 23 agents you'll actually use</h3>
<p data-i18n
data-en="Not the whole roster. The two or three roles that match what you do <b>today</b>, so the thing is useful in week one."
data-de="Nicht das ganze Team. Die zwei oder drei Rollen, die zu dem passen, was du <b>heute</b> tust — damit das Ganze schon in Woche eins nützlich ist.">Not the whole roster. The two or three roles that match what you do <b>today</b>,
so the thing is useful in week one.</p>
</div>
</li>
<li class="sstep reveal">
<span class="dot num" aria-hidden="true">4</span>
<div class="scard">
<span class="phasetag" data-i18n data-en="Add the loop" data-de="Kreislauf einbauen">Add the loop</span>
<h3 data-i18n data-en="Add the self-improving loop" data-de="Den selbstverbessernden Kreislauf einbauen">Add the self-improving loop</h3>
<p data-i18n
data-en="Once you have agents worth coaching, wire up the journal and <code>/eng-review</code>. Now the system starts <b>getting sharper on its own cadence</b>."
data-de="Sobald du Agenten hast, die das Coaching lohnen, verdrahtest du das Journal und <code>/eng-review</code>. Jetzt fängt das System an, <b>in seinem eigenen Takt schärfer zu werden</b>.">Once you have agents worth coaching, wire up the journal and <code>/eng-review</code>.
Now the system starts <b>getting sharper on its own cadence</b>.</p>
</div>
</li>
<li class="sstep reveal">
<span class="dot num" aria-hidden="true">5</span>
<div class="scard">
<span class="phasetag" data-i18n data-en="Expand" data-de="Erweitern">Expand</span>
<h3 data-i18n data-en="Grow as real friction tells you to" data-de="Wachse, wenn echte Reibung es dir sagt">Grow as real friction tells you to</h3>
<p data-i18n
data-en="Add domains and agents when you actually hit a wall — never speculatively. The journal will <b>show you where the friction is</b>."
data-de="Füge Domänen und Agenten hinzu, wenn du tatsächlich an eine Wand stößt — nie auf Verdacht. Das Journal <b>zeigt dir, wo die Reibung sitzt</b>.">Add domains and agents when you actually hit a wall — never speculatively. The
journal will <b>show you where the friction is</b>.</p>
</div>
</li>
</ol>
<p class="motto" data-i18n
data-en="Build the <em>smallest useful thing</em>, use it, and let <em>friction guide</em> what's next."
data-de="Bau das <em>kleinste nützliche Ding</em>, nutze es, und lass die <em>Reibung leiten</em>, was als Nächstes kommt.">Build the <em>smallest useful thing</em>, use it, and let
<em>friction guide</em> what's next.</p>
</section>
<!-- ============================ SECTION 7 ============================ -->
<section id="principles" aria-labelledby="s7-h">
<div class="sec-head">
<span class="tag">7</span>
<h2 id="s7-h" data-i18n data-en="Principles &amp; anti-patterns" data-de="Prinzipien &amp; Anti-Muster">Principles &amp; anti-patterns</h2>
<p class="note" data-i18n
data-en="Keep these on the left. Watch for the ones on the right."
data-de="Halte dich an die links. Pass auf die rechts auf.">Keep these on the left. Watch for the ones on the right.</p>
</div>
<div class="dodont">
<div class="col-card do reveal">
<div class="ch">
<span class="chk" data-i18n data-en="&#10003; Do" data-de="&#10003; Tun">&#10003; Do</span>
<h3 data-i18n data-en="The habits that compound" data-de="Die Gewohnheiten, die sich aufsummieren">The habits that compound</h3>
</div>
<ul>
<li><span class="m">&#10003;</span><span data-i18n data-en="<b>Commit + back up from day one</b> — the repo is your source of truth." data-de="<b>Vom ersten Tag an committen + sichern</b> — das Repo ist deine Quelle der Wahrheit."><b>Commit + back up from day one</b> — the repo is your source of truth.</span></li>
<li><span class="m">&#10003;</span><span data-i18n data-en="<b>Generate your self-description</b> from the live tree, so it never lies about itself." data-de="<b>Erzeuge deine Selbstbeschreibung</b> aus dem lebenden Verzeichnisbaum, damit sie nie über sich selbst lügt."><b>Generate your self-description</b> from the live tree, so it never lies about itself.</span></li>
<li><span class="m">&#10003;</span><span data-i18n data-en="<b>Read-only by default</b> — grant write deliberately, role by role." data-de="<b>Standardmäßig nur lesen</b> — vergib Schreibrechte bewusst, Rolle für Rolle."><b>Read-only by default</b> — grant write deliberately, role by role.</span></li>
<li><span class="m">&#10003;</span><span data-i18n data-en="<b>Capture the human's corrections</b> — your fixes are the highest-signal memory there is." data-de="<b>Halte die Korrekturen des Menschen fest</b> — deine Fixes sind das aussagekräftigste Gedächtnis überhaupt."><b>Capture the human's corrections</b> — your fixes are the highest-signal memory there is.</span></li>
<li><span class="m">&#10003;</span><span data-i18n data-en="<b>Prune stale memory</b> at review, so old facts don't quietly mislead." data-de="<b>Sortiere veraltetes Gedächtnis</b> beim Review aus, damit alte Fakten nicht heimlich in die Irre führen."><b>Prune stale memory</b> at review, so old facts don't quietly mislead.</span></li>
<li><span class="m">&#10003;</span><span data-i18n data-en="<b>Human approves every change</b> — the gate is the point, not a speed bump." data-de="<b>Der Mensch gibt jede Änderung frei</b> — das Tor ist der Sinn der Sache, kein Bremsschwelle."><b>Human approves every change</b> — the gate is the point, not a speed bump.</span></li>
</ul>
</div>
<div class="col-card dont reveal">
<div class="ch">
<span class="chk" data-i18n data-en="&#10007; Avoid" data-de="&#10007; Meiden">&#10007; Avoid</span>
<h3 data-i18n data-en="The traps that rot the system" data-de="Die Fallen, die das System verrotten lassen">The traps that rot the system</h3>
</div>
<ul>
<li><span class="m">&#10007;</span><span data-i18n data-en="A <span class=&quot;rj&quot;>source-of-truth repo with no backup</span> — one disk failure from gone." data-de="Ein <span class=&quot;rj&quot;>Quelle-der-Wahrheit-Repo ohne Backup</span> — einen Plattenausfall vom Verschwinden entfernt.">A <span class="rj">source-of-truth repo with no backup</span> — one disk failure from gone.</span></li>
<li><span class="m">&#10007;</span><span data-i18n data-en="<span class=&quot;rj&quot;>Hand-maintained docs that rot</span> — they drift out of sync and start lying." data-de="<span class=&quot;rj&quot;>Von Hand gepflegte Doku, die verrottet</span> — sie läuft aus dem Takt und fängt an zu lügen."><span class="rj">Hand-maintained docs that rot</span> — they drift out of sync and start lying.</span></li>
<li><span class="m">&#10007;</span><span data-i18n data-en="<span class=&quot;rj&quot;>Dead / unused agents</span> cluttering the roster with config that never fires." data-de="<span class=&quot;rj&quot;>Tote / ungenutzte Agenten</span>, die das Team mit Konfiguration zumüllen, die nie greift."><span class="rj">Dead / unused agents</span> cluttering the roster with config that never fires.</span></li>
<li><span class="m">&#10007;</span><span data-i18n data-en="<span class=&quot;rj&quot;>Capture with no review</span> — a journal nobody reads is just noise." data-de="<span class=&quot;rj&quot;>Festhalten ohne Review</span> — ein Journal, das niemand liest, ist nur Rauschen."><span class="rj">Capture with no review</span> — a journal nobody reads is just noise.</span></li>
<li><span class="m">&#10007;</span><span data-i18n data-en="<span class=&quot;rj&quot;>Agents grading their own work</span> — &quot;all went great&quot; is noise, not signal." data-de="<span class=&quot;rj&quot;>Agenten, die ihre eigene Arbeit benoten</span> — &quot;lief alles super&quot; ist Rauschen, kein Signal."><span class="rj">Agents grading their own work</span> — "all went great" is noise, not signal.</span></li>
<li><span class="m">&#10007;</span><span data-i18n data-en="<span class=&quot;rj&quot;>Always-on agents with broad access</span> — the largest blast radius for the least gain." data-de="<span class=&quot;rj&quot;>Dauerhaft laufende Agenten mit weiten Rechten</span> — die größte Reichweite für den geringsten Nutzen."><span class="rj">Always-on agents with broad access</span> — the largest blast radius for the least gain.</span></li>
</ul>
</div>
</div>
</section>
</main>
<!-- ============================ FOOTER ============================ -->
<footer class="wrap">
<p class="fnote" data-i18n
data-en="Designed to run on <b>Claude Code</b> — <span class=&quot;prims&quot;>subagents · slash commands · hooks · layered memory · MCP grounding</span>.<br><br><b>Human-triggered, privacy-respecting, and yours to version.</b> Your AI will tailor every specific to your setup — nothing here is prescribed."
data-de="Gebaut für den Betrieb auf <b>Claude Code</b> — <span class=&quot;prims&quot;>Subagenten · Slash-Befehle · Hooks · geschichtetes Gedächtnis · MCP-Grounding</span>.<br><br><b>Von dir ausgelöst, deine Privatsphäre achtend und dir zum Versionieren.</b> Deine KI schneidert jedes Detail auf dein Setup zu — nichts davon ist vorgeschrieben.">
Designed to run on <b>Claude Code</b>
<span class="prims">subagents · slash commands · hooks · layered memory · MCP grounding</span>.
<br><br>
<b>Human-triggered, privacy-respecting, and yours to version.</b>
Your AI will tailor every specific to your setup — nothing here is prescribed.
</p>
<div class="sig">
<span class="dot" aria-hidden="true"></span>
<span data-i18n data-en="Your Agentic Environment — A Field Guide" data-de="Deine agentische Umgebung — ein Feldführer">Your Agentic Environment — A Field Guide</span>
<span class="num">ORIENT·01</span>
<span data-i18n data-en="The what &amp; why · a companion to the setup doc" data-de="Das Was &amp; Warum · ein Begleiter zur Setup-Anleitung">The what &amp; why · a companion to the setup doc</span>
</div>
</footer>
<script>
/* =========================================================================
i18n — bilingual EN/DE, self-contained, offline.
- Each text node carries data-en / data-de (HTML strings, since some hold
<b>/<code>/<em>/<br>/<span>). We swap innerHTML on switch.
- aria carried via data-en-aria / data-de-aria; swapped as the attribute.
- Default: localStorage choice -> else navigator.language (de* => de)
-> else en. Persisted across reloads. With JS off, English (the markup)
stays visible, so nothing renders empty.
========================================================================= */
(function(){
var STORE = 'agentic-fieldguide-lang';
var nodes = document.querySelectorAll('[data-i18n]');
var ariaNodes = document.querySelectorAll('[data-en-aria],[data-de-aria]');
var buttons = document.querySelectorAll('.langseg button[data-lang]');
function decideInitial(){
try{
var saved = localStorage.getItem(STORE);
if(saved === 'en' || saved === 'de') return saved;
}catch(e){}
var nav = (navigator.language || navigator.userLanguage || 'en').toLowerCase();
return nav.indexOf('de') === 0 ? 'de' : 'en';
}
function apply(lang){
var key = (lang === 'de') ? 'de' : 'en';
document.documentElement.lang = key;
nodes.forEach(function(el){
var v = el.getAttribute('data-' + key);
if(v != null) el.innerHTML = v;
});
ariaNodes.forEach(function(el){
var v = el.getAttribute('data-' + key + '-aria');
if(v != null) el.setAttribute('aria-label', v);
});
buttons.forEach(function(b){
var on = b.getAttribute('data-lang') === key;
b.setAttribute('aria-pressed', on ? 'true' : 'false');
});
try{ localStorage.setItem(STORE, key); }catch(e){}
}
buttons.forEach(function(b){
b.addEventListener('click', function(){ apply(b.getAttribute('data-lang')); });
});
apply(decideInitial());
})();
/* Single calm reveal-on-scroll. Respects reduced-motion (CSS gate above). */
(function(){
var els = document.querySelectorAll('.reveal');
if(!('IntersectionObserver' in window) || matchMedia('(prefers-reduced-motion: reduce)').matches){
els.forEach(function(e){e.classList.add('in')});
return;
}
var io = new IntersectionObserver(function(entries){
entries.forEach(function(en){
if(en.isIntersecting){ en.target.classList.add('in'); io.unobserve(en.target); }
});
}, {rootMargin:'0px 0px -8% 0px', threshold:.08});
els.forEach(function(e){io.observe(e)});
})();
</script>
</body>
</html>