[{"data":1,"prerenderedAt":460},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fguides\u002Fproject-memory":3},{"id":4,"title":5,"body":6,"description":453,"extension":454,"meta":455,"navigation":136,"path":456,"seo":457,"stem":458,"__hash__":459},"docs\u002Fdocs\u002Fguides\u002Fproject-memory.md","Give Slo a memory",{"type":7,"value":8,"toc":445},"minimark",[9,13,22,25,94,101,113,261,272,279,285,290,304,307,313,316,321,332,336,339,342,364,378,381,389,395,399,402,418,441],[10,11,5],"h1",{"id":12},"give-slo-a-memory",[14,15,16,17,21],"p",{},"A new session knows nothing about your project except what's in the code. The code tells it ",[18,19,20],"em",{},"what"," exists. It doesn't say why the retry limit is 3, which module everyone is scared of, or that the staging database resets every night.",[14,23,24],{},"Slo has three places to keep that knowledge, and it can maintain all three for you. Set them up once and your tenth session starts where your ninth left off.",[26,27,28,44],"table",{},[29,30,31],"thead",{},[32,33,34,38,41],"tr",{},[35,36,37],"th",{},"Where",[35,39,40],{},"Holds",[35,42,43],{},"Loaded",[45,46,47,66,79],"tbody",{},[32,48,49,60,63],{},[50,51,52,56,57],"td",{},[53,54,55],"code",{},"SLO.md"," \u002F ",[53,58,59],{},"AGENTS.md",[50,61,62],{},"Rules: how we work, what's off limits, how to run tests",[50,64,65],{},"Every session, automatically",[32,67,68,73,76],{},[50,69,70],{},[53,71,72],{},"RESEARCH.md",[50,74,75],{},"What's permanently true about this project, and why",[50,77,78],{},"Read at the start of work",[32,80,81,88,91],{},[50,82,83,84,87],{},"A knowledge base (",[53,85,86],{},"SLO_KB_DIR",")",[50,89,90],{},"Knowledge that spans projects: patterns, incidents, gotchas",[50,92,93],{},"Consulted before designing or debugging",[95,96,98,99],"h2",{"id":97},"_1-write-the-rules-slomd","1. Write the rules: ",[53,100,55],{},[14,102,103,105,106,108,109,112],{},[53,104,55],{}," in the project root is your standing brief. Slo loads it at the start of every session, along with ",[53,107,59],{}," and ",[53,110,111],{},"CLAUDE.md"," if you already have those. Keep it short and specific:",[114,115,120],"pre",{"className":116,"code":117,"language":118,"meta":119,"style":119},"language-markdown shiki shiki-themes github-dark-high-contrast","# SLO.md\n\n## How to verify\n- Tests: `make test`. Lint: `make lint`. Both must pass before you call anything done.\n- Integration tests need Docker running: `make test-integration`.\n\n## Boundaries\n- Never commit or push unless I ask.\n- Never edit files under `migrations\u002F` that have already been merged.\n- Don't touch `deploy\u002F`. Deployments go through CI only.\n\n## Conventions\n- Python: named arguments everywhere, type hints on every function.\n- New endpoints need an entry in `docs\u002Fapi.md`.\n","markdown","",[53,121,122,131,138,144,168,182,187,193,201,215,229,234,240,248],{"__ignoreMap":119},[123,124,127],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"s-VM4","# SLO.md\n",[123,132,134],{"class":125,"line":133},2,[123,135,137],{"emptyLinePlaceholder":136},true,"\n",[123,139,141],{"class":125,"line":140},3,[123,142,143],{"class":129},"## How to verify\n",[123,145,147,151,155,159,162,165],{"class":125,"line":146},4,[123,148,150],{"class":149},"s_sBn","-",[123,152,154],{"class":153},"sMAXC"," Tests: ",[123,156,158],{"class":157},"sCcAr","`make test`",[123,160,161],{"class":153},". Lint: ",[123,163,164],{"class":157},"`make lint`",[123,166,167],{"class":153},". Both must pass before you call anything done.\n",[123,169,171,173,176,179],{"class":125,"line":170},5,[123,172,150],{"class":149},[123,174,175],{"class":153}," Integration tests need Docker running: ",[123,177,178],{"class":157},"`make test-integration`",[123,180,181],{"class":153},".\n",[123,183,185],{"class":125,"line":184},6,[123,186,137],{"emptyLinePlaceholder":136},[123,188,190],{"class":125,"line":189},7,[123,191,192],{"class":129},"## Boundaries\n",[123,194,196,198],{"class":125,"line":195},8,[123,197,150],{"class":149},[123,199,200],{"class":153}," Never commit or push unless I ask.\n",[123,202,204,206,209,212],{"class":125,"line":203},9,[123,205,150],{"class":149},[123,207,208],{"class":153}," Never edit files under ",[123,210,211],{"class":157},"`migrations\u002F`",[123,213,214],{"class":153}," that have already been merged.\n",[123,216,218,220,223,226],{"class":125,"line":217},10,[123,219,150],{"class":149},[123,221,222],{"class":153}," Don't touch ",[123,224,225],{"class":157},"`deploy\u002F`",[123,227,228],{"class":153},". Deployments go through CI only.\n",[123,230,232],{"class":125,"line":231},11,[123,233,137],{"emptyLinePlaceholder":136},[123,235,237],{"class":125,"line":236},12,[123,238,239],{"class":129},"## Conventions\n",[123,241,243,245],{"class":125,"line":242},13,[123,244,150],{"class":149},[123,246,247],{"class":153}," Python: named arguments everywhere, type hints on every function.\n",[123,249,251,253,256,259],{"class":125,"line":250},14,[123,252,150],{"class":149},[123,254,255],{"class":153}," New endpoints need an entry in ",[123,257,258],{"class":157},"`docs\u002Fapi.md`",[123,260,181],{"class":153},[14,262,263,264,267,268,271],{},"Rules that apply to ",[18,265,266],{},"all"," your projects go in ",[53,269,270],{},"~\u002F.slo\u002FSLO.md",".",[273,274,276],"note",{"kind":275},"tip",[14,277,278],{},"Don't want to write it yourself? Ask: \"Read this repository and draft an SLO.md with how to run the tests, the conventions you can see, and anything that looks risky to touch.\" Then edit what it gives you.",[95,280,282,283],{"id":281},"_2-keep-the-facts-researchmd","2. Keep the facts: ",[53,284,72],{},[14,286,287,289],{},[53,288,72],{}," is for knowledge that took effort to find out: architecture decisions, why things are the way they are, integration contracts, failure modes you've already hit. It is not an activity log.",[14,291,292,293,295,296,299,300,303],{},"Slo's built-in orientation skills tell it to read ",[53,294,72],{}," before planning, create it if it's missing, and update it when it learns something durable. Slo's default location for it is ",[53,297,298],{},"~\u002F.slo\u002Fprojects\u002F\u003Crepo-name>\u002FRESEARCH.md",", which keeps it out of your repository. If you'd rather version it with the code, put it at ",[53,301,302],{},"docs\u002FRESEARCH.md",": Slo loads that path automatically, every session.",[14,305,306],{},"Ask Slo to start it:",[308,309,310],"blockquote",{},[14,311,312],{},"\"Generate a RESEARCH.md for this project. Cover the architecture, the main workflows, and anything non-obvious you find.\"",[14,314,315],{},"Then, in your briefs, ask for updates as a deliverable:",[308,317,318],{},[14,319,320],{},"\"If you learn something durable while doing this, add it to RESEARCH.md.\"",[14,322,323,324,327,328,331],{},"A companion file, ",[53,325,326],{},"MEMORY.md"," in the same folder, holds things that are true ",[18,329,330],{},"right now",": current priorities, work in flight, open questions. The rule of thumb: RESEARCH.md is what's permanently true and why; MEMORY.md is what's true today.",[95,333,335],{"id":334},"_3-share-across-projects-the-knowledge-base","3. Share across projects: the knowledge base",[14,337,338],{},"If you work across several repositories, some knowledge doesn't belong to any one of them. How your services authenticate with each other. The incident last spring and what caused it. Which library version breaks the build.",[14,340,341],{},"Point Slo at a folder of markdown files:",[114,343,347],{"className":344,"code":345,"language":346,"meta":119,"style":119},"language-bash shiki shiki-themes github-dark-high-contrast","export SLO_KB_DIR=~\u002Fnotes\u002Fkb\n","bash",[53,348,349],{"__ignoreMap":119},[123,350,351,355,358,361],{"class":125,"line":126},[123,352,354],{"class":353},"sWyjQ","export",[123,356,357],{"class":153}," SLO_KB_DIR",[123,359,360],{"class":353},"=~",[123,362,363],{"class":153},"\u002Fnotes\u002Fkb\n",[14,365,366,367,370,371,108,374,377],{},"With that set, Slo is told to consult the knowledge base before designing or debugging, starting from ",[53,368,369],{},"Home.md"," and then the relevant ",[53,372,373],{},"\u003Crepo>\u002Findex.md",[53,375,376],{},"\u003Crepo>\u002Fgotchas.md",". It searches with the same tools it uses on code. It's also told to write back anything non-obvious it discovers: a bug whose cause wasn't visible in the code, a quirk, a decision someone would otherwise have to rediscover.",[14,379,380],{},"A simple layout that works:",[114,382,387],{"className":383,"code":385,"language":386,"meta":119},[384],"language-text","~\u002Fnotes\u002Fkb\u002F\n├── Home.md              what's here and where to start\n├── payments\u002F\n│   ├── index.md         what the service does, how it fits in\n│   └── gotchas.md       things that have bitten us\n└── platform\u002F\n    ├── index.md\n    └── gotchas.md\n","text",[53,388,385],{"__ignoreMap":119},[14,390,391,392,394],{},"Leave ",[53,393,86],{}," unset and Slo simply works without one.",[95,396,398],{"id":397},"_4-make-it-a-habit","4. Make it a habit",[14,400,401],{},"Memory only helps if it's kept up to date. Two small habits do most of the work:",[403,404,405,409],"ul",{},[406,407,408],"li",{},"End big briefs with \"update RESEARCH.md and the knowledge base with anything durable you learned\".",[406,410,411,412,414,415,417],{},"When Slo gets something wrong because it didn't know a fact, add that fact to ",[53,413,55],{},", ",[53,416,72],{}," or the knowledge base straight away, not just to the current conversation.",[273,419,421],{"kind":420},"check",[403,422,423,428,433],{},[406,424,425,427],{},[53,426,55],{}," says how to test, what's off limits and your key conventions.",[406,429,430,432],{},[53,431,72],{}," exists and your briefs ask Slo to keep it current.",[406,434,435,436,438,439,271],{},"If you work across repositories, ",[53,437,86],{}," points at a knowledge base with a ",[53,440,369],{},[442,443,444],"style",{},"html pre.shiki code .s-VM4, html code.shiki .s-VM4{--shiki-default:#91CBFF;--shiki-default-font-weight:bold}html pre.shiki code .s_sBn, html code.shiki .s_sBn{--shiki-default:#FFB757}html pre.shiki code .sMAXC, html code.shiki .sMAXC{--shiki-default:#F0F3F6}html pre.shiki code .sCcAr, html code.shiki .sCcAr{--shiki-default:#91CBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sWyjQ, html code.shiki .sWyjQ{--shiki-default:#FF9492}",{"title":119,"searchDepth":133,"depth":133,"links":446},[447,449,451,452],{"id":97,"depth":133,"text":448},"1. Write the rules: SLO.md",{"id":281,"depth":133,"text":450},"2. Keep the facts: RESEARCH.md",{"id":334,"depth":133,"text":335},{"id":397,"depth":133,"text":398},"Set up the files that let every new session start knowing what the last one learned.","md",{},"\u002Fdocs\u002Fguides\u002Fproject-memory",{"title":5,"description":453},"docs\u002Fguides\u002Fproject-memory","YQAjIWoC0O7N-AKwNyBLhlia8z1_8Om-iFg8z-Q2DSc",1791641282712]