[{"data":1,"prerenderedAt":493},["ShallowReactive",2],{"navigation":3,"index":170},[4,25,104,150,160],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Guides","\u002Fguides","2.guides",[30,35,40,45,50,55,60,65,70,75,79,84,89,94,99],{"title":31,"path":32,"stem":33,"icon":34},"Seeds and TestBiome","\u002Fguides\u002Fseeds-and-testbiome","2.guides\u002F01.seeds-and-testbiome","i-lucide-sprout",{"title":36,"path":37,"stem":38,"icon":39},"Blueprints","\u002Fguides\u002Fblueprints","2.guides\u002F02.blueprints","i-lucide-drafting-compass",{"title":41,"path":42,"stem":43,"icon":44},"Customizing","\u002Fguides\u002Fcustomizing","2.guides\u002F03.customizing","i-lucide-sliders-horizontal",{"title":46,"path":47,"stem":48,"icon":49},"Parent\u002Fchild chains and .Under","\u002Fguides\u002Fparents-and-children","2.guides\u002F04.parents-and-children","i-lucide-git-fork",{"title":51,"path":52,"stem":53,"icon":54},"Fan-out","\u002Fguides\u002Ffan-out","2.guides\u002F05.fan-out","i-lucide-split",{"title":56,"path":57,"stem":58,"icon":59},"Sequences","\u002Fguides\u002Fsequences","2.guides\u002F06.sequences","i-lucide-list-ordered",{"title":61,"path":62,"stem":63,"icon":64},"Time and precision","\u002Fguides\u002Ftime-and-precision","2.guides\u002F07.time-and-precision","i-lucide-clock",{"title":66,"path":67,"stem":68,"icon":69},"Transients","\u002Fguides\u002Ftransients","2.guides\u002F08.transients","i-lucide-ghost",{"title":71,"path":72,"stem":73,"icon":74},"Aggregates","\u002Fguides\u002Faggregates","2.guides\u002F09.aggregates","i-lucide-boxes",{"title":76,"path":77,"stem":78,"icon":74},"Input blueprints","\u002Fguides\u002Finput-blueprints","2.guides\u002F09.input-blueprints",{"title":80,"path":81,"stem":82,"icon":83},"Save hooks and global defaults","\u002Fguides\u002Fsave-hooks-and-defaults","2.guides\u002F10.save-hooks-and-defaults","i-lucide-webhook",{"title":85,"path":86,"stem":87,"icon":88},"EF Core store","\u002Fguides\u002Fef-core-store","2.guides\u002F11.ef-core-store","i-lucide-database",{"title":90,"path":91,"stem":92,"icon":93},"No-DB unit tests","\u002Fguides\u002Fno-db-unit-tests","2.guides\u002F12.no-db-unit-tests","i-lucide-flask-conical",{"title":95,"path":96,"stem":97,"icon":98},"Generated grafts and scenario helpers","\u002Fguides\u002Fscenario-helpers-and-sugar","2.guides\u002F13.scenario-helpers-and-sugar","i-lucide-wand-sparkles",{"title":100,"path":101,"stem":102,"icon":103},"Constructor setup","\u002Fguides\u002Fconstructor-setup","2.guides\u002F14.constructor-setup","i-lucide-blocks",{"title":105,"path":106,"stem":107,"children":108,"icon":6},"Examples","\u002Fexamples","3.examples\u002F1.index",[109,111,116,121,126,130,135,140,145],{"title":105,"path":106,"stem":107,"icon":110},"i-lucide-library",{"title":112,"path":113,"stem":114,"icon":115},"Code reviews","\u002Fexamples\u002Fcode-reviews","3.examples\u002F2.code-reviews","i-lucide-git-pull-request",{"title":117,"path":118,"stem":119,"icon":120},"Membership","\u002Fexamples\u002Fmembership","3.examples\u002F3.membership","i-lucide-users",{"title":122,"path":123,"stem":124,"icon":125},"Board","\u002Fexamples\u002Fboard","3.examples\u002F4.board","i-lucide-kanban",{"title":127,"path":128,"stem":129,"icon":44},"Custom seed","\u002Fexamples\u002Fcustom-seed","3.examples\u002F5.custom-seed",{"title":131,"path":132,"stem":133,"icon":134},"Commerce","\u002Fexamples\u002Fcommerce","3.examples\u002F6.commerce","i-lucide-shopping-cart",{"title":136,"path":137,"stem":138,"icon":139},"Project management","\u002Fexamples\u002Fproject-management","3.examples\u002F7.project-management","i-lucide-folder-kanban",{"title":141,"path":142,"stem":143,"icon":144},"Learning","\u002Fexamples\u002Flearning","3.examples\u002F8.learning","i-lucide-graduation-cap",{"title":146,"path":147,"stem":148,"icon":149},"Docs ingest","\u002Fexamples\u002Fdocs-ingest","3.examples\u002F9.docs-ingest","i-lucide-file-search",{"title":151,"icon":6,"path":152,"stem":153,"children":154,"page":6},"Reference","\u002Freference","4.reference",[155],{"title":156,"path":157,"stem":158,"icon":159},"API cheat sheet","\u002Freference\u002Fapi-cheat-sheet","4.reference\u002F1.api-cheat-sheet","i-lucide-list-checks",{"title":161,"icon":6,"path":162,"stem":163,"children":164,"page":6},"Agent Skills","\u002Fagents","5.agents",[165],{"title":166,"path":167,"stem":168,"icon":169},"Agent skills","\u002Fagents\u002Fagent-skills","5.agents\u002F1.agent-skills","i-lucide-bot",{"id":171,"title":172,"body":173,"description":172,"extension":485,"meta":486,"navigation":487,"path":488,"seo":489,"stem":491,"__hash__":492},"landing\u002Findex.md","",{"type":174,"value":175,"toc":483},"minimark",[176,370,464,479],[177,178,184,190,203,213,233],"u-page-hero",{"className":179,"orientation":183},[180,181,182],"dark:bg-gradient-to-b","from-neutral-900","to-neutral-950","horizontal",[185,186,187],"template",{"v-slot:top":172},[188,189],"hero-background",{},[185,191,192],{"v-slot:title":172},[193,194,195,196,202],"p",{},"Readable tests. ",[197,198,201],"span",{"className":199},[200],"brand-gradient-text","Less context for your agents",".",[185,204,205],{"v-slot:description":172},[193,206,207,208,212],{},"Tests give coding agents a way to check that their changes produce the intended behavior. ",[209,210,211],"strong",{},"Zeeq Biome"," keeps routine setup in reusable blueprints, making tests terse and readable. With fewer setup details in each test, you and your agents need less context to author and understand it. It targets .NET 10; the extension-block examples use C# 14.",[185,214,215,223],{"v-slot:links":172},[216,217,220],"u-button",{"size":218,"to":12,"trailing-icon":219},"xl","i-lucide-arrow-right",[193,221,222],{},"Get started",[216,224,230],{"size":218,"to":225,"color":226,"icon":227,"target":228,"variant":229},"https:\u002F\u002Fgithub.com\u002Fzeeq-ai\u002Fzeeq-biome","neutral","i-simple-icons-github","_blank","outline",[193,231,232],{},"GitHub",[234,235,239],"prose-pre",{":highlights":236,"code":237,"filename":238},"[3]","await TestBiome.Start(_db, out var seed)\n    .AddCodeRepository(out var repo)\n    .AddPullRequest(out var pr, p => p.State = PullRequestState.Closed)\n    .BuildAsync();\n","CodeReviewTests.cs",[240,241,246],"pre",{"className":242,"code":237,"filename":238,"highlights":243,"language":245,"meta":172,"style":172},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark",[244],3,"csharp",[247,248,249,292,313,359],"code",{"__ignoreMap":172},[197,250,253,257,261,264,268,271,274,277,281,285,289],{"class":251,"line":252},"line",1,[197,254,256],{"class":255},"smGrS","await",[197,258,260],{"class":259},"su5hD"," TestBiome",[197,262,202],{"class":263},"sP7_E",[197,265,267],{"class":266},"sGLFI","Start",[197,269,270],{"class":263},"(",[197,272,273],{"class":259},"_db",[197,275,276],{"class":263},",",[197,278,280],{"class":279},"sbsja"," out",[197,282,284],{"class":283},"sG8yY"," var",[197,286,288],{"class":287},"sbgvK"," seed",[197,290,291],{"class":263},")\n",[197,293,295,298,301,303,306,308,311],{"class":251,"line":294},2,[197,296,297],{"class":263},"    .",[197,299,300],{"class":266},"AddCodeRepository",[197,302,270],{"class":263},[197,304,305],{"class":279},"out",[197,307,284],{"class":283},[197,309,310],{"class":287}," repo",[197,312,291],{"class":263},[197,314,317,319,322,324,326,328,331,333,336,339,341,343,346,349,352,354,357],{"class":315,"line":244},[251,316],"highlight",[197,318,297],{"class":263},[197,320,321],{"class":266},"AddPullRequest",[197,323,270],{"class":263},[197,325,305],{"class":279},[197,327,284],{"class":283},[197,329,330],{"class":287}," pr",[197,332,276],{"class":263},[197,334,335],{"class":287}," p",[197,337,338],{"class":255}," =>",[197,340,335],{"class":259},[197,342,202],{"class":263},[197,344,345],{"class":259},"State ",[197,347,348],{"class":255},"=",[197,350,351],{"class":259}," PullRequestState",[197,353,202],{"class":263},[197,355,356],{"class":259},"Closed",[197,358,291],{"class":263},[197,360,362,364,367],{"class":251,"line":361},4,[197,363,297],{"class":263},[197,365,366],{"class":266},"BuildAsync",[197,368,369],{"class":263},"();\n",[371,372,375,380],"u-page-section",{"className":373},[374],"dark:bg-neutral-950",[185,376,377],{"v-slot:title":172},[193,378,379],{},"Keep the behavior easy to see.",[185,381,382,396,409,421,437,452],{"v-slot:features":172},[383,384,386,391],"u-page-feature",{"icon":385},"i-lucide-focus",[185,387,388],{"v-slot:title":172},[193,389,390],{},"Only the property under test",[185,392,393],{"v-slot:description":172},[193,394,395],{},"Repeating defaults makes the important value harder to spot. Blueprints handle the routine properties, while the test chooses the values it depends on.",[383,397,399,404],{"icon":398},"i-lucide-network",[185,400,401],{"v-slot:title":172},[193,402,403],{},"Typed parents and children",[185,405,406],{"v-slot:description":172},[193,407,408],{},"Related rows should agree about their parent. Child blueprints receive that parent directly, so the chain shows how each entity belongs to the one above it.",[383,410,411,416],{"icon":59},[185,412,413],{"v-slot:title":172},[193,414,415],{},"Sequences, not index + 1",[185,417,418],{"v-slot:description":172},[193,419,420],{},"A counter based on an array index restarts at the next Add. Sequences keep counting within the scope you choose and skip values the test supplies.",[383,422,423,428],{"icon":64},[185,424,425],{"v-slot:title":172},[193,426,427],{},"One clock per test",[185,429,430],{"v-slot:description":172},[193,431,432,433,436],{},"Small timestamp differences can break an otherwise correct test. Use a frozen clock or share a ",[247,434,435],{},"FakeTimeProvider",", with 1 µs precision to match Postgres.",[383,438,439,444],{"icon":88},[185,440,441],{"v-slot:title":172},[193,442,443],{},"Pluggable persistence",[185,445,446],{"v-slot:description":172},[193,447,448,449,202],{},"The same blueprints can serve unit and database tests. Build entities in memory, save once through EF Core, or supply your own ",[247,450,451],{},"IBiomeStore",[383,453,454,459],{"icon":169},[185,455,456],{"v-slot:title":172},[193,457,458],{},"Agent skills included",[185,460,461],{"v-slot:description":172},[193,462,463],{},"Agents need guidance on the same choices you make in setup. Two included skills explain how to write test chains and maintain the blueprints behind them.",[371,465,469],{"className":466},[180,467,468],"from-neutral-950","to-neutral-900",[470,471,476],"u-page-c-t-a",{":links":472,"className":473,"description":474,"title":475},"[{\"label\":\"Quick start\",\"to\":\"\u002Fgetting-started\u002Fquick-start\",\"trailingIcon\":\"i-lucide-arrow-right\"},{\"label\":\"Browse examples\",\"to\":\"\u002Fexamples\",\"variant\":\"subtle\",\"icon\":\"i-lucide-library\"}]",[374],"Move routine setup into a blueprint so the test is easier for you and your agents to write, read, and check. The quick start walks through each choice.","Start with one test.",[477,478],"stars-bg",{},[480,481,482],"style",{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":252,"depth":294,"links":484},[],"md",{},true,"\u002F",{"title":211,"description":490},"Terse, readable tests for you and your coding agents. Reusable setup reduces the context needed to author and understand each test.","index","rF18uYdCcF-4lmaUK63HaX5zGSPYvm-eBjJPkOrupmo",1791831048806]