[{"data":1,"prerenderedAt":2351},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fcustomizing":170,"\u002Fguides\u002Fcustomizing-surround":2346},[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":41,"body":172,"description":2339,"extension":2340,"links":2341,"meta":2342,"navigation":2343,"path":42,"seo":2344,"stem":43,"__hash__":2345},"docs\u002F2.guides\u002F03.customizing.md",{"type":173,"value":174,"toc":2328},"minimark",[175,180,184,194,197,249,256,271,275,885,891,895,906,1018,1128,1144,1154,1212,1216,1222,1361,1388,1392,1399,1663,1841,1852,1993,1998,2077,2097,2110,2114,2120,2260,2264,2294,2324],[176,177,179],"h2",{"id":178},"the-one-rule","The one rule",[181,182,183],"p",{},"A default is useful only if the test can choose a different value. For example, changing an invitation's creation time should also change its default expiry, without replacing an expiry the test supplied. That is why Biome runs derived defaults after customizers.",[185,186,187],"note",{},[181,188,189,193],{},[190,191,192],"strong",{},"Customizers choose the values; derived and global defaults fill what is still unset."," More specific defaults run before global ones.",[181,195,196],{},"For every entity in an Add step, Biome runs the same pipeline, in this order:",[198,199,200,212,222,228,237,246],"ol",{},[201,202,203,206,207,211],"li",{},[190,204,205],{},"Factory"," creates the entity. IDs are set here with ",[208,209,210],"code",{},"ctx.NewId",".",[201,213,214,217,218,221],{},[190,215,216],{},"Traits"," (",[208,219,220],{},".With",") run, in declaration order.",[201,223,224,227],{},[190,225,226],{},"Call-site customizers"," run.",[201,229,230,236],{},[190,231,232,235],{},[208,233,234],{},"Derive","s"," run, fill-only and in declaration order. Sequences first reserve every explicit value in the step, then fill the rest.",[201,238,239,217,242,245],{},[190,240,241],{},"Global defaults",[208,243,244],{},"options.Default",") run, fill-only.",[201,247,248],{},"The entity is recorded, with its parent link and step.",[181,250,251,252,255],{},"There is no ",[208,253,254],{},"OnCreated"," hook that can overwrite a value. Steps 4 and 5 only fill properties that are still unset.",[181,257,258,259,263,264,267,268,270],{},"An ",[260,261,262],"a",{"href":77},"input blueprint"," runs steps 2 to 4 on its ",[190,265,266],{},"input"," object (traits and customizers for every input in the step first, then each input's ",[208,269,234],{},"s followed by the factory), and then applies global defaults to the built entity (step 5).",[176,272,274],{"id":273},"set-only-the-property-under-test","Set only the property under test",[276,277,278,490],"code-group",{},[279,280,288],"pre",{"className":281,"code":282,"filename":283,"highlights":284,"language":286,"meta":287,"style":287},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","await TestBiome\n    .Start(out _)\n    .AddOne(Blueprints.Repository, out var disabled, r => r.Enabled = false)\n    .Add(\n        Blueprints.Repository,\n        out var pair,\n        r => r.OwnerQualifiedName = \"zeeq-ai\u002Fapi\",\n        r => r.OwnerQualifiedName = \"zeeq-ai\u002Fweb\"\n    )\n    .BuildAsync();\n","With Biome",[285],3,"csharp","",[208,289,290,303,327,383,394,407,420,450,473,479],{"__ignoreMap":287},[291,292,295,299],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"smGrS","await",[291,300,302],{"class":301},"su5hD"," TestBiome\n",[291,304,306,310,314,317,321,324],{"class":293,"line":305},2,[291,307,309],{"class":308},"sP7_E","    .",[291,311,313],{"class":312},"sGLFI","Start",[291,315,316],{"class":308},"(",[291,318,320],{"class":319},"sbsja","out",[291,322,323],{"class":301}," _",[291,325,326],{"class":308},")\n",[291,328,331,333,336,338,340,342,345,348,351,355,359,361,364,367,369,371,374,377,381],{"class":329,"line":285},[293,330],"highlight",[291,332,309],{"class":308},[291,334,335],{"class":312},"AddOne",[291,337,316],{"class":308},[291,339,36],{"class":301},[291,341,211],{"class":308},[291,343,344],{"class":301},"Repository",[291,346,347],{"class":308},",",[291,349,350],{"class":319}," out",[291,352,354],{"class":353},"sG8yY"," var",[291,356,358],{"class":357},"sbgvK"," disabled",[291,360,347],{"class":308},[291,362,363],{"class":357}," r",[291,365,366],{"class":297}," =>",[291,368,363],{"class":301},[291,370,211],{"class":308},[291,372,373],{"class":301},"Enabled ",[291,375,376],{"class":297},"=",[291,378,380],{"class":379},"syTEX"," false",[291,382,326],{"class":308},[291,384,386,388,391],{"class":293,"line":385},4,[291,387,309],{"class":308},[291,389,390],{"class":312},"Add",[291,392,393],{"class":308},"(\n",[291,395,397,400,402,404],{"class":293,"line":396},5,[291,398,399],{"class":301},"        Blueprints",[291,401,211],{"class":308},[291,403,344],{"class":301},[291,405,406],{"class":308},",\n",[291,408,410,413,415,418],{"class":293,"line":409},6,[291,411,412],{"class":319},"        out",[291,414,354],{"class":353},[291,416,417],{"class":357}," pair",[291,419,406],{"class":308},[291,421,423,426,428,430,432,435,437,441,445,448],{"class":293,"line":422},7,[291,424,425],{"class":357},"        r",[291,427,366],{"class":297},[291,429,363],{"class":301},[291,431,211],{"class":308},[291,433,434],{"class":301},"OwnerQualifiedName ",[291,436,376],{"class":297},[291,438,440],{"class":439},"sjJ54"," \"",[291,442,444],{"class":443},"s_sjI","zeeq-ai\u002Fapi",[291,446,447],{"class":439},"\"",[291,449,406],{"class":308},[291,451,453,455,457,459,461,463,465,467,470],{"class":293,"line":452},8,[291,454,425],{"class":357},[291,456,366],{"class":297},[291,458,363],{"class":301},[291,460,211],{"class":308},[291,462,434],{"class":301},[291,464,376],{"class":297},[291,466,440],{"class":439},[291,468,469],{"class":443},"zeeq-ai\u002Fweb",[291,471,472],{"class":439},"\"\n",[291,474,476],{"class":293,"line":475},9,[291,477,478],{"class":308},"    )\n",[291,480,482,484,487],{"class":293,"line":481},10,[291,483,309],{"class":308},[291,485,486],{"class":312},"BuildAsync",[291,488,489],{"class":308},"();\n",[491,492,495],"code-collapse",{"label":493,"name":494},"Without Biome","setup",[279,496,498],{"className":281,"code":497,"language":286,"meta":287,"style":287},"\u002F\u002F Every property has to be spelled out, even the ones the test ignores.\nvar now = DateTimeOffset.UtcNow;\nnow = new DateTimeOffset(now.Ticks - now.Ticks % 10, TimeSpan.Zero);\n\nCodeRepository NewRepository(string name, bool enabled) =>\n    new()\n    {\n        Id = $\"repo_{Guid.CreateVersion7():N}\",\n        OrganizationId = seed.Organization.Id,\n        OwnerQualifiedName = name,\n        Enabled = enabled,\n        CreatedAtUtc = now,\n    };\n\nvar disabled = NewRepository(\"zeeq-ai\u002Fexample\", enabled: false);\nvar api = NewRepository(\"zeeq-ai\u002Fapi\", enabled: true);\nvar web = NewRepository(\"zeeq-ai\u002Fweb\", enabled: true);\n_db.AddRange(seed.Owner, seed.Organization, disabled, api, web);\nawait _db.SaveChangesAsync();\n",[208,499,500,506,528,579,585,615,623,628,668,690,701,713,725,731,736,766,797,827,870],{"__ignoreMap":287},[291,501,502],{"class":293,"line":294},[291,503,505],{"class":504},"sutJx","\u002F\u002F Every property has to be spelled out, even the ones the test ignores.\n",[291,507,508,511,514,517,520,522,525],{"class":293,"line":305},[291,509,510],{"class":353},"var",[291,512,513],{"class":357}," now",[291,515,516],{"class":297}," =",[291,518,519],{"class":301}," DateTimeOffset",[291,521,211],{"class":308},[291,523,524],{"class":301},"UtcNow",[291,526,527],{"class":308},";\n",[291,529,530,533,535,538,540,542,545,547,550,553,555,557,559,562,566,568,571,573,576],{"class":293,"line":285},[291,531,532],{"class":301},"now ",[291,534,376],{"class":297},[291,536,537],{"class":297}," new",[291,539,519],{"class":357},[291,541,316],{"class":308},[291,543,544],{"class":301},"now",[291,546,211],{"class":308},[291,548,549],{"class":301},"Ticks ",[291,551,552],{"class":297},"-",[291,554,513],{"class":301},[291,556,211],{"class":308},[291,558,549],{"class":301},[291,560,561],{"class":297},"%",[291,563,565],{"class":564},"srdBf"," 10",[291,567,347],{"class":308},[291,569,570],{"class":301}," TimeSpan",[291,572,211],{"class":308},[291,574,575],{"class":301},"Zero",[291,577,578],{"class":308},");\n",[291,580,581],{"class":293,"line":385},[291,582,584],{"emptyLinePlaceholder":583},true,"\n",[291,586,587,590,593,595,598,601,603,606,609,612],{"class":293,"line":396},[291,588,589],{"class":357},"CodeRepository",[291,591,592],{"class":312}," NewRepository",[291,594,316],{"class":308},[291,596,597],{"class":297},"string",[291,599,600],{"class":357}," name",[291,602,347],{"class":308},[291,604,605],{"class":297}," bool",[291,607,608],{"class":357}," enabled",[291,610,611],{"class":308},")",[291,613,614],{"class":297}," =>\n",[291,616,617,620],{"class":293,"line":409},[291,618,619],{"class":297},"    new",[291,621,622],{"class":308},"()\n",[291,624,625],{"class":293,"line":422},[291,626,627],{"class":308},"    {\n",[291,629,630,633,635,638,641,644,647,649,652,655,658,661,664,666],{"class":293,"line":452},[291,631,632],{"class":301},"        Id ",[291,634,376],{"class":297},[291,636,637],{"class":439}," $\"",[291,639,640],{"class":443},"repo_",[291,642,643],{"class":439},"{",[291,645,646],{"class":301},"Guid",[291,648,211],{"class":439},[291,650,651],{"class":312},"CreateVersion7",[291,653,654],{"class":439},"()",[291,656,657],{"class":297},":",[291,659,660],{"class":301},"N",[291,662,663],{"class":439},"}",[291,665,447],{"class":439},[291,667,406],{"class":308},[291,669,670,673,675,678,680,683,685,688],{"class":293,"line":475},[291,671,672],{"class":301},"        OrganizationId ",[291,674,376],{"class":297},[291,676,677],{"class":301}," seed",[291,679,211],{"class":308},[291,681,682],{"class":301},"Organization",[291,684,211],{"class":308},[291,686,687],{"class":301},"Id",[291,689,406],{"class":308},[291,691,692,695,697,699],{"class":293,"line":481},[291,693,694],{"class":301},"        OwnerQualifiedName ",[291,696,376],{"class":297},[291,698,600],{"class":301},[291,700,406],{"class":308},[291,702,704,707,709,711],{"class":293,"line":703},11,[291,705,706],{"class":301},"        Enabled ",[291,708,376],{"class":297},[291,710,608],{"class":301},[291,712,406],{"class":308},[291,714,716,719,721,723],{"class":293,"line":715},12,[291,717,718],{"class":301},"        CreatedAtUtc ",[291,720,376],{"class":297},[291,722,513],{"class":301},[291,724,406],{"class":308},[291,726,728],{"class":293,"line":727},13,[291,729,730],{"class":308},"    };\n",[291,732,734],{"class":293,"line":733},14,[291,735,584],{"emptyLinePlaceholder":583},[291,737,739,741,743,745,747,749,751,754,756,758,760,762,764],{"class":293,"line":738},15,[291,740,510],{"class":353},[291,742,358],{"class":357},[291,744,516],{"class":297},[291,746,592],{"class":312},[291,748,316],{"class":308},[291,750,447],{"class":439},[291,752,753],{"class":443},"zeeq-ai\u002Fexample",[291,755,447],{"class":439},[291,757,347],{"class":308},[291,759,608],{"class":357},[291,761,657],{"class":308},[291,763,380],{"class":379},[291,765,578],{"class":308},[291,767,769,771,774,776,778,780,782,784,786,788,790,792,795],{"class":293,"line":768},16,[291,770,510],{"class":353},[291,772,773],{"class":357}," api",[291,775,516],{"class":297},[291,777,592],{"class":312},[291,779,316],{"class":308},[291,781,447],{"class":439},[291,783,444],{"class":443},[291,785,447],{"class":439},[291,787,347],{"class":308},[291,789,608],{"class":357},[291,791,657],{"class":308},[291,793,794],{"class":379}," true",[291,796,578],{"class":308},[291,798,800,802,805,807,809,811,813,815,817,819,821,823,825],{"class":293,"line":799},17,[291,801,510],{"class":353},[291,803,804],{"class":357}," web",[291,806,516],{"class":297},[291,808,592],{"class":312},[291,810,316],{"class":308},[291,812,447],{"class":439},[291,814,469],{"class":443},[291,816,447],{"class":439},[291,818,347],{"class":308},[291,820,608],{"class":357},[291,822,657],{"class":308},[291,824,794],{"class":379},[291,826,578],{"class":308},[291,828,830,833,835,838,840,843,845,848,850,852,854,856,858,860,862,864,866,868],{"class":293,"line":829},18,[291,831,832],{"class":301},"_db",[291,834,211],{"class":308},[291,836,837],{"class":312},"AddRange",[291,839,316],{"class":308},[291,841,842],{"class":301},"seed",[291,844,211],{"class":308},[291,846,847],{"class":301},"Owner",[291,849,347],{"class":308},[291,851,677],{"class":301},[291,853,211],{"class":308},[291,855,682],{"class":301},[291,857,347],{"class":308},[291,859,358],{"class":301},[291,861,347],{"class":308},[291,863,773],{"class":301},[291,865,347],{"class":308},[291,867,804],{"class":301},[291,869,578],{"class":308},[291,871,873,875,878,880,883],{"class":293,"line":872},19,[291,874,298],{"class":297},[291,876,877],{"class":301}," _db",[291,879,211],{"class":308},[291,881,882],{"class":312},"SaveChangesAsync",[291,884,489],{"class":308},[886,887,888],"tip",{},[181,889,890],{},"A repeated default looks just as deliberate as a value chosen for the assertion. Set only the properties the test depends on, so the reader can see why this scenario exists.",[176,892,894],{"id":893},"traits-comma-makes-a-new-entity-plus-stacks","Traits: comma makes a new entity, plus stacks",[181,896,897,898,901,902,905],{},"If several tests make the same choice, give it a name. A ",[190,899,900],{},"trait"," is an ",[208,903,904],{},"Action\u003CT>"," value that you can pass anywhere a customizer goes.",[279,907,910],{"className":281,"code":908,"filename":909,"language":286,"meta":287,"style":287},"public static class Repositories\n{\n    public static readonly Action\u003CCodeRepository> Disabled = r => r.Enabled = false;\n    public static readonly Action\u003CCodeRepository> Hidden = r =>\n        r.VisibleInLibraryPicker = false;\n}\n","Repositories.cs",[208,911,912,926,931,973,998,1013],{"__ignoreMap":287},[291,913,914,917,920,923],{"class":293,"line":294},[291,915,916],{"class":319},"public",[291,918,919],{"class":319}," static",[291,921,922],{"class":353}," class",[291,924,925],{"class":357}," Repositories\n",[291,927,928],{"class":293,"line":305},[291,929,930],{"class":308},"{\n",[291,932,933,936,938,941,944,947,949,952,955,957,959,961,963,965,967,969,971],{"class":293,"line":285},[291,934,935],{"class":319},"    public",[291,937,919],{"class":319},[291,939,940],{"class":319}," readonly",[291,942,943],{"class":357}," Action",[291,945,946],{"class":308},"\u003C",[291,948,589],{"class":357},[291,950,951],{"class":308},">",[291,953,954],{"class":357}," Disabled",[291,956,516],{"class":297},[291,958,363],{"class":357},[291,960,366],{"class":297},[291,962,363],{"class":301},[291,964,211],{"class":308},[291,966,373],{"class":301},[291,968,376],{"class":297},[291,970,380],{"class":379},[291,972,527],{"class":308},[291,974,975,977,979,981,983,985,987,989,992,994,996],{"class":293,"line":385},[291,976,935],{"class":319},[291,978,919],{"class":319},[291,980,940],{"class":319},[291,982,943],{"class":357},[291,984,946],{"class":308},[291,986,589],{"class":357},[291,988,951],{"class":308},[291,990,991],{"class":357}," Hidden",[291,993,516],{"class":297},[291,995,363],{"class":357},[291,997,614],{"class":297},[291,999,1000,1002,1004,1007,1009,1011],{"class":293,"line":396},[291,1001,425],{"class":301},[291,1003,211],{"class":308},[291,1005,1006],{"class":301},"VisibleInLibraryPicker ",[291,1008,376],{"class":297},[291,1010,380],{"class":379},[291,1012,527],{"class":308},[291,1014,1015],{"class":293,"line":409},[291,1016,1017],{"class":308},"}\n",[279,1019,1023],{"className":281,"code":1020,"filename":1021,"highlights":1022,"language":286,"meta":287,"style":287},"await TestBiome\n    .Start(out _)\n    .Add(\n        Blueprints.Repository,\n        out var repos,\n        Repositories.Disabled, \u002F\u002F repos[0]: disabled\n        Repositories.Disabled + Repositories.Hidden\n    ) \u002F\u002F repos[1]: disabled and hidden\n    .BuildAsync();\n","Traits in a chain",[409,422,452],[208,1024,1025,1031,1045,1053,1063,1074,1090,1111,1120],{"__ignoreMap":287},[291,1026,1027,1029],{"class":293,"line":294},[291,1028,298],{"class":297},[291,1030,302],{"class":301},[291,1032,1033,1035,1037,1039,1041,1043],{"class":293,"line":305},[291,1034,309],{"class":308},[291,1036,313],{"class":312},[291,1038,316],{"class":308},[291,1040,320],{"class":319},[291,1042,323],{"class":301},[291,1044,326],{"class":308},[291,1046,1047,1049,1051],{"class":293,"line":285},[291,1048,309],{"class":308},[291,1050,390],{"class":312},[291,1052,393],{"class":308},[291,1054,1055,1057,1059,1061],{"class":293,"line":385},[291,1056,399],{"class":301},[291,1058,211],{"class":308},[291,1060,344],{"class":301},[291,1062,406],{"class":308},[291,1064,1065,1067,1069,1072],{"class":293,"line":396},[291,1066,412],{"class":319},[291,1068,354],{"class":353},[291,1070,1071],{"class":357}," repos",[291,1073,406],{"class":308},[291,1075,1077,1080,1082,1085,1087],{"class":1076,"line":409},[293,330],[291,1078,1079],{"class":301},"        Repositories",[291,1081,211],{"class":308},[291,1083,1084],{"class":301},"Disabled",[291,1086,347],{"class":308},[291,1088,1089],{"class":504}," \u002F\u002F repos[0]: disabled\n",[291,1091,1093,1095,1097,1100,1103,1106,1108],{"class":1092,"line":422},[293,330],[291,1094,1079],{"class":301},[291,1096,211],{"class":308},[291,1098,1099],{"class":301},"Disabled ",[291,1101,1102],{"class":297},"+",[291,1104,1105],{"class":301}," Repositories",[291,1107,211],{"class":308},[291,1109,1110],{"class":301},"Hidden\n",[291,1112,1114,1117],{"class":1113,"line":452},[293,330],[291,1115,1116],{"class":308},"    )",[291,1118,1119],{"class":504}," \u002F\u002F repos[1]: disabled and hidden\n",[291,1121,1122,1124,1126],{"class":293,"line":475},[291,1123,309],{"class":308},[291,1125,486],{"class":312},[291,1127,489],{"class":308},[185,1129,1130],{},[181,1131,1132,1133,1135,1136,1139,1140,1143],{},"Choose ",[208,1134,1102],{}," when one entity needs both traits, and a comma when the test needs separate entities. For example, ",[208,1137,1138],{},"PullRequests.Closed + PullRequests.Merged"," creates one pull request with both traits; ",[208,1141,1142],{},"PullRequests.Closed, PullRequests.Merged"," creates two.",[181,1145,1146,1147,1150,1151,1153],{},"Bake a trait into a ",[190,1148,1149],{},"variant"," with ",[208,1152,220],{},". The base blueprint is not changed:",[279,1155,1159],{"className":281,"code":1156,"filename":1157,"highlights":1158,"language":286,"meta":287,"style":287},"public static readonly Blueprint\u003CZeeqSeed, CodeRepository> DisabledRepository =\n    Repository.With(Repositories.Disabled);\n","Blueprints.cs",[305],[208,1160,1161,1190],{"__ignoreMap":287},[291,1162,1163,1165,1167,1169,1172,1174,1177,1179,1182,1184,1187],{"class":293,"line":294},[291,1164,916],{"class":319},[291,1166,919],{"class":319},[291,1168,940],{"class":319},[291,1170,1171],{"class":357}," Blueprint",[291,1173,946],{"class":308},[291,1175,1176],{"class":357},"ZeeqSeed",[291,1178,347],{"class":308},[291,1180,1181],{"class":357}," CodeRepository",[291,1183,951],{"class":308},[291,1185,1186],{"class":357}," DisabledRepository",[291,1188,1189],{"class":297}," =\n",[291,1191,1193,1196,1198,1201,1203,1206,1208,1210],{"class":1192,"line":305},[293,330],[291,1194,1195],{"class":301},"    Repository",[291,1197,211],{"class":308},[291,1199,1200],{"class":312},"With",[291,1202,316],{"class":308},[291,1204,1205],{"class":301},"Repositories",[291,1207,211],{"class":308},[291,1209,1084],{"class":301},[291,1211,578],{"class":308},[176,1213,1215],{"id":1214},"context-aware-customizers","Context-aware customizers",[181,1217,1218,1219,657],{},"A customizer that needs the context takes ",[190,1220,1221],{},"two parameters",[279,1223,1227],{"className":281,"code":1224,"filename":1225,"highlights":1226,"language":286,"meta":287,"style":287},"await TestBiome\n    .Start(out _)\n    .AddCodeRepository(out _)\n    .AddOne(\n        Blueprints.Repository,\n        out var old,\n        (r, ctx) => r.CreatedAtUtc = ctx.Ago(TimeSpan.FromDays(30))\n    )\n    .BuildAsync();\n","Relative time",[385,396,409,422,452],[208,1228,1229,1235,1249,1264,1273,1284,1296,1348,1353],{"__ignoreMap":287},[291,1230,1231,1233],{"class":293,"line":294},[291,1232,298],{"class":297},[291,1234,302],{"class":301},[291,1236,1237,1239,1241,1243,1245,1247],{"class":293,"line":305},[291,1238,309],{"class":308},[291,1240,313],{"class":312},[291,1242,316],{"class":308},[291,1244,320],{"class":319},[291,1246,323],{"class":301},[291,1248,326],{"class":308},[291,1250,1251,1253,1256,1258,1260,1262],{"class":293,"line":285},[291,1252,309],{"class":308},[291,1254,1255],{"class":312},"AddCodeRepository",[291,1257,316],{"class":308},[291,1259,320],{"class":319},[291,1261,323],{"class":301},[291,1263,326],{"class":308},[291,1265,1267,1269,1271],{"class":1266,"line":385},[293,330],[291,1268,309],{"class":308},[291,1270,335],{"class":312},[291,1272,393],{"class":308},[291,1274,1276,1278,1280,1282],{"class":1275,"line":396},[293,330],[291,1277,399],{"class":301},[291,1279,211],{"class":308},[291,1281,344],{"class":301},[291,1283,406],{"class":308},[291,1285,1287,1289,1291,1294],{"class":1286,"line":409},[293,330],[291,1288,412],{"class":319},[291,1290,354],{"class":353},[291,1292,1293],{"class":357}," old",[291,1295,406],{"class":308},[291,1297,1299,1302,1305,1307,1310,1312,1314,1316,1318,1321,1323,1325,1327,1330,1332,1335,1337,1340,1342,1345],{"class":1298,"line":422},[293,330],[291,1300,1301],{"class":308},"        (",[291,1303,1304],{"class":357},"r",[291,1306,347],{"class":308},[291,1308,1309],{"class":357}," ctx",[291,1311,611],{"class":308},[291,1313,366],{"class":297},[291,1315,363],{"class":301},[291,1317,211],{"class":308},[291,1319,1320],{"class":301},"CreatedAtUtc ",[291,1322,376],{"class":297},[291,1324,1309],{"class":301},[291,1326,211],{"class":308},[291,1328,1329],{"class":312},"Ago",[291,1331,316],{"class":308},[291,1333,1334],{"class":301},"TimeSpan",[291,1336,211],{"class":308},[291,1338,1339],{"class":312},"FromDays",[291,1341,316],{"class":308},[291,1343,1344],{"class":564},"30",[291,1346,1347],{"class":308},"))\n",[291,1349,1351],{"class":1350,"line":452},[293,330],[291,1352,478],{"class":308},[291,1354,1355,1357,1359],{"class":293,"line":475},[291,1356,309],{"class":308},[291,1358,486],{"class":312},[291,1360,489],{"class":308},[1362,1363,1364],"warning",{},[181,1365,1366,1367,1370,1371,1373,1374,1377,1378,1382,1383,1385,1386,211],{},"C# cannot mix one-parameter and two-parameter lambdas in a single call. When you mix them, write ",[190,1368,1369],{},"all"," of them in the two-parameter form. Generated grafts accept ",[208,1372,904],{}," (or ",[208,1375,1376],{},"Action\u003CTInput>"," for an input blueprint) unless the app has added a ",[260,1379,1381],{"href":1380},"\u002Fguides\u002Fscenario-helpers-and-sugar#context-overloads-when-a-test-needs-them","context overload"," for that type; otherwise a context-aware customizer goes through the core ",[208,1384,390],{}," \u002F ",[208,1387,335],{},[176,1389,1391],{"id":1390},"derived-defaults-are-fill-only","Derived defaults are fill-only",[181,1393,1394,1395,1398],{},"Some defaults depend on the entity's final values: a title may use its number, or expiry may use its creation time. ",[208,1396,1397],{},".Derive"," runs after traits and customizers for that reason. It assigns a property only if it still has its default value; a non-default value supplied by the test is kept.",[279,1400,1403],{"className":281,"code":1401,"filename":1157,"highlights":1402,"language":286,"meta":287,"style":287},"public static readonly Blueprint\u003C\n    ZeeqSeed,\n    OrganizationMembership\n> PendingInvitation = Blueprint\n    .For\u003CZeeqSeed, OrganizationMembership>(ctx =>\n        new()\n        {\n            Id = ctx.NewId(\"mem\"),\n            OrganizationId = ctx.Seed.Organization.Id,\n            Status = MembershipStatus.Pending,\n            InvitedEmail = \"invited@example.test\",\n            CreatedByUserId = ctx.Seed.Owner.Id,\n            CreatedAtUtc = ctx.Now,\n        }\n    )\n    .Derive(m => m.ExpiresAtUtc, (m, _) => m.CreatedAtUtc.AddDays(7));\n",[768],[208,1404,1405,1418,1423,1428,1440,1464,1471,1476,1502,1526,1543,1559,1582,1598,1603,1607],{"__ignoreMap":287},[291,1406,1407,1409,1411,1413,1415],{"class":293,"line":294},[291,1408,916],{"class":319},[291,1410,919],{"class":319},[291,1412,940],{"class":319},[291,1414,1171],{"class":301},[291,1416,1417],{"class":297},"\u003C\n",[291,1419,1420],{"class":293,"line":305},[291,1421,1422],{"class":301},"    ZeeqSeed,\n",[291,1424,1425],{"class":293,"line":285},[291,1426,1427],{"class":301},"    OrganizationMembership\n",[291,1429,1430,1432,1435,1437],{"class":293,"line":385},[291,1431,951],{"class":297},[291,1433,1434],{"class":301}," PendingInvitation ",[291,1436,376],{"class":297},[291,1438,1439],{"class":301}," Blueprint\n",[291,1441,1442,1444,1447,1449,1451,1453,1456,1459,1462],{"class":293,"line":396},[291,1443,309],{"class":308},[291,1445,1446],{"class":312},"For",[291,1448,946],{"class":308},[291,1450,1176],{"class":357},[291,1452,347],{"class":308},[291,1454,1455],{"class":357}," OrganizationMembership",[291,1457,1458],{"class":308},">(",[291,1460,1461],{"class":357},"ctx",[291,1463,614],{"class":297},[291,1465,1466,1469],{"class":293,"line":409},[291,1467,1468],{"class":297},"        new",[291,1470,622],{"class":308},[291,1472,1473],{"class":293,"line":422},[291,1474,1475],{"class":308},"        {\n",[291,1477,1478,1481,1483,1485,1487,1490,1492,1494,1497,1499],{"class":293,"line":452},[291,1479,1480],{"class":301},"            Id ",[291,1482,376],{"class":297},[291,1484,1309],{"class":301},[291,1486,211],{"class":308},[291,1488,1489],{"class":312},"NewId",[291,1491,316],{"class":308},[291,1493,447],{"class":439},[291,1495,1496],{"class":443},"mem",[291,1498,447],{"class":439},[291,1500,1501],{"class":308},"),\n",[291,1503,1504,1507,1509,1511,1513,1516,1518,1520,1522,1524],{"class":293,"line":475},[291,1505,1506],{"class":301},"            OrganizationId ",[291,1508,376],{"class":297},[291,1510,1309],{"class":301},[291,1512,211],{"class":308},[291,1514,1515],{"class":301},"Seed",[291,1517,211],{"class":308},[291,1519,682],{"class":301},[291,1521,211],{"class":308},[291,1523,687],{"class":301},[291,1525,406],{"class":308},[291,1527,1528,1531,1533,1536,1538,1541],{"class":293,"line":481},[291,1529,1530],{"class":301},"            Status ",[291,1532,376],{"class":297},[291,1534,1535],{"class":301}," MembershipStatus",[291,1537,211],{"class":308},[291,1539,1540],{"class":301},"Pending",[291,1542,406],{"class":308},[291,1544,1545,1548,1550,1552,1555,1557],{"class":293,"line":703},[291,1546,1547],{"class":301},"            InvitedEmail ",[291,1549,376],{"class":297},[291,1551,440],{"class":439},[291,1553,1554],{"class":443},"invited@example.test",[291,1556,447],{"class":439},[291,1558,406],{"class":308},[291,1560,1561,1564,1566,1568,1570,1572,1574,1576,1578,1580],{"class":293,"line":715},[291,1562,1563],{"class":301},"            CreatedByUserId ",[291,1565,376],{"class":297},[291,1567,1309],{"class":301},[291,1569,211],{"class":308},[291,1571,1515],{"class":301},[291,1573,211],{"class":308},[291,1575,847],{"class":301},[291,1577,211],{"class":308},[291,1579,687],{"class":301},[291,1581,406],{"class":308},[291,1583,1584,1587,1589,1591,1593,1596],{"class":293,"line":727},[291,1585,1586],{"class":301},"            CreatedAtUtc ",[291,1588,376],{"class":297},[291,1590,1309],{"class":301},[291,1592,211],{"class":308},[291,1594,1595],{"class":301},"Now",[291,1597,406],{"class":308},[291,1599,1600],{"class":293,"line":733},[291,1601,1602],{"class":308},"        }\n",[291,1604,1605],{"class":293,"line":738},[291,1606,478],{"class":308},[291,1608,1610,1612,1614,1616,1619,1621,1624,1626,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1650,1652,1655,1657,1660],{"class":1609,"line":768},[293,330],[291,1611,309],{"class":308},[291,1613,234],{"class":312},[291,1615,316],{"class":308},[291,1617,1618],{"class":357},"m",[291,1620,366],{"class":297},[291,1622,1623],{"class":301}," m",[291,1625,211],{"class":308},[291,1627,1628],{"class":301},"ExpiresAtUtc",[291,1630,347],{"class":308},[291,1632,217],{"class":308},[291,1634,1618],{"class":357},[291,1636,347],{"class":308},[291,1638,323],{"class":357},[291,1640,611],{"class":308},[291,1642,366],{"class":297},[291,1644,1623],{"class":301},[291,1646,211],{"class":308},[291,1648,1649],{"class":301},"CreatedAtUtc",[291,1651,211],{"class":308},[291,1653,1654],{"class":312},"AddDays",[291,1656,316],{"class":308},[291,1658,1659],{"class":564},"7",[291,1661,1662],{"class":308},"));\n",[279,1664,1668],{"className":281,"code":1665,"filename":1666,"highlights":1667,"language":286,"meta":287,"style":287},"var created = new DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero);\nawait TestBiome\n    .Start(out _)\n    .Add(\n        Blueprints.PendingInvitation,\n        out var invitations,\n        i => i.CreatedAtUtc = created, \u002F\u002F ExpiresAtUtc derived → Jan 8\n        i => i.ExpiresAtUtc = created.AddDays(-1)\n    ) \u002F\u002F explicit → kept\n    .BuildAsync();\n","Membership tests",[422,452,475],[208,1669,1670,1720,1726,1740,1748,1759,1770,1794,1825,1833],{"__ignoreMap":287},[291,1671,1672,1674,1677,1679,1681,1683,1685,1688,1690,1693,1695,1697,1699,1702,1704,1706,1708,1710,1712,1714,1716,1718],{"class":293,"line":294},[291,1673,510],{"class":353},[291,1675,1676],{"class":357}," created",[291,1678,516],{"class":297},[291,1680,537],{"class":297},[291,1682,519],{"class":357},[291,1684,316],{"class":308},[291,1686,1687],{"class":564},"2026",[291,1689,347],{"class":308},[291,1691,1692],{"class":564}," 1",[291,1694,347],{"class":308},[291,1696,1692],{"class":564},[291,1698,347],{"class":308},[291,1700,1701],{"class":564}," 0",[291,1703,347],{"class":308},[291,1705,1701],{"class":564},[291,1707,347],{"class":308},[291,1709,1701],{"class":564},[291,1711,347],{"class":308},[291,1713,570],{"class":301},[291,1715,211],{"class":308},[291,1717,575],{"class":301},[291,1719,578],{"class":308},[291,1721,1722,1724],{"class":293,"line":305},[291,1723,298],{"class":297},[291,1725,302],{"class":301},[291,1727,1728,1730,1732,1734,1736,1738],{"class":293,"line":285},[291,1729,309],{"class":308},[291,1731,313],{"class":312},[291,1733,316],{"class":308},[291,1735,320],{"class":319},[291,1737,323],{"class":301},[291,1739,326],{"class":308},[291,1741,1742,1744,1746],{"class":293,"line":385},[291,1743,309],{"class":308},[291,1745,390],{"class":312},[291,1747,393],{"class":308},[291,1749,1750,1752,1754,1757],{"class":293,"line":396},[291,1751,399],{"class":301},[291,1753,211],{"class":308},[291,1755,1756],{"class":301},"PendingInvitation",[291,1758,406],{"class":308},[291,1760,1761,1763,1765,1768],{"class":293,"line":409},[291,1762,412],{"class":319},[291,1764,354],{"class":353},[291,1766,1767],{"class":357}," invitations",[291,1769,406],{"class":308},[291,1771,1773,1776,1778,1781,1783,1785,1787,1789,1791],{"class":1772,"line":422},[293,330],[291,1774,1775],{"class":357},"        i",[291,1777,366],{"class":297},[291,1779,1780],{"class":301}," i",[291,1782,211],{"class":308},[291,1784,1320],{"class":301},[291,1786,376],{"class":297},[291,1788,1676],{"class":301},[291,1790,347],{"class":308},[291,1792,1793],{"class":504}," \u002F\u002F ExpiresAtUtc derived → Jan 8\n",[291,1795,1797,1799,1801,1803,1805,1808,1810,1812,1814,1816,1818,1820,1823],{"class":1796,"line":452},[293,330],[291,1798,1775],{"class":357},[291,1800,366],{"class":297},[291,1802,1780],{"class":301},[291,1804,211],{"class":308},[291,1806,1807],{"class":301},"ExpiresAtUtc ",[291,1809,376],{"class":297},[291,1811,1676],{"class":301},[291,1813,211],{"class":308},[291,1815,1654],{"class":312},[291,1817,316],{"class":308},[291,1819,552],{"class":297},[291,1821,1822],{"class":564},"1",[291,1824,326],{"class":308},[291,1826,1828,1830],{"class":1827,"line":475},[293,330],[291,1829,1116],{"class":308},[291,1831,1832],{"class":504}," \u002F\u002F explicit → kept\n",[291,1834,1835,1837,1839],{"class":293,"line":481},[291,1836,309],{"class":308},[291,1838,486],{"class":312},[291,1840,489],{"class":308},[181,1842,1843,1844,1847,1848,1851],{},"The same pattern from the library's own tests (",[208,1845,1846],{},"Membership\u002FDomain.cs","): expiry derives ",[190,1849,1850],{},"after"," the customizer has changed the creation time.",[279,1853,1856],{"className":281,"code":1854,"filename":1846,"highlights":1855,"language":286,"meta":287,"style":287},"internal static readonly Blueprint\u003C\n    MembershipSeed,\n    PendingInvitation\n> Invitation = Blueprint\n    .For\u003CMembershipSeed, PendingInvitation>(ctx =>\n        new() { CreatedAt = ctx.Now }\n    )\n    .Derive(i => i.ExpiresAt, (i, _) => i.CreatedAt.AddDays(7));\n",[452],[208,1857,1858,1871,1876,1881,1892,1914,1937,1941],{"__ignoreMap":287},[291,1859,1860,1863,1865,1867,1869],{"class":293,"line":294},[291,1861,1862],{"class":319},"internal",[291,1864,919],{"class":319},[291,1866,940],{"class":319},[291,1868,1171],{"class":301},[291,1870,1417],{"class":297},[291,1872,1873],{"class":293,"line":305},[291,1874,1875],{"class":301},"    MembershipSeed,\n",[291,1877,1878],{"class":293,"line":285},[291,1879,1880],{"class":301},"    PendingInvitation\n",[291,1882,1883,1885,1888,1890],{"class":293,"line":385},[291,1884,951],{"class":297},[291,1886,1887],{"class":301}," Invitation ",[291,1889,376],{"class":297},[291,1891,1439],{"class":301},[291,1893,1894,1896,1898,1900,1903,1905,1908,1910,1912],{"class":293,"line":396},[291,1895,309],{"class":308},[291,1897,1446],{"class":312},[291,1899,946],{"class":308},[291,1901,1902],{"class":357},"MembershipSeed",[291,1904,347],{"class":308},[291,1906,1907],{"class":357}," PendingInvitation",[291,1909,1458],{"class":308},[291,1911,1461],{"class":357},[291,1913,614],{"class":297},[291,1915,1916,1918,1920,1923,1926,1928,1930,1932,1935],{"class":293,"line":409},[291,1917,1468],{"class":297},[291,1919,654],{"class":308},[291,1921,1922],{"class":308}," {",[291,1924,1925],{"class":301}," CreatedAt ",[291,1927,376],{"class":297},[291,1929,1309],{"class":301},[291,1931,211],{"class":308},[291,1933,1934],{"class":301},"Now ",[291,1936,1017],{"class":308},[291,1938,1939],{"class":293,"line":422},[291,1940,478],{"class":308},[291,1942,1944,1946,1948,1950,1953,1955,1957,1959,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980,1983,1985,1987,1989,1991],{"class":1943,"line":452},[293,330],[291,1945,309],{"class":308},[291,1947,234],{"class":312},[291,1949,316],{"class":308},[291,1951,1952],{"class":357},"i",[291,1954,366],{"class":297},[291,1956,1780],{"class":301},[291,1958,211],{"class":308},[291,1960,1961],{"class":301},"ExpiresAt",[291,1963,347],{"class":308},[291,1965,217],{"class":308},[291,1967,1952],{"class":357},[291,1969,347],{"class":308},[291,1971,323],{"class":357},[291,1973,611],{"class":308},[291,1975,366],{"class":297},[291,1977,1780],{"class":301},[291,1979,211],{"class":308},[291,1981,1982],{"class":301},"CreatedAt",[291,1984,211],{"class":308},[291,1986,1654],{"class":312},[291,1988,316],{"class":308},[291,1990,1659],{"class":564},[291,1992,1662],{"class":308},[1994,1995,1997],"h3",{"id":1996},"what-counts-as-unset","What counts as \"unset\"",[1999,2000,2001,2014],"table",{},[2002,2003,2004],"thead",{},[2005,2006,2007,2011],"tr",{},[2008,2009,2010],"th",{},"Type",[2008,2012,2013],{},"Unset means",[2015,2016,2017,2031,2048,2060],"tbody",{},[2005,2018,2019,2026],{},[2020,2021,2022,2023],"td",{},"reference types, ",[208,2024,2025],{},"T?",[2020,2027,2028],{},[208,2029,2030],{},"null",[2005,2032,2033,2039],{},[2020,2034,2035,2036],{},"numbers, ",[208,2037,2038],{},"bool",[2020,2040,2041,2044,2045],{},[208,2042,2043],{},"0",", ",[208,2046,2047],{},"false",[2005,2049,2050,2055],{},[2020,2051,2052],{},[208,2053,2054],{},"DateTimeOffset",[2020,2056,2057],{},[208,2058,2059],{},"default(DateTimeOffset)",[2005,2061,2062,2066],{},[2020,2063,2064],{},[208,2065,597],{},[2020,2067,2068,2070,2071],{},[208,2069,2030],{}," only. ",[190,2072,2073,2076],{},[208,2074,2075],{},"\"\""," counts as set.",[2078,2079,2080],"caution",{},[181,2081,2082,2083,2085,2086,2088,2089,2091,2092,2094,2095,211],{},"Biome uses the type's default value to recognize an unset property. For a string that means ",[208,2084,2030],{},", so ",[208,2087,2075],{}," is kept as an explicit value. Leave derived strings ",[208,2090,2030],{}," in the factory. If a test needs to retain ",[208,2093,2030],{},", use a base blueprint without that ",[208,2096,234],{},[181,2098,2099,2100,2103,2104,2106,2107,2109],{},"For nullable value types the distinction holds too: ",[208,2101,2102],{},"int?"," ",[208,2105,2030],{}," fills, but ",[208,2108,2043],{}," survives.",[176,2111,2113],{"id":2112},"derives-run-in-order","Derives run in order",[181,2115,2116,2117,2119],{},"A title that includes a sequence number needs the final number first. ",[208,2118,234],{},"s run in declaration order, so place the title derivation after the sequence:",[279,2121,2124],{"className":281,"code":2122,"filename":1157,"highlights":2123,"language":286,"meta":287,"style":287},"    .Derive(pr => pr.PullRequestNumber, PullRequestNumbers)\n    .Derive(pr => pr.Title, (pr, _) => $\"Pull request {pr.PullRequestNumber}\")\n    .Derive(pr => pr.Branch, (pr, _) => $\"feature\u002F{pr.PullRequestNumber}\")\n",[305,285],[208,2125,2126,2154,2207],{"__ignoreMap":287},[291,2127,2128,2130,2132,2134,2137,2139,2142,2144,2147,2149,2152],{"class":293,"line":294},[291,2129,309],{"class":308},[291,2131,234],{"class":312},[291,2133,316],{"class":308},[291,2135,2136],{"class":357},"pr",[291,2138,366],{"class":297},[291,2140,2141],{"class":301}," pr",[291,2143,211],{"class":308},[291,2145,2146],{"class":301},"PullRequestNumber",[291,2148,347],{"class":308},[291,2150,2151],{"class":301}," PullRequestNumbers",[291,2153,326],{"class":308},[291,2155,2157,2159,2161,2163,2165,2167,2169,2171,2174,2176,2178,2180,2182,2184,2186,2188,2190,2193,2195,2197,2199,2201,2203,2205],{"class":2156,"line":305},[293,330],[291,2158,309],{"class":308},[291,2160,234],{"class":312},[291,2162,316],{"class":308},[291,2164,2136],{"class":357},[291,2166,366],{"class":297},[291,2168,2141],{"class":301},[291,2170,211],{"class":308},[291,2172,2173],{"class":301},"Title",[291,2175,347],{"class":308},[291,2177,217],{"class":308},[291,2179,2136],{"class":357},[291,2181,347],{"class":308},[291,2183,323],{"class":357},[291,2185,611],{"class":308},[291,2187,366],{"class":297},[291,2189,637],{"class":439},[291,2191,2192],{"class":443},"Pull request ",[291,2194,643],{"class":439},[291,2196,2136],{"class":301},[291,2198,211],{"class":439},[291,2200,2146],{"class":301},[291,2202,663],{"class":439},[291,2204,447],{"class":439},[291,2206,326],{"class":308},[291,2208,2210,2212,2214,2216,2218,2220,2222,2224,2227,2229,2231,2233,2235,2237,2239,2241,2243,2246,2248,2250,2252,2254,2256,2258],{"class":2209,"line":285},[293,330],[291,2211,309],{"class":308},[291,2213,234],{"class":312},[291,2215,316],{"class":308},[291,2217,2136],{"class":357},[291,2219,366],{"class":297},[291,2221,2141],{"class":301},[291,2223,211],{"class":308},[291,2225,2226],{"class":301},"Branch",[291,2228,347],{"class":308},[291,2230,217],{"class":308},[291,2232,2136],{"class":357},[291,2234,347],{"class":308},[291,2236,323],{"class":357},[291,2238,611],{"class":308},[291,2240,366],{"class":297},[291,2242,637],{"class":439},[291,2244,2245],{"class":443},"feature\u002F",[291,2247,643],{"class":439},[291,2249,2136],{"class":301},[291,2251,211],{"class":439},[291,2253,2146],{"class":301},[291,2255,663],{"class":439},[291,2257,447],{"class":439},[291,2259,326],{"class":308},[176,2261,2263],{"id":2262},"properties-must-be-settable","Properties must be settable",[1362,2265,2266],{},[181,2267,2268,2269,2272,2273,2276,2277,2280,2281,2283,2284,2287,2288,2290,2291,2293],{},"A customizer cannot assign an ",[208,2270,2271],{},"init"," property (",[208,2274,2275],{},"CS8852","), so a property that a test varies on the entity itself needs a ",[208,2278,2279],{},"set",". If the model must stay ",[208,2282,2271],{}," or ",[208,2285,2286],{},"required",", keep production code as it is and customize an ",[190,2289,266],{}," instead: see ",[260,2292,76],{"href":77},". A blueprint factory method with optional named parameters also works, but it creates a new blueprint on every call.",[181,2295,2296,2297,2283,2299,2301,2302,2305,2306,2309,2310,2313,2314,2316,2317,2319,2320,2323],{},"The property you select in ",[208,2298,234],{},[208,2300,244],{}," must be a ",[190,2303,2304],{},"directly writable instance property",", like ",[208,2307,2308],{},"e => e.Name",". Anything else throws ",[208,2311,2312],{},"ArgumentException"," at declaration time. ",[208,2315,2271],{}," properties are accepted here, because ",[208,2318,234],{}," and ",[208,2321,2322],{},"Default"," assign through a compiled setter.",[2325,2326,2327],"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 pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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 .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}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":287,"searchDepth":294,"depth":305,"links":2329},[2330,2331,2332,2333,2334,2337,2338],{"id":178,"depth":305,"text":179},{"id":273,"depth":305,"text":274},{"id":893,"depth":305,"text":894},{"id":1214,"depth":305,"text":1215},{"id":1390,"depth":305,"text":1391,"children":2335},[2336],{"id":1996,"depth":285,"text":1997},{"id":2112,"depth":305,"text":2113},{"id":2262,"depth":305,"text":2263},"How customizers and defaults work together, and why their order matters.","md",null,{},{"icon":44},{"title":41,"description":2339},"nJSvxZ9zrUGo8UZpnRf7NlxrOi19gqRV_DEzNPEQOJY",[2347,2349],{"title":36,"path":37,"stem":38,"description":2348,"icon":39,"children":-1},"One factory per entity type, as an immutable value.",{"title":46,"path":47,"stem":48,"description":2350,"icon":49,"children":-1},"Typed parents, the anchor rule, ancestors, and jumping back with Under.",1791831051739]