[{"data":1,"prerenderedAt":2486},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fscenario-helpers-and-sugar":170,"\u002Fguides\u002Fscenario-helpers-and-sugar-surround":2481},[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":95,"body":172,"description":2474,"extension":2475,"links":2476,"meta":2477,"navigation":2478,"path":96,"seo":2479,"stem":97,"__hash__":2480},"docs\u002F2.guides\u002F13.scenario-helpers-and-sugar.md",{"type":173,"value":174,"toc":2465},"minimark",[175,180,197,435,478,527,1022,1026,1029,1108,1111,1133,1163,1178,1304,1311,1548,1568,1573,1594,1607,1611,1614,1747,1825,1836,1840,1847,2017,2020,2218,2224,2230,2448,2452,2461],[176,177,179],"h2",{"id":178},"generated-graft-methods","Generated graft methods",[181,182,183,184,188,189,192,193,196],"p",{},"Calling the core API with a blueprint works, but repeating the blueprint name adds noise to every test. Mark a blueprint catalog with ",[185,186,187],"code",{},"[BiomeGraft]","; the generator adds a ",[185,190,191],{},"{Catalog}Grafts"," extension class in the same namespace. The ",[185,194,195],{},"Zeeq.Biome"," project references the generator as an analyzer and includes it when the core project is packaged.",[198,199,205],"pre",{"className":200,"code":201,"filename":202,"language":203,"meta":204,"style":204},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","[BiomeGraft]\npublic static class Blueprints\n{\n    [Graft(\"CodeRepository\", Plural = \"CodeRepositories\")]\n    public static readonly Blueprint\u003CZeeqSeed, CodeRepository> Repository = null!;\n\n    public static readonly ChildBlueprint\u003CZeeqSeed, CodeRepository, PullRequestRecord> PullRequest =\n        null!;\n\n    [NoGraft]\n    public static readonly Blueprint\u003CZeeqSeed, CodeRepository> InternalVariant = null!;\n}\n","Blueprints.cs","csharp","",[185,206,207,223,240,246,289,332,339,372,382,387,397,429],{"__ignoreMap":204},[208,209,212,216,220],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"sP7_E","[",[208,217,219],{"class":218},"sbgvK","BiomeGraft",[208,221,222],{"class":214},"]\n",[208,224,226,230,233,237],{"class":210,"line":225},2,[208,227,229],{"class":228},"sbsja","public",[208,231,232],{"class":228}," static",[208,234,236],{"class":235},"sG8yY"," class",[208,238,239],{"class":218}," Blueprints\n",[208,241,243],{"class":210,"line":242},3,[208,244,245],{"class":214},"{\n",[208,247,249,252,255,258,262,266,268,271,274,278,281,284,286],{"class":210,"line":248},4,[208,250,251],{"class":214},"    [",[208,253,254],{"class":218},"Graft",[208,256,257],{"class":214},"(",[208,259,261],{"class":260},"sjJ54","\"",[208,263,265],{"class":264},"s_sjI","CodeRepository",[208,267,261],{"class":260},[208,269,270],{"class":214},",",[208,272,273],{"class":218}," Plural",[208,275,277],{"class":276},"smGrS"," =",[208,279,280],{"class":260}," \"",[208,282,283],{"class":264},"CodeRepositories",[208,285,261],{"class":260},[208,287,288],{"class":214},")]\n",[208,290,292,295,297,300,303,306,309,311,314,317,320,322,326,329],{"class":210,"line":291},5,[208,293,294],{"class":228},"    public",[208,296,232],{"class":228},[208,298,299],{"class":228}," readonly",[208,301,302],{"class":218}," Blueprint",[208,304,305],{"class":214},"\u003C",[208,307,308],{"class":218},"ZeeqSeed",[208,310,270],{"class":214},[208,312,313],{"class":218}," CodeRepository",[208,315,316],{"class":214},">",[208,318,319],{"class":218}," Repository",[208,321,277],{"class":276},[208,323,325],{"class":324},"s39Yj"," null",[208,327,328],{"class":276},"!",[208,330,331],{"class":214},";\n",[208,333,335],{"class":210,"line":334},6,[208,336,338],{"emptyLinePlaceholder":337},true,"\n",[208,340,342,344,346,348,351,353,355,357,359,361,364,366,369],{"class":210,"line":341},7,[208,343,294],{"class":228},[208,345,232],{"class":228},[208,347,299],{"class":228},[208,349,350],{"class":218}," ChildBlueprint",[208,352,305],{"class":214},[208,354,308],{"class":218},[208,356,270],{"class":214},[208,358,313],{"class":218},[208,360,270],{"class":214},[208,362,363],{"class":218}," PullRequestRecord",[208,365,316],{"class":214},[208,367,368],{"class":218}," PullRequest",[208,370,371],{"class":276}," =\n",[208,373,375,378,380],{"class":210,"line":374},8,[208,376,377],{"class":324},"        null",[208,379,328],{"class":276},[208,381,331],{"class":214},[208,383,385],{"class":210,"line":384},9,[208,386,338],{"emptyLinePlaceholder":337},[208,388,390,392,395],{"class":210,"line":389},10,[208,391,251],{"class":214},[208,393,394],{"class":218},"NoGraft",[208,396,222],{"class":214},[208,398,400,402,404,406,408,410,412,414,416,418,421,423,425,427],{"class":210,"line":399},11,[208,401,294],{"class":228},[208,403,232],{"class":228},[208,405,299],{"class":228},[208,407,302],{"class":218},[208,409,305],{"class":214},[208,411,308],{"class":218},[208,413,270],{"class":214},[208,415,313],{"class":218},[208,417,316],{"class":214},[208,419,420],{"class":218}," InternalVariant",[208,422,277],{"class":276},[208,424,325],{"class":324},[208,426,328],{"class":276},[208,428,331],{"class":214},[208,430,432],{"class":210,"line":431},12,[208,433,434],{"class":214},"}\n",[181,436,437,439,440,443,444,447,448,451,452,455,456,459,460,463,464,463,467,470,471,474,475,477],{},[185,438,187],{}," marks a class; ",[185,441,442],{},"[Graft]"," and ",[185,445,446],{},"[NoGraft]"," apply to fields or properties. The catalog must be a top-level, non-generic, non-file-local ",[185,449,450],{},"static class","; ",[185,453,454],{},"partial"," is not required. The generator reads public, internal, or protected-internal non-const ",[185,457,458],{},"static readonly"," fields and static getter-only properties with no setter, whose types are ",[185,461,462],{},"Blueprint",", ",[185,465,466],{},"InputBlueprint",[185,468,469],{},"ChildBlueprint",", or ",[185,472,473],{},"ChildInputBlueprint",". Traits, sequences, private members, mutable fields, and other types are skipped. ",[185,476,446],{}," excludes a member before name and collision diagnostics.",[181,479,480,481,484,485,488,489,492,493,496,497,463,500,463,503,463,506,509,510,513,514,516,517,519,520,523,524,526],{},"By default the field or property name supplies the singular suffix after ",[185,482,483],{},"Add",". Pluralization changes a consonant + ",[185,486,487],{},"y"," to ",[185,490,491],{},"ies",", adds ",[185,494,495],{},"es"," after ",[185,498,499],{},"s",[185,501,502],{},"x",[185,504,505],{},"z",[185,507,508],{},"ch"," or ",[185,511,512],{},"sh",", and adds ",[185,515,499],{}," otherwise. ",[185,518,442],{}," accepts an optional positional name and an optional settable ",[185,521,522],{},"Plural"," argument to override either suffix for a domain word, an irregular plural, or a method collision. Both names must be valid C# identifiers. ",[185,525,442],{}," changes names only; it does not make an unsupported member eligible.",[528,529,530,907],"code-group",{},[198,531,534],{"className":200,"code":532,"filename":533,"language":203,"meta":204,"style":204},"public static class BlueprintsGrafts\n{\n    public static BiomeBuilder\u003CZeeqSeed, CodeRepository[]> AddCodeRepository\u003CTAnchor>(\n        this BiomeBuilder\u003CZeeqSeed, TAnchor> b,\n        out CodeRepository repo,\n        Action\u003CCodeRepository>? customize = null) =>\n        b.AddOne(Blueprints.Repository, out repo, customize);\n\n    public static BiomeBuilder\u003CZeeqSeed, CodeRepository[]> AddCodeRepositories\u003CTAnchor>(\n        this BiomeBuilder\u003CZeeqSeed, TAnchor> b,\n        out CodeRepository[] repos,\n        int count) =>\n        b.Add(Blueprints.Repository, out repos, count);\n\n    public static BiomeBuilder\u003CZeeqSeed, CodeRepository[]> AddCodeRepositories\u003CTAnchor>(\n        this BiomeBuilder\u003CZeeqSeed, TAnchor> b,\n        out CodeRepository[] repos,\n        params Action\u003CCodeRepository>[] customize) =>\n        b.Add(Blueprints.Repository, out repos, customize);\n}\n","Generated root graft",[185,535,536,547,551,583,607,619,644,679,683,710,730,744,756,785,790,817,838,851,873,902],{"__ignoreMap":204},[208,537,538,540,542,544],{"class":210,"line":211},[208,539,229],{"class":228},[208,541,232],{"class":228},[208,543,236],{"class":235},[208,545,546],{"class":218}," BlueprintsGrafts\n",[208,548,549],{"class":210,"line":225},[208,550,245],{"class":214},[208,552,553,555,557,560,562,564,566,568,571,575,577,580],{"class":210,"line":242},[208,554,294],{"class":228},[208,556,232],{"class":228},[208,558,559],{"class":218}," BiomeBuilder",[208,561,305],{"class":214},[208,563,308],{"class":218},[208,565,270],{"class":214},[208,567,313],{"class":218},[208,569,570],{"class":214},"[]>",[208,572,574],{"class":573},"sGLFI"," AddCodeRepository",[208,576,305],{"class":214},[208,578,579],{"class":218},"TAnchor",[208,581,582],{"class":214},">(\n",[208,584,585,588,590,592,594,596,599,601,604],{"class":210,"line":248},[208,586,587],{"class":228},"        this",[208,589,559],{"class":218},[208,591,305],{"class":214},[208,593,308],{"class":218},[208,595,270],{"class":214},[208,597,598],{"class":218}," TAnchor",[208,600,316],{"class":214},[208,602,603],{"class":218}," b",[208,605,606],{"class":214},",\n",[208,608,609,612,614,617],{"class":210,"line":291},[208,610,611],{"class":228},"        out",[208,613,313],{"class":218},[208,615,616],{"class":218}," repo",[208,618,606],{"class":214},[208,620,621,624,626,628,631,634,636,638,641],{"class":210,"line":334},[208,622,623],{"class":218},"        Action",[208,625,305],{"class":214},[208,627,265],{"class":218},[208,629,630],{"class":214},">?",[208,632,633],{"class":218}," customize",[208,635,277],{"class":276},[208,637,325],{"class":324},[208,639,640],{"class":214},")",[208,642,643],{"class":276}," =>\n",[208,645,646,650,653,656,658,660,662,665,667,670,672,674,676],{"class":210,"line":341},[208,647,649],{"class":648},"su5hD","        b",[208,651,652],{"class":214},".",[208,654,655],{"class":573},"AddOne",[208,657,257],{"class":214},[208,659,36],{"class":648},[208,661,652],{"class":214},[208,663,664],{"class":648},"Repository",[208,666,270],{"class":214},[208,668,669],{"class":228}," out",[208,671,616],{"class":648},[208,673,270],{"class":214},[208,675,633],{"class":648},[208,677,678],{"class":214},");\n",[208,680,681],{"class":210,"line":374},[208,682,338],{"emptyLinePlaceholder":337},[208,684,685,687,689,691,693,695,697,699,701,704,706,708],{"class":210,"line":384},[208,686,294],{"class":228},[208,688,232],{"class":228},[208,690,559],{"class":218},[208,692,305],{"class":214},[208,694,308],{"class":218},[208,696,270],{"class":214},[208,698,313],{"class":218},[208,700,570],{"class":214},[208,702,703],{"class":573}," AddCodeRepositories",[208,705,305],{"class":214},[208,707,579],{"class":218},[208,709,582],{"class":214},[208,711,712,714,716,718,720,722,724,726,728],{"class":210,"line":389},[208,713,587],{"class":228},[208,715,559],{"class":218},[208,717,305],{"class":214},[208,719,308],{"class":218},[208,721,270],{"class":214},[208,723,598],{"class":218},[208,725,316],{"class":214},[208,727,603],{"class":218},[208,729,606],{"class":214},[208,731,732,734,736,739,742],{"class":210,"line":399},[208,733,611],{"class":228},[208,735,313],{"class":218},[208,737,738],{"class":214},"[]",[208,740,741],{"class":218}," repos",[208,743,606],{"class":214},[208,745,746,749,752,754],{"class":210,"line":431},[208,747,748],{"class":276},"        int",[208,750,751],{"class":218}," count",[208,753,640],{"class":214},[208,755,643],{"class":276},[208,757,759,761,763,765,767,769,771,773,775,777,779,781,783],{"class":210,"line":758},13,[208,760,649],{"class":648},[208,762,652],{"class":214},[208,764,483],{"class":573},[208,766,257],{"class":214},[208,768,36],{"class":648},[208,770,652],{"class":214},[208,772,664],{"class":648},[208,774,270],{"class":214},[208,776,669],{"class":228},[208,778,741],{"class":648},[208,780,270],{"class":214},[208,782,751],{"class":648},[208,784,678],{"class":214},[208,786,788],{"class":210,"line":787},14,[208,789,338],{"emptyLinePlaceholder":337},[208,791,793,795,797,799,801,803,805,807,809,811,813,815],{"class":210,"line":792},15,[208,794,294],{"class":228},[208,796,232],{"class":228},[208,798,559],{"class":218},[208,800,305],{"class":214},[208,802,308],{"class":218},[208,804,270],{"class":214},[208,806,313],{"class":218},[208,808,570],{"class":214},[208,810,703],{"class":573},[208,812,305],{"class":214},[208,814,579],{"class":218},[208,816,582],{"class":214},[208,818,820,822,824,826,828,830,832,834,836],{"class":210,"line":819},16,[208,821,587],{"class":228},[208,823,559],{"class":218},[208,825,305],{"class":214},[208,827,308],{"class":218},[208,829,270],{"class":214},[208,831,598],{"class":218},[208,833,316],{"class":214},[208,835,603],{"class":218},[208,837,606],{"class":214},[208,839,841,843,845,847,849],{"class":210,"line":840},17,[208,842,611],{"class":228},[208,844,313],{"class":218},[208,846,738],{"class":214},[208,848,741],{"class":218},[208,850,606],{"class":214},[208,852,854,857,860,862,864,867,869,871],{"class":210,"line":853},18,[208,855,856],{"class":228},"        params",[208,858,859],{"class":218}," Action",[208,861,305],{"class":214},[208,863,265],{"class":218},[208,865,866],{"class":214},">[]",[208,868,633],{"class":218},[208,870,640],{"class":214},[208,872,643],{"class":276},[208,874,876,878,880,882,884,886,888,890,892,894,896,898,900],{"class":210,"line":875},19,[208,877,649],{"class":648},[208,879,652],{"class":214},[208,881,483],{"class":573},[208,883,257],{"class":214},[208,885,36],{"class":648},[208,887,652],{"class":214},[208,889,664],{"class":648},[208,891,270],{"class":214},[208,893,669],{"class":228},[208,895,741],{"class":648},[208,897,270],{"class":214},[208,899,633],{"class":648},[208,901,678],{"class":214},[208,903,905],{"class":210,"line":904},20,[208,906,434],{"class":214},[198,908,911],{"className":200,"code":909,"filename":910,"language":203,"meta":204,"style":204},"public static BiomeBuilder\u003CZeeqSeed, PullRequestRecord[]> AddPullRequest(\n    this BiomeBuilder\u003CZeeqSeed, CodeRepository[]> b,\n    out PullRequestRecord pr,\n    Action\u003CPullRequestRecord>? customize = null) =>\n    b.AddOne(Blueprints.PullRequest, out pr, customize);\n","Generated child graft",[185,912,913,937,958,970,992],{"__ignoreMap":204},[208,914,915,917,919,921,923,925,927,929,931,934],{"class":210,"line":211},[208,916,229],{"class":228},[208,918,232],{"class":228},[208,920,559],{"class":218},[208,922,305],{"class":214},[208,924,308],{"class":218},[208,926,270],{"class":214},[208,928,363],{"class":218},[208,930,570],{"class":214},[208,932,933],{"class":573}," AddPullRequest",[208,935,936],{"class":214},"(\n",[208,938,939,942,944,946,948,950,952,954,956],{"class":210,"line":225},[208,940,941],{"class":228},"    this",[208,943,559],{"class":218},[208,945,305],{"class":214},[208,947,308],{"class":218},[208,949,270],{"class":214},[208,951,313],{"class":218},[208,953,570],{"class":214},[208,955,603],{"class":218},[208,957,606],{"class":214},[208,959,960,963,965,968],{"class":210,"line":242},[208,961,962],{"class":228},"    out",[208,964,363],{"class":218},[208,966,967],{"class":218}," pr",[208,969,606],{"class":214},[208,971,972,975,977,980,982,984,986,988,990],{"class":210,"line":248},[208,973,974],{"class":218},"    Action",[208,976,305],{"class":214},[208,978,979],{"class":218},"PullRequestRecord",[208,981,630],{"class":214},[208,983,633],{"class":218},[208,985,277],{"class":276},[208,987,325],{"class":324},[208,989,640],{"class":214},[208,991,643],{"class":276},[208,993,994,997,999,1001,1003,1005,1007,1010,1012,1014,1016,1018,1020],{"class":210,"line":291},[208,995,996],{"class":648},"    b",[208,998,652],{"class":214},[208,1000,655],{"class":573},[208,1002,257],{"class":214},[208,1004,36],{"class":648},[208,1006,652],{"class":214},[208,1008,1009],{"class":648},"PullRequest",[208,1011,270],{"class":214},[208,1013,669],{"class":228},[208,1015,967],{"class":648},[208,1017,270],{"class":214},[208,1019,633],{"class":648},[208,1021,678],{"class":214},[176,1023,1025],{"id":1024},"generator-diagnostics","Generator diagnostics",[181,1027,1028],{},"These rules are enabled by default:",[1030,1031,1032,1048],"table",{},[1033,1034,1035],"thead",{},[1036,1037,1038,1042,1045],"tr",{},[1039,1040,1041],"th",{},"ID",[1039,1043,1044],{},"Severity",[1039,1046,1047],{},"Meaning",[1049,1050,1051,1068,1083,1096],"tbody",{},[1036,1052,1053,1059,1062],{},[1054,1055,1056],"td",{},[185,1057,1058],{},"BIOME001",[1054,1060,1061],{},"Warning",[1054,1063,1064,1065,652],{},"Two members produce an overlapping signature on the same builder. Rename one with ",[185,1066,1067],{},"[Graft(\"Name\")]",[1036,1069,1070,1075,1077],{},[1054,1071,1072],{},[185,1073,1074],{},"BIOME002",[1054,1076,1061],{},[1054,1078,1079,1080,1082],{},"The singular and plural suffixes are identical. Set a distinct ",[185,1081,522],{}," value.",[1036,1084,1085,1090,1093],{},[1054,1086,1087],{},[185,1088,1089],{},"BIOME003",[1054,1091,1092],{},"Error",[1054,1094,1095],{},"The catalog is not a top-level, non-generic, non-file-local static class.",[1036,1097,1098,1103,1105],{},[1054,1099,1100],{},[185,1101,1102],{},"BIOME004",[1054,1104,1092],{},[1054,1106,1107],{},"A singular or plural name is not a valid C# identifier.",[181,1109,1110],{},"The generated class follows the catalog's accessibility, and each generated method follows its member's accessibility.",[181,1112,1113,1114,1117,1118,1121,1122,1125,1126,1129,1130,652],{},"Every eligible blueprint catalog member with valid names produces three overloads. The singular method has one optional ",[185,1115,1116],{},"Action\u003CT>"," customizer. The plural methods take either a count or ",[185,1119,1120],{},"params Action\u003CT>[]",". For input blueprints, the customizer type is ",[185,1123,1124],{},"TInput",", while ",[185,1127,1128],{},"out"," and the returned builder use output type ",[185,1131,1132],{},"T",[1134,1135,1136,1147,1157],"ul",{},[1137,1138,1139,1143,1144,1146],"li",{},[1140,1141,1142],"strong",{},"Root and root-input grafts"," are generic in ",[185,1145,579],{},", so they are available after any step with the same seed. Their count or customizer list applies once at the current anchor.",[1137,1148,1149,1152,1153,1156],{},[1140,1150,1151],{},"Child and child-input grafts"," require an anchor of ",[185,1154,1155],{},"BiomeBuilder\u003CTSeed, TParent[]>",", so they appear only after their declared parent. They do not create missing ancestors. Child grafts fan out for each parent; their count and customizers apply to each parent.",[1137,1158,1159,1160,1162],{},"Every method takes ",[185,1161,1128],{},". A singular child graft requires exactly one parent at runtime. A plural call with no customizers creates one default child per parent, or one root output for a root graft. Each method re-anchors to its output array.",[181,1164,1165,1166,1168,1169,1172,1173,509,1175,1177],{},"The generated customizers use ",[185,1167,1116],{}," (or ",[185,1170,1171],{},"Action\u003CTInput>"," for inputs); no context-aware overload is generated. For a one-off context-aware customizer, use the core ",[185,1174,655],{},[185,1176,483],{}," API with the blueprint directly:",[198,1179,1183],{"className":200,"code":1180,"filename":1181,"highlights":1182,"language":203,"meta":204,"style":204},"await TestBiome\n    .Start(out _)\n    .AddOne(Blueprints.Repository, out var repo, (repo, ctx) =>\n        repo.CreatedAtUtc = ctx.Ago(TimeSpan.FromDays(30)))\n    .BuildAsync();\n","Core API, blueprint call",[242,248,291,334,341,374],[185,1184,1185,1193,1211,1253,1293],{"__ignoreMap":204},[208,1186,1187,1190],{"class":210,"line":211},[208,1188,1189],{"class":276},"await",[208,1191,1192],{"class":648}," TestBiome\n",[208,1194,1195,1198,1201,1203,1205,1208],{"class":210,"line":225},[208,1196,1197],{"class":214},"    .",[208,1199,1200],{"class":573},"Start",[208,1202,257],{"class":214},[208,1204,1128],{"class":228},[208,1206,1207],{"class":648}," _",[208,1209,1210],{"class":214},")\n",[208,1212,1215,1217,1219,1221,1223,1225,1227,1229,1231,1234,1236,1238,1241,1244,1246,1249,1251],{"class":1213,"line":242},[210,1214],"highlight",[208,1216,1197],{"class":214},[208,1218,655],{"class":573},[208,1220,257],{"class":214},[208,1222,36],{"class":648},[208,1224,652],{"class":214},[208,1226,664],{"class":648},[208,1228,270],{"class":214},[208,1230,669],{"class":228},[208,1232,1233],{"class":235}," var",[208,1235,616],{"class":218},[208,1237,270],{"class":214},[208,1239,1240],{"class":214}," (",[208,1242,1243],{"class":218},"repo",[208,1245,270],{"class":214},[208,1247,1248],{"class":218}," ctx",[208,1250,640],{"class":214},[208,1252,643],{"class":276},[208,1254,1256,1259,1261,1264,1267,1269,1271,1274,1276,1279,1281,1284,1286,1290],{"class":1255,"line":248},[210,1214],[208,1257,1258],{"class":648},"        repo",[208,1260,652],{"class":214},[208,1262,1263],{"class":648},"CreatedAtUtc ",[208,1265,1266],{"class":276},"=",[208,1268,1248],{"class":648},[208,1270,652],{"class":214},[208,1272,1273],{"class":573},"Ago",[208,1275,257],{"class":214},[208,1277,1278],{"class":648},"TimeSpan",[208,1280,652],{"class":214},[208,1282,1283],{"class":573},"FromDays",[208,1285,257],{"class":214},[208,1287,1289],{"class":1288},"srdBf","30",[208,1291,1292],{"class":214},")))\n",[208,1294,1296,1298,1301],{"class":1295,"line":291},[210,1214],[208,1297,1197],{"class":214},[208,1299,1300],{"class":573},"BuildAsync",[208,1302,1303],{"class":214},"();\n",[181,1305,1306,1307,1310],{},"With grafts, a chain names the ",[1140,1308,1309],{},"entities",", not the blueprints:",[528,1312,1313,1422],{},[198,1314,1318],{"className":200,"code":1315,"filename":1316,"highlights":1317,"language":203,"meta":204,"style":204},"await TestBiome\n    .Start(_db, out var seed)\n    .AddCodeRepository(out var repo)\n    \u002F\u002F the property under test\n    .AddPullRequest(out var pr, p => p.State = PullRequestState.Closed)\n    .BuildAsync();\n","With grafts",[291],[185,1319,1320,1326,1348,1365,1371,1414],{"__ignoreMap":204},[208,1321,1322,1324],{"class":210,"line":211},[208,1323,1189],{"class":276},[208,1325,1192],{"class":648},[208,1327,1328,1330,1332,1334,1337,1339,1341,1343,1346],{"class":210,"line":225},[208,1329,1197],{"class":214},[208,1331,1200],{"class":573},[208,1333,257],{"class":214},[208,1335,1336],{"class":648},"_db",[208,1338,270],{"class":214},[208,1340,669],{"class":228},[208,1342,1233],{"class":235},[208,1344,1345],{"class":218}," seed",[208,1347,1210],{"class":214},[208,1349,1350,1352,1355,1357,1359,1361,1363],{"class":210,"line":242},[208,1351,1197],{"class":214},[208,1353,1354],{"class":573},"AddCodeRepository",[208,1356,257],{"class":214},[208,1358,1128],{"class":228},[208,1360,1233],{"class":235},[208,1362,616],{"class":218},[208,1364,1210],{"class":214},[208,1366,1367],{"class":210,"line":248},[208,1368,1370],{"class":1369},"sutJx","    \u002F\u002F the property under test\n",[208,1372,1374,1376,1379,1381,1383,1385,1387,1389,1392,1395,1397,1399,1402,1404,1407,1409,1412],{"class":1373,"line":291},[210,1214],[208,1375,1197],{"class":214},[208,1377,1378],{"class":573},"AddPullRequest",[208,1380,257],{"class":214},[208,1382,1128],{"class":228},[208,1384,1233],{"class":235},[208,1386,967],{"class":218},[208,1388,270],{"class":214},[208,1390,1391],{"class":218}," p",[208,1393,1394],{"class":276}," =>",[208,1396,1391],{"class":648},[208,1398,652],{"class":214},[208,1400,1401],{"class":648},"State ",[208,1403,1266],{"class":276},[208,1405,1406],{"class":648}," PullRequestState",[208,1408,652],{"class":214},[208,1410,1411],{"class":648},"Closed",[208,1413,1210],{"class":214},[208,1415,1416,1418,1420],{"class":210,"line":334},[208,1417,1197],{"class":214},[208,1419,1300],{"class":573},[208,1421,1303],{"class":214},[198,1423,1427],{"className":200,"code":1424,"filename":1425,"highlights":1426,"language":203,"meta":204,"style":204},"await TestBiome\n    .Start(_db, out var seed)\n    .AddOne(Blueprints.Repository, out var repo)\n    .AddOne(\n        Blueprints.PullRequest,\n        out var pr,\n        p => p.State = PullRequestState.Closed\n    )\n    .BuildAsync();\n","Core API",[248,291,334,341,374],[185,1428,1429,1435,1455,1479,1488,1500,1511,1534,1540],{"__ignoreMap":204},[208,1430,1431,1433],{"class":210,"line":211},[208,1432,1189],{"class":276},[208,1434,1192],{"class":648},[208,1436,1437,1439,1441,1443,1445,1447,1449,1451,1453],{"class":210,"line":225},[208,1438,1197],{"class":214},[208,1440,1200],{"class":573},[208,1442,257],{"class":214},[208,1444,1336],{"class":648},[208,1446,270],{"class":214},[208,1448,669],{"class":228},[208,1450,1233],{"class":235},[208,1452,1345],{"class":218},[208,1454,1210],{"class":214},[208,1456,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477],{"class":210,"line":242},[208,1458,1197],{"class":214},[208,1460,655],{"class":573},[208,1462,257],{"class":214},[208,1464,36],{"class":648},[208,1466,652],{"class":214},[208,1468,664],{"class":648},[208,1470,270],{"class":214},[208,1472,669],{"class":228},[208,1474,1233],{"class":235},[208,1476,616],{"class":218},[208,1478,1210],{"class":214},[208,1480,1482,1484,1486],{"class":1481,"line":248},[210,1214],[208,1483,1197],{"class":214},[208,1485,655],{"class":573},[208,1487,936],{"class":214},[208,1489,1491,1494,1496,1498],{"class":1490,"line":291},[210,1214],[208,1492,1493],{"class":648},"        Blueprints",[208,1495,652],{"class":214},[208,1497,1009],{"class":648},[208,1499,606],{"class":214},[208,1501,1503,1505,1507,1509],{"class":1502,"line":334},[210,1214],[208,1504,611],{"class":228},[208,1506,1233],{"class":235},[208,1508,967],{"class":218},[208,1510,606],{"class":214},[208,1512,1514,1517,1519,1521,1523,1525,1527,1529,1531],{"class":1513,"line":341},[210,1214],[208,1515,1516],{"class":218},"        p",[208,1518,1394],{"class":276},[208,1520,1391],{"class":648},[208,1522,652],{"class":214},[208,1524,1401],{"class":648},[208,1526,1266],{"class":276},[208,1528,1406],{"class":648},[208,1530,652],{"class":214},[208,1532,1533],{"class":648},"Closed\n",[208,1535,1537],{"class":1536,"line":374},[210,1214],[208,1538,1539],{"class":214},"    )\n",[208,1541,1542,1544,1546],{"class":210,"line":384},[208,1543,1197],{"class":214},[208,1545,1300],{"class":573},[208,1547,1303],{"class":214},[1549,1550,1551],"note",{},[181,1552,1553,1554,1557,1558,1560,1561,1564,1565,652],{},"Child graft methods only appear ",[1140,1555,1556],{},"after their parent step"," (the anchor type). If ",[185,1559,1378],{}," is missing from IntelliSense, the anchor isn't a ",[185,1562,1563],{},"CodeRepository[]",": add the parent first, or ",[185,1566,1567],{},".Under(parent)",[1569,1570,1572],"h3",{"id":1571},"graft-conventions","Graft conventions",[1134,1574,1575,1582,1591],{},[1137,1576,1577,1578,1581],{},"Name a blueprint member for the domain operation, and use ",[185,1579,1580],{},"[Graft(\"Name\", Plural = \"Names\")]"," when its member name is not the desired call-site word.",[1137,1583,1584,1585,1590],{},"Use a ",[1586,1587,1589],"a",{"href":1588},"#context-overloads-when-a-test-needs-them","context overload"," only for a type whose tests repeatedly need the clock or parent. Handwrite only that overload or another app-specific exception; ordinary graft methods come from the catalog.",[1137,1592,1593],{},"Never create ancestors inside a child graft or extension. Write a named scenario helper instead.",[1595,1596,1597],"warning",{},[181,1598,1599,1600,443,1603,1606],{},"Don't mix ",[185,1601,1602],{},"x => …",[185,1604,1605],{},"(x, ctx) => …"," lambdas in one call. C# can't infer both. Generated grafts accept one-parameter customizers, so use the core API for a one-off context-aware callback.",[1569,1608,1610],{"id":1609},"context-overloads-when-a-test-needs-them","Context overloads: when a test needs them",[181,1612,1613],{},"The generated overload set covers defaults, simple customizers, and fan-out. When a type's tests repeatedly need the clock or parent, you can handwrite just a named context overload for that type:",[198,1615,1619],{"className":200,"code":1616,"filename":1617,"highlights":1618,"language":203,"meta":204,"style":204},"public static class CodeReviewContextExtensions\n{\n    extension\u003CTAnchor>(BiomeBuilder\u003CCodeReviewSeed, TAnchor> b)\n    {\n        public BiomeBuilder\u003CCodeReviewSeed, CodeRepository[]> AddCodeRepository(\n            out CodeRepository entity,\n            Action\u003CCodeRepository, BiomeContext\u003CCodeReviewSeed>> customize\n        ) => b.AddOne(Blueprints.Repository, out entity, customize);\n    }\n}\n","CodeReviews\u002FContextExtensions.cs",[242],[185,1620,1621,1632,1636,1642,1647,1669,1681,1705,1738,1743],{"__ignoreMap":204},[208,1622,1623,1625,1627,1629],{"class":210,"line":211},[208,1624,229],{"class":228},[208,1626,232],{"class":228},[208,1628,236],{"class":235},[208,1630,1631],{"class":218}," CodeReviewContextExtensions\n",[208,1633,1634],{"class":210,"line":225},[208,1635,245],{"class":214},[208,1637,1639],{"class":1638,"line":242},[210,1214],[208,1640,1641],{"class":648},"    extension\u003CTAnchor>(BiomeBuilder\u003CCodeReviewSeed, TAnchor> b)\n",[208,1643,1644],{"class":210,"line":248},[208,1645,1646],{"class":648},"    {\n",[208,1648,1649,1652,1654,1656,1659,1661,1663,1665,1667],{"class":210,"line":291},[208,1650,1651],{"class":228},"        public",[208,1653,559],{"class":218},[208,1655,305],{"class":214},[208,1657,1658],{"class":218},"CodeReviewSeed",[208,1660,270],{"class":214},[208,1662,313],{"class":218},[208,1664,570],{"class":214},[208,1666,574],{"class":573},[208,1668,936],{"class":214},[208,1670,1671,1674,1676,1679],{"class":210,"line":334},[208,1672,1673],{"class":228},"            out",[208,1675,313],{"class":218},[208,1677,1678],{"class":218}," entity",[208,1680,606],{"class":214},[208,1682,1683,1686,1688,1690,1692,1695,1697,1699,1702],{"class":210,"line":341},[208,1684,1685],{"class":218},"            Action",[208,1687,305],{"class":214},[208,1689,265],{"class":218},[208,1691,270],{"class":214},[208,1693,1694],{"class":218}," BiomeContext",[208,1696,305],{"class":214},[208,1698,1658],{"class":218},[208,1700,1701],{"class":214},">>",[208,1703,1704],{"class":218}," customize\n",[208,1706,1707,1710,1712,1714,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736],{"class":210,"line":374},[208,1708,1709],{"class":214},"        )",[208,1711,1394],{"class":276},[208,1713,603],{"class":648},[208,1715,652],{"class":214},[208,1717,655],{"class":573},[208,1719,257],{"class":214},[208,1721,36],{"class":648},[208,1723,652],{"class":214},[208,1725,664],{"class":648},[208,1727,270],{"class":214},[208,1729,669],{"class":228},[208,1731,1678],{"class":648},[208,1733,270],{"class":214},[208,1735,633],{"class":648},[208,1737,678],{"class":214},[208,1739,1740],{"class":210,"line":384},[208,1741,1742],{"class":214},"    }\n",[208,1744,1745],{"class":210,"line":389},[208,1746,434],{"class":648},[198,1748,1752],{"className":200,"code":1749,"filename":1750,"highlights":1751,"language":203,"meta":204,"style":204},".AddCodeRepository(\n    out var second,\n    (repo, ctx) => repo.CreatedAt = ctx.Ago(TimeSpan.FromMinutes(5))\n)\n","CodeReviews\u002FCodeReviewTests.cs",[242],[185,1753,1754,1762,1773,1821],{"__ignoreMap":204},[208,1755,1756,1758,1760],{"class":210,"line":211},[208,1757,652],{"class":214},[208,1759,1354],{"class":573},[208,1761,936],{"class":214},[208,1763,1764,1766,1768,1771],{"class":210,"line":225},[208,1765,962],{"class":228},[208,1767,1233],{"class":235},[208,1769,1770],{"class":218}," second",[208,1772,606],{"class":214},[208,1774,1776,1779,1781,1783,1785,1787,1789,1791,1793,1796,1798,1800,1802,1804,1806,1808,1810,1813,1815,1818],{"class":1775,"line":242},[210,1214],[208,1777,1778],{"class":214},"    (",[208,1780,1243],{"class":218},[208,1782,270],{"class":214},[208,1784,1248],{"class":218},[208,1786,640],{"class":214},[208,1788,1394],{"class":276},[208,1790,616],{"class":648},[208,1792,652],{"class":214},[208,1794,1795],{"class":648},"CreatedAt ",[208,1797,1266],{"class":276},[208,1799,1248],{"class":648},[208,1801,652],{"class":214},[208,1803,1273],{"class":573},[208,1805,257],{"class":214},[208,1807,1278],{"class":648},[208,1809,652],{"class":214},[208,1811,1812],{"class":573},"FromMinutes",[208,1814,257],{"class":214},[208,1816,1817],{"class":1288},"5",[208,1819,1820],{"class":214},"))\n",[208,1822,1823],{"class":210,"line":248},[208,1824,1210],{"class":214},[181,1826,1827,1828,1831,1832,1835],{},"C# picks the overload by the lambda's parameter count, so existing ",[185,1829,1830],{},"r => …"," calls still compile. A child overload takes ",[185,1833,1834],{},"Action\u003CT, ChildContext\u003CTSeed, TParent>>",". Every lambda in one call must still use the same form.",[176,1837,1839],{"id":1838},"scenario-helpers","Scenario helpers",[181,1841,1842,1843,1846],{},"A lock test needs the repository, pull request, and review that lead to the lock, but usually asserts only on the lock itself. When that branch recurs, give it a ",[1140,1844,1845],{},"scenario helper",". This is an app-level chain declared on the seed anchor, returning the leaf while keeping all the construction steps visible in its definition:",[198,1848,1852],{"className":200,"code":1849,"filename":1850,"highlights":1851,"language":203,"meta":204,"style":204},"public static class CodeReviewScenarioHelpers\n{\n    \u002F\u002F Scenario helper: a whole default chain, offered from the seed only.\n    extension(BiomeBuilder\u003CZeeqSeed, ZeeqSeed> b)\n    {\n        public BiomeBuilder\u003CZeeqSeed, ActiveCodeReviewLock[]> AddLockedReview(\n            out ActiveCodeReviewLock activeLock\n        ) =>\n            b.AddCodeRepository(out _)\n                .AddPullRequest(out _)\n                .AddCodeReview(out _)\n                .AddActiveLock(out activeLock);\n    }\n}\n","ScenarioHelpers.cs",[334,384,389,399,431],[185,1853,1854,1865,1869,1874,1899,1903,1927,1936,1942,1960,1976,1992,2009,2013],{"__ignoreMap":204},[208,1855,1856,1858,1860,1862],{"class":210,"line":211},[208,1857,229],{"class":228},[208,1859,232],{"class":228},[208,1861,236],{"class":235},[208,1863,1864],{"class":218}," CodeReviewScenarioHelpers\n",[208,1866,1867],{"class":210,"line":225},[208,1868,245],{"class":214},[208,1870,1871],{"class":210,"line":242},[208,1872,1873],{"class":1369},"    \u002F\u002F Scenario helper: a whole default chain, offered from the seed only.\n",[208,1875,1876,1879,1881,1884,1886,1888,1890,1893,1895,1897],{"class":210,"line":248},[208,1877,1878],{"class":573},"    extension",[208,1880,257],{"class":214},[208,1882,1883],{"class":218},"BiomeBuilder",[208,1885,305],{"class":214},[208,1887,308],{"class":218},[208,1889,270],{"class":214},[208,1891,1892],{"class":218}," ZeeqSeed",[208,1894,316],{"class":214},[208,1896,603],{"class":218},[208,1898,1210],{"class":214},[208,1900,1901],{"class":210,"line":291},[208,1902,1646],{"class":214},[208,1904,1906,1909,1911,1913,1915,1917,1920,1922,1925],{"class":1905,"line":334},[210,1214],[208,1907,1908],{"class":648},"        public ",[208,1910,1883],{"class":218},[208,1912,305],{"class":214},[208,1914,308],{"class":218},[208,1916,270],{"class":214},[208,1918,1919],{"class":218}," ActiveCodeReviewLock",[208,1921,570],{"class":214},[208,1923,1924],{"class":573}," AddLockedReview",[208,1926,936],{"class":214},[208,1928,1929,1931,1933],{"class":210,"line":341},[208,1930,1673],{"class":228},[208,1932,1919],{"class":218},[208,1934,1935],{"class":218}," activeLock\n",[208,1937,1938,1940],{"class":210,"line":374},[208,1939,1709],{"class":214},[208,1941,643],{"class":276},[208,1943,1945,1948,1950,1952,1954,1956,1958],{"class":1944,"line":384},[210,1214],[208,1946,1947],{"class":648},"            b",[208,1949,652],{"class":214},[208,1951,1354],{"class":573},[208,1953,257],{"class":214},[208,1955,1128],{"class":228},[208,1957,1207],{"class":648},[208,1959,1210],{"class":214},[208,1961,1963,1966,1968,1970,1972,1974],{"class":1962,"line":389},[210,1214],[208,1964,1965],{"class":214},"                .",[208,1967,1378],{"class":573},[208,1969,257],{"class":214},[208,1971,1128],{"class":228},[208,1973,1207],{"class":648},[208,1975,1210],{"class":214},[208,1977,1979,1981,1984,1986,1988,1990],{"class":1978,"line":399},[210,1214],[208,1980,1965],{"class":214},[208,1982,1983],{"class":573},"AddCodeReview",[208,1985,257],{"class":214},[208,1987,1128],{"class":228},[208,1989,1207],{"class":648},[208,1991,1210],{"class":214},[208,1993,1995,1997,2000,2002,2004,2007],{"class":1994,"line":431},[210,1214],[208,1996,1965],{"class":214},[208,1998,1999],{"class":573},"AddActiveLock",[208,2001,257],{"class":214},[208,2003,1128],{"class":228},[208,2005,2006],{"class":648}," activeLock",[208,2008,678],{"class":214},[208,2010,2011],{"class":210,"line":758},[208,2012,1742],{"class":214},[208,2014,2015],{"class":210,"line":787},[208,2016,434],{"class":214},[181,2018,2019],{},"A lock test now names only the lock:",[528,2021,2022,2071],{},[198,2023,2027],{"className":200,"code":2024,"filename":2025,"highlights":2026,"language":203,"meta":204,"style":204},"await TestBiome.Start(_db, out _).AddLockedReview(out var activeLock).BuildAsync();\n","With Biome",[211],[185,2028,2029],{"__ignoreMap":204},[208,2030,2032,2034,2037,2039,2041,2043,2045,2047,2049,2051,2054,2057,2059,2061,2063,2065,2067,2069],{"class":2031,"line":211},[210,1214],[208,2033,1189],{"class":276},[208,2035,2036],{"class":648}," TestBiome",[208,2038,652],{"class":214},[208,2040,1200],{"class":573},[208,2042,257],{"class":214},[208,2044,1336],{"class":648},[208,2046,270],{"class":214},[208,2048,669],{"class":228},[208,2050,1207],{"class":648},[208,2052,2053],{"class":214},").",[208,2055,2056],{"class":573},"AddLockedReview",[208,2058,257],{"class":214},[208,2060,1128],{"class":228},[208,2062,1233],{"class":235},[208,2064,2006],{"class":218},[208,2066,2053],{"class":214},[208,2068,1300],{"class":573},[208,2070,1303],{"class":214},[2072,2073,2076],"code-collapse",{"label":2074,"name":2075},"Without Biome","setup",[198,2077,2079],{"className":200,"code":2078,"language":203,"meta":204,"style":204},"\u002F\u002F Every test that needs a lock repeats the whole graph.\nvar repo = NewRepository(seed);\nvar pr = NewPullRequest(repo);\nvar review = NewCodeReview(pr);\nvar activeLock = NewActiveLock(review);\n_db.AddRange(seed.Owner, seed.Organization, repo, pr, review, activeLock);\nawait _db.SaveChangesAsync();\n",[185,2080,2081,2086,2105,2122,2141,2159,2204],{"__ignoreMap":204},[208,2082,2083],{"class":210,"line":211},[208,2084,2085],{"class":1369},"\u002F\u002F Every test that needs a lock repeats the whole graph.\n",[208,2087,2088,2091,2093,2095,2098,2100,2103],{"class":210,"line":225},[208,2089,2090],{"class":235},"var",[208,2092,616],{"class":218},[208,2094,277],{"class":276},[208,2096,2097],{"class":573}," NewRepository",[208,2099,257],{"class":214},[208,2101,2102],{"class":648},"seed",[208,2104,678],{"class":214},[208,2106,2107,2109,2111,2113,2116,2118,2120],{"class":210,"line":242},[208,2108,2090],{"class":235},[208,2110,967],{"class":218},[208,2112,277],{"class":276},[208,2114,2115],{"class":573}," NewPullRequest",[208,2117,257],{"class":214},[208,2119,1243],{"class":648},[208,2121,678],{"class":214},[208,2123,2124,2126,2129,2131,2134,2136,2139],{"class":210,"line":248},[208,2125,2090],{"class":235},[208,2127,2128],{"class":218}," review",[208,2130,277],{"class":276},[208,2132,2133],{"class":573}," NewCodeReview",[208,2135,257],{"class":214},[208,2137,2138],{"class":648},"pr",[208,2140,678],{"class":214},[208,2142,2143,2145,2147,2149,2152,2154,2157],{"class":210,"line":291},[208,2144,2090],{"class":235},[208,2146,2006],{"class":218},[208,2148,277],{"class":276},[208,2150,2151],{"class":573}," NewActiveLock",[208,2153,257],{"class":214},[208,2155,2156],{"class":648},"review",[208,2158,678],{"class":214},[208,2160,2161,2163,2165,2168,2170,2172,2174,2177,2179,2181,2183,2186,2188,2190,2192,2194,2196,2198,2200,2202],{"class":210,"line":334},[208,2162,1336],{"class":648},[208,2164,652],{"class":214},[208,2166,2167],{"class":573},"AddRange",[208,2169,257],{"class":214},[208,2171,2102],{"class":648},[208,2173,652],{"class":214},[208,2175,2176],{"class":648},"Owner",[208,2178,270],{"class":214},[208,2180,1345],{"class":648},[208,2182,652],{"class":214},[208,2184,2185],{"class":648},"Organization",[208,2187,270],{"class":214},[208,2189,616],{"class":648},[208,2191,270],{"class":214},[208,2193,967],{"class":648},[208,2195,270],{"class":214},[208,2197,2128],{"class":648},[208,2199,270],{"class":214},[208,2201,2006],{"class":648},[208,2203,678],{"class":214},[208,2205,2206,2208,2211,2213,2216],{"class":210,"line":341},[208,2207,1189],{"class":276},[208,2209,2210],{"class":648}," _db",[208,2212,652],{"class":214},[208,2214,2215],{"class":573},"SaveChangesAsync",[208,2217,1303],{"class":214},[2219,2220,2221],"tip",{},[181,2222,2223],{},"A short call site should still be explainable. Keep the whole chain in the helper's definition so a reader can follow the rows it creates. Biome does not create missing ancestors automatically.",[181,2225,2226,2227,2229],{},"Scenario helpers can take parameters. The library's ",[185,2228,141],{}," domain passes a deadline through:",[198,2231,2235],{"className":200,"code":2232,"filename":2233,"highlights":2234,"language":203,"meta":204,"style":204},"public static class LearningScenarioHelpers\n{\n    extension(BiomeBuilder\u003CLearningSeed, LearningSeed> b)\n    {\n        public BiomeBuilder\u003CLearningSeed, Submission[]> AddLateSubmission(\n            out Submission leaf,\n            DateTimeOffset dueAt\n        ) =>\n            b.AddSchool(out _)\n                .AddCourse(out _)\n                .AddSection(out _)\n                .AddEnrollment(out _)\n                .AddAssignment(out _, a => a.DueAt = dueAt)\n                .AddSubmission(out leaf);\n    }\n}\n","Learning\u002FScenarioHelpers.cs",[291,399],[185,2236,2237,2248,2252,2276,2280,2303,2314,2322,2328,2345,2360,2376,2391,2425,2440,2444],{"__ignoreMap":204},[208,2238,2239,2241,2243,2245],{"class":210,"line":211},[208,2240,229],{"class":228},[208,2242,232],{"class":228},[208,2244,236],{"class":235},[208,2246,2247],{"class":218}," LearningScenarioHelpers\n",[208,2249,2250],{"class":210,"line":225},[208,2251,245],{"class":214},[208,2253,2254,2256,2258,2260,2262,2265,2267,2270,2272,2274],{"class":210,"line":242},[208,2255,1878],{"class":573},[208,2257,257],{"class":214},[208,2259,1883],{"class":218},[208,2261,305],{"class":214},[208,2263,2264],{"class":218},"LearningSeed",[208,2266,270],{"class":214},[208,2268,2269],{"class":218}," LearningSeed",[208,2271,316],{"class":214},[208,2273,603],{"class":218},[208,2275,1210],{"class":214},[208,2277,2278],{"class":210,"line":248},[208,2279,1646],{"class":214},[208,2281,2283,2285,2287,2289,2291,2293,2296,2298,2301],{"class":2282,"line":291},[210,1214],[208,2284,1908],{"class":648},[208,2286,1883],{"class":218},[208,2288,305],{"class":214},[208,2290,2264],{"class":218},[208,2292,270],{"class":214},[208,2294,2295],{"class":218}," Submission",[208,2297,570],{"class":214},[208,2299,2300],{"class":573}," AddLateSubmission",[208,2302,936],{"class":214},[208,2304,2305,2307,2309,2312],{"class":210,"line":334},[208,2306,1673],{"class":228},[208,2308,2295],{"class":218},[208,2310,2311],{"class":218}," leaf",[208,2313,606],{"class":214},[208,2315,2316,2319],{"class":210,"line":341},[208,2317,2318],{"class":218},"            DateTimeOffset",[208,2320,2321],{"class":218}," dueAt\n",[208,2323,2324,2326],{"class":210,"line":374},[208,2325,1709],{"class":214},[208,2327,643],{"class":276},[208,2329,2330,2332,2334,2337,2339,2341,2343],{"class":210,"line":384},[208,2331,1947],{"class":648},[208,2333,652],{"class":214},[208,2335,2336],{"class":573},"AddSchool",[208,2338,257],{"class":214},[208,2340,1128],{"class":228},[208,2342,1207],{"class":648},[208,2344,1210],{"class":214},[208,2346,2347,2349,2352,2354,2356,2358],{"class":210,"line":389},[208,2348,1965],{"class":214},[208,2350,2351],{"class":573},"AddCourse",[208,2353,257],{"class":214},[208,2355,1128],{"class":228},[208,2357,1207],{"class":648},[208,2359,1210],{"class":214},[208,2361,2363,2365,2368,2370,2372,2374],{"class":2362,"line":399},[210,1214],[208,2364,1965],{"class":214},[208,2366,2367],{"class":573},"AddSection",[208,2369,257],{"class":214},[208,2371,1128],{"class":228},[208,2373,1207],{"class":648},[208,2375,1210],{"class":214},[208,2377,2378,2380,2383,2385,2387,2389],{"class":210,"line":431},[208,2379,1965],{"class":214},[208,2381,2382],{"class":573},"AddEnrollment",[208,2384,257],{"class":214},[208,2386,1128],{"class":228},[208,2388,1207],{"class":648},[208,2390,1210],{"class":214},[208,2392,2393,2395,2398,2400,2402,2404,2406,2409,2411,2413,2415,2418,2420,2423],{"class":210,"line":758},[208,2394,1965],{"class":214},[208,2396,2397],{"class":573},"AddAssignment",[208,2399,257],{"class":214},[208,2401,1128],{"class":228},[208,2403,1207],{"class":648},[208,2405,270],{"class":214},[208,2407,2408],{"class":218}," a",[208,2410,1394],{"class":276},[208,2412,2408],{"class":648},[208,2414,652],{"class":214},[208,2416,2417],{"class":648},"DueAt ",[208,2419,1266],{"class":276},[208,2421,2422],{"class":648}," dueAt",[208,2424,1210],{"class":214},[208,2426,2427,2429,2432,2434,2436,2438],{"class":210,"line":787},[208,2428,1965],{"class":214},[208,2430,2431],{"class":573},"AddSubmission",[208,2433,257],{"class":214},[208,2435,1128],{"class":228},[208,2437,2311],{"class":648},[208,2439,678],{"class":214},[208,2441,2442],{"class":210,"line":792},[208,2443,1742],{"class":214},[208,2445,2446],{"class":210,"line":819},[208,2447,434],{"class":214},[176,2449,2451],{"id":2450},"where-to-put-things","Where to put things",[198,2453,2459],{"className":2454,"code":2456,"filename":2457,"language":2458,"meta":204},[2455],"language-text","Tests.Common\u002FBiome\u002F\n  ZeeqSeed.cs             seed type + Generate()\n  TestBiome.cs            options + Start overloads (no-DB, DbContext)\n  CodeReviews\u002F\n    Blueprints.cs         sequences, blueprints, variants (one file: init order)\n    Traits.cs             PullRequests.Closed, …\n    ContextExtensions.cs  optional context overloads\n    ScenarioHelpers.cs    named multi-step chains\n  Membership\u002F …\n","Layout","text",[185,2460,2456],{"__ignoreMap":204},[2462,2463,2464],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--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 .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}",{"title":204,"searchDepth":211,"depth":225,"links":2466},[2467,2468,2472,2473],{"id":178,"depth":225,"text":179},{"id":1024,"depth":225,"text":1025,"children":2469},[2470,2471],{"id":1571,"depth":242,"text":1572},{"id":1609,"depth":242,"text":1610},{"id":1838,"depth":225,"text":1839},{"id":2450,"depth":225,"text":2451},"Generated graft methods keep chains short. Named scenario helpers keep repeated chains explicit.","md",null,{},{"icon":98},{"title":95,"description":2474},"PXFeFi6DcWxP4Q1XEP-Rec2AoJiI7e29Nx_PgDM1b4A",[2482,2484],{"title":90,"path":91,"stem":92,"description":2483,"icon":93,"children":-1},"Use Biome without a store, for pure unit tests.",{"title":100,"path":101,"stem":102,"description":2485,"icon":103,"children":-1},"Build a common starting graph in the test constructor, then extend a fresh Biome in each test.",1791831050381]