[{"data":1,"prerenderedAt":3956},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Finput-blueprints":170,"\u002Fguides\u002Finput-blueprints-surround":3951},[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":76,"body":172,"description":3944,"extension":3945,"links":3946,"meta":3947,"navigation":3948,"path":77,"seo":3949,"stem":78,"__hash__":3950},"docs\u002F2.guides\u002F09.input-blueprints.md",{"type":173,"value":174,"toc":3935},"minimark",[175,195,200,212,223,230,484,908,920,1162,1171,1175,1193,1200,1447,1872,1889,2069,2084,2175,2187,2191,2198,2256,2260,2263,2309,2326,2330,2341,2344,3518,3643,3660,3679,3683,3695,3854,3858,3915,3931],[176,177,178],"note",{},[179,180,181,182,186,187,190,191,194],"p",{},"Ordinary entity outputs for ",[183,184,185],"code",{},"Blueprint.FromInput",", and ",[183,188,189],{},"Blueprint.ChildFromInput"," for typed children, require a referenced library package that exposes those API forms. Check the API for the package selected by your project; if you use ",[183,192,193],{},"Zeeq.Biome.EntityFrameworkCore",", use the matching package version. This documentation does not identify a public release for these forms.",[196,197,199],"h2",{"id":198},"when-the-row-cant-be-edited-after-it-is-built","When the row can't be edited after it is built",[179,201,202,203,207,208,211],{},"A customizer runs ",[204,205,206],"strong",{},"after"," the factory has created the entity. That works while the test only assigns settable properties. It stops working when the property is init-only (including positional record properties), which a customizer cannot assign, or when one choice drives several values. A ",[183,209,210],{},"required"," member must be initialized by the factory, but if it has a setter a customizer can still set it.",[179,213,214,215,218,219,222],{},"An ",[204,216,217],{},"input blueprint"," moves customization earlier. The test customizes a small, settable ",[204,220,221],{},"input"," object. Then the factory reads the input and builds the row in one step. Your production model does not need to change to suit the tests.",[179,224,225,226,229],{},"For example, an academic term has an ",[183,227,228],{},"EndsOn"," date that tests never choose directly. They choose how many weeks the term lasts:",[231,232,238],"pre",{"className":233,"code":234,"filename":235,"language":236,"meta":237,"style":237},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","public sealed class AcademicTerm\n{\n    public required string Id { get; init; }\n    public required string Name { get; init; }\n    public required DateOnly StartsOn { get; init; }\n    public required DateOnly EndsOn { get; init; }\n}\n\n\u002F\u002F Construction data: settable, with nothing required.\npublic sealed class TermInput\n{\n    public string? Name { get; set; }\n    public DateOnly StartsOn { get; set; }\n    public int Weeks { get; set; }\n}\n","Domain.cs","csharp","",[183,239,240,260,267,300,324,349,373,379,386,393,405,410,435,456,479],{"__ignoreMap":237},[241,242,245,249,252,256],"span",{"class":243,"line":244},"line",1,[241,246,248],{"class":247},"sbsja","public",[241,250,251],{"class":247}," sealed",[241,253,255],{"class":254},"sG8yY"," class",[241,257,259],{"class":258},"sbgvK"," AcademicTerm\n",[241,261,263],{"class":243,"line":262},2,[241,264,266],{"class":265},"sP7_E","{\n",[241,268,270,273,276,280,283,286,289,292,295,297],{"class":243,"line":269},3,[241,271,272],{"class":247},"    public",[241,274,275],{"class":247}," required",[241,277,279],{"class":278},"smGrS"," string",[241,281,282],{"class":258}," Id",[241,284,285],{"class":265}," {",[241,287,288],{"class":254}," get",[241,290,291],{"class":265},";",[241,293,294],{"class":254}," init",[241,296,291],{"class":265},[241,298,299],{"class":265}," }\n",[241,301,303,305,307,309,312,314,316,318,320,322],{"class":243,"line":302},4,[241,304,272],{"class":247},[241,306,275],{"class":247},[241,308,279],{"class":278},[241,310,311],{"class":258}," Name",[241,313,285],{"class":265},[241,315,288],{"class":254},[241,317,291],{"class":265},[241,319,294],{"class":254},[241,321,291],{"class":265},[241,323,299],{"class":265},[241,325,327,329,331,334,337,339,341,343,345,347],{"class":243,"line":326},5,[241,328,272],{"class":247},[241,330,275],{"class":247},[241,332,333],{"class":258}," DateOnly",[241,335,336],{"class":258}," StartsOn",[241,338,285],{"class":265},[241,340,288],{"class":254},[241,342,291],{"class":265},[241,344,294],{"class":254},[241,346,291],{"class":265},[241,348,299],{"class":265},[241,350,352,354,356,358,361,363,365,367,369,371],{"class":243,"line":351},6,[241,353,272],{"class":247},[241,355,275],{"class":247},[241,357,333],{"class":258},[241,359,360],{"class":258}," EndsOn",[241,362,285],{"class":265},[241,364,288],{"class":254},[241,366,291],{"class":265},[241,368,294],{"class":254},[241,370,291],{"class":265},[241,372,299],{"class":265},[241,374,376],{"class":243,"line":375},7,[241,377,378],{"class":265},"}\n",[241,380,382],{"class":243,"line":381},8,[241,383,385],{"emptyLinePlaceholder":384},true,"\n",[241,387,389],{"class":243,"line":388},9,[241,390,392],{"class":391},"sutJx","\u002F\u002F Construction data: settable, with nothing required.\n",[241,394,396,398,400,402],{"class":243,"line":395},10,[241,397,248],{"class":247},[241,399,251],{"class":247},[241,401,255],{"class":254},[241,403,404],{"class":258}," TermInput\n",[241,406,408],{"class":243,"line":407},11,[241,409,266],{"class":265},[241,411,413,415,417,420,422,424,426,428,431,433],{"class":243,"line":412},12,[241,414,272],{"class":247},[241,416,279],{"class":278},[241,418,419],{"class":265},"?",[241,421,311],{"class":258},[241,423,285],{"class":265},[241,425,288],{"class":254},[241,427,291],{"class":265},[241,429,430],{"class":254}," set",[241,432,291],{"class":265},[241,434,299],{"class":265},[241,436,438,440,442,444,446,448,450,452,454],{"class":243,"line":437},13,[241,439,272],{"class":247},[241,441,333],{"class":258},[241,443,336],{"class":258},[241,445,285],{"class":265},[241,447,288],{"class":254},[241,449,291],{"class":265},[241,451,430],{"class":254},[241,453,291],{"class":265},[241,455,299],{"class":265},[241,457,459,461,464,467,469,471,473,475,477],{"class":243,"line":458},14,[241,460,272],{"class":247},[241,462,463],{"class":278}," int",[241,465,466],{"class":258}," Weeks",[241,468,285],{"class":265},[241,470,288],{"class":254},[241,472,291],{"class":265},[241,474,430],{"class":254},[241,476,291],{"class":265},[241,478,299],{"class":265},[241,480,482],{"class":243,"line":481},15,[241,483,378],{"class":265},[231,485,492],{"className":233,"code":486,"filename":487,"highlights":488,"language":236,"meta":237,"style":237},"public static partial class Blueprints\n{\n    public static readonly InputBlueprint\u003CSchoolSeed, TermInput, AcademicTerm> Term =\n        Blueprint\n            .FromInput\u003CSchoolSeed, TermInput, AcademicTerm>(\n                () => new(),\n                (input, ctx) =>\n                    new()\n                    {\n                        Id = ctx.NewId(\"term\"),\n                        Name = input.Name!,\n                        StartsOn = input.StartsOn,\n                        EndsOn = input.StartsOn.AddDays(input.Weeks * 7),\n                    }\n            )\n            .Derive(t => t.StartsOn, (_, ctx) => DateOnly.FromDateTime(ctx.Now.UtcDateTime))\n            .Derive(t => t.Weeks, (_, _) => 18)\n            .Derive(t => t.Name, (t, _) => $\"{t.Weeks}-week term\");\n}\n","Blueprints.cs",[437,489,490,491],16,17,18,[183,493,494,509,513,551,557,581,595,613,621,626,658,679,695,733,738,743,806,847,903],{"__ignoreMap":237},[241,495,496,498,501,504,506],{"class":243,"line":244},[241,497,248],{"class":247},[241,499,500],{"class":247}," static",[241,502,503],{"class":247}," partial",[241,505,255],{"class":254},[241,507,508],{"class":258}," Blueprints\n",[241,510,511],{"class":243,"line":262},[241,512,266],{"class":265},[241,514,515,517,519,522,525,528,531,534,537,539,542,545,548],{"class":243,"line":269},[241,516,272],{"class":247},[241,518,500],{"class":247},[241,520,521],{"class":247}," readonly",[241,523,524],{"class":258}," InputBlueprint",[241,526,527],{"class":265},"\u003C",[241,529,530],{"class":258},"SchoolSeed",[241,532,533],{"class":265},",",[241,535,536],{"class":258}," TermInput",[241,538,533],{"class":265},[241,540,541],{"class":258}," AcademicTerm",[241,543,544],{"class":265},">",[241,546,547],{"class":258}," Term",[241,549,550],{"class":278}," =\n",[241,552,553],{"class":243,"line":302},[241,554,556],{"class":555},"su5hD","        Blueprint\n",[241,558,559,562,566,568,570,572,574,576,578],{"class":243,"line":326},[241,560,561],{"class":265},"            .",[241,563,565],{"class":564},"sGLFI","FromInput",[241,567,527],{"class":265},[241,569,530],{"class":258},[241,571,533],{"class":265},[241,573,536],{"class":258},[241,575,533],{"class":265},[241,577,541],{"class":258},[241,579,580],{"class":265},">(\n",[241,582,583,586,589,592],{"class":243,"line":351},[241,584,585],{"class":265},"                ()",[241,587,588],{"class":278}," =>",[241,590,591],{"class":278}," new",[241,593,594],{"class":265},"(),\n",[241,596,597,600,602,604,607,610],{"class":243,"line":375},[241,598,599],{"class":265},"                (",[241,601,221],{"class":258},[241,603,533],{"class":265},[241,605,606],{"class":258}," ctx",[241,608,609],{"class":265},")",[241,611,612],{"class":278}," =>\n",[241,614,615,618],{"class":243,"line":381},[241,616,617],{"class":278},"                    new",[241,619,620],{"class":265},"()\n",[241,622,623],{"class":243,"line":388},[241,624,625],{"class":265},"                    {\n",[241,627,628,631,634,636,639,642,645,649,653,655],{"class":243,"line":395},[241,629,630],{"class":555},"                        Id ",[241,632,633],{"class":278},"=",[241,635,606],{"class":555},[241,637,638],{"class":265},".",[241,640,641],{"class":564},"NewId",[241,643,644],{"class":265},"(",[241,646,648],{"class":647},"sjJ54","\"",[241,650,652],{"class":651},"s_sjI","term",[241,654,648],{"class":647},[241,656,657],{"class":265},"),\n",[241,659,660,663,665,668,670,673,676],{"class":243,"line":407},[241,661,662],{"class":555},"                        Name ",[241,664,633],{"class":278},[241,666,667],{"class":555}," input",[241,669,638],{"class":265},[241,671,672],{"class":555},"Name",[241,674,675],{"class":278},"!",[241,677,678],{"class":265},",\n",[241,680,681,684,686,688,690,693],{"class":243,"line":412},[241,682,683],{"class":555},"                        StartsOn ",[241,685,633],{"class":278},[241,687,667],{"class":555},[241,689,638],{"class":265},[241,691,692],{"class":555},"StartsOn",[241,694,678],{"class":265},[241,696,699,702,704,706,708,710,712,715,717,719,721,724,727,731],{"class":697,"line":437},[243,698],"highlight",[241,700,701],{"class":555},"                        EndsOn ",[241,703,633],{"class":278},[241,705,667],{"class":555},[241,707,638],{"class":265},[241,709,692],{"class":555},[241,711,638],{"class":265},[241,713,714],{"class":564},"AddDays",[241,716,644],{"class":265},[241,718,221],{"class":555},[241,720,638],{"class":265},[241,722,723],{"class":555},"Weeks ",[241,725,726],{"class":278},"*",[241,728,730],{"class":729},"srdBf"," 7",[241,732,657],{"class":265},[241,734,735],{"class":243,"line":458},[241,736,737],{"class":265},"                    }\n",[241,739,740],{"class":243,"line":481},[241,741,742],{"class":265},"            )\n",[241,744,746,748,751,753,756,758,761,763,765,767,770,773,775,777,779,781,783,785,788,790,793,795,798,800,803],{"class":745,"line":489},[243,698],[241,747,561],{"class":265},[241,749,750],{"class":564},"Derive",[241,752,644],{"class":265},[241,754,755],{"class":258},"t",[241,757,588],{"class":278},[241,759,760],{"class":555}," t",[241,762,638],{"class":265},[241,764,692],{"class":555},[241,766,533],{"class":265},[241,768,769],{"class":265}," (",[241,771,772],{"class":258},"_",[241,774,533],{"class":265},[241,776,606],{"class":258},[241,778,609],{"class":265},[241,780,588],{"class":278},[241,782,333],{"class":555},[241,784,638],{"class":265},[241,786,787],{"class":564},"FromDateTime",[241,789,644],{"class":265},[241,791,792],{"class":555},"ctx",[241,794,638],{"class":265},[241,796,797],{"class":555},"Now",[241,799,638],{"class":265},[241,801,802],{"class":555},"UtcDateTime",[241,804,805],{"class":265},"))\n",[241,807,809,811,813,815,817,819,821,823,826,828,830,832,834,837,839,841,844],{"class":808,"line":490},[243,698],[241,810,561],{"class":265},[241,812,750],{"class":564},[241,814,644],{"class":265},[241,816,755],{"class":258},[241,818,588],{"class":278},[241,820,760],{"class":555},[241,822,638],{"class":265},[241,824,825],{"class":555},"Weeks",[241,827,533],{"class":265},[241,829,769],{"class":265},[241,831,772],{"class":258},[241,833,533],{"class":265},[241,835,836],{"class":258}," _",[241,838,609],{"class":265},[241,840,588],{"class":278},[241,842,843],{"class":729}," 18",[241,845,846],{"class":265},")\n",[241,848,850,852,854,856,858,860,862,864,866,868,870,872,874,876,878,880,883,886,888,890,892,895,898,900],{"class":849,"line":491},[243,698],[241,851,561],{"class":265},[241,853,750],{"class":564},[241,855,644],{"class":265},[241,857,755],{"class":258},[241,859,588],{"class":278},[241,861,760],{"class":555},[241,863,638],{"class":265},[241,865,672],{"class":555},[241,867,533],{"class":265},[241,869,769],{"class":265},[241,871,755],{"class":258},[241,873,533],{"class":265},[241,875,836],{"class":258},[241,877,609],{"class":265},[241,879,588],{"class":278},[241,881,882],{"class":647}," $\"",[241,884,885],{"class":647},"{",[241,887,755],{"class":555},[241,889,638],{"class":647},[241,891,825],{"class":555},[241,893,894],{"class":647},"}",[241,896,897],{"class":651},"-week term",[241,899,648],{"class":647},[241,901,902],{"class":265},");\n",[241,904,906],{"class":243,"line":905},19,[241,907,378],{"class":265},[179,909,910,911,913,914,916,917,919],{},"The factory initializes every ",[183,912,210],{}," member, so the row is always valid. ",[183,915,750],{}," fills ",[204,918,221],{}," properties that are still unset, in declaration order, before the factory runs. A test then states only the choice it cares about:",[921,922,923,1012],"code-group",{},[231,924,928],{"className":233,"code":925,"filename":926,"highlights":927,"language":236,"meta":237,"style":237},"await TestBiome\n    .Start(out _)\n    .AddOne(Blueprints.Term, out var halfTerm, t => t.Weeks = 9)\n    .BuildAsync();\n","With Biome",[269],[183,929,930,938,955,1002],{"__ignoreMap":237},[241,931,932,935],{"class":243,"line":244},[241,933,934],{"class":278},"await",[241,936,937],{"class":555}," TestBiome\n",[241,939,940,943,946,948,951,953],{"class":243,"line":262},[241,941,942],{"class":265},"    .",[241,944,945],{"class":564},"Start",[241,947,644],{"class":265},[241,949,950],{"class":247},"out",[241,952,836],{"class":555},[241,954,846],{"class":265},[241,956,958,960,963,965,967,969,972,974,977,980,983,985,987,989,991,993,995,997,1000],{"class":957,"line":269},[243,698],[241,959,942],{"class":265},[241,961,962],{"class":564},"AddOne",[241,964,644],{"class":265},[241,966,36],{"class":555},[241,968,638],{"class":265},[241,970,971],{"class":555},"Term",[241,973,533],{"class":265},[241,975,976],{"class":247}," out",[241,978,979],{"class":254}," var",[241,981,982],{"class":258}," halfTerm",[241,984,533],{"class":265},[241,986,760],{"class":258},[241,988,588],{"class":278},[241,990,760],{"class":555},[241,992,638],{"class":265},[241,994,723],{"class":555},[241,996,633],{"class":278},[241,998,999],{"class":729}," 9",[241,1001,846],{"class":265},[241,1003,1004,1006,1009],{"class":243,"line":302},[241,1005,942],{"class":265},[241,1007,1008],{"class":564},"BuildAsync",[241,1010,1011],{"class":265},"();\n",[1013,1014,1017],"code-collapse",{"label":1015,"name":1016},"Without Biome","setup",[231,1018,1020],{"className":233,"code":1019,"language":236,"meta":237,"style":237},"var startsOn = DateOnly.FromDateTime(DateTime.UtcNow);\nvar halfTerm = new AcademicTerm\n{\n    Id = $\"term_{Guid.CreateVersion7():N}\",\n    Name = \"9-week term\",\n    StartsOn = startsOn,\n    EndsOn = startsOn.AddDays(9 * 7),\n};\n",[183,1021,1022,1051,1063,1067,1104,1121,1132,1157],{"__ignoreMap":237},[241,1023,1024,1027,1030,1033,1035,1037,1039,1041,1044,1046,1049],{"class":243,"line":244},[241,1025,1026],{"class":254},"var",[241,1028,1029],{"class":258}," startsOn",[241,1031,1032],{"class":278}," =",[241,1034,333],{"class":555},[241,1036,638],{"class":265},[241,1038,787],{"class":564},[241,1040,644],{"class":265},[241,1042,1043],{"class":555},"DateTime",[241,1045,638],{"class":265},[241,1047,1048],{"class":555},"UtcNow",[241,1050,902],{"class":265},[241,1052,1053,1055,1057,1059,1061],{"class":243,"line":262},[241,1054,1026],{"class":254},[241,1056,982],{"class":258},[241,1058,1032],{"class":278},[241,1060,591],{"class":278},[241,1062,259],{"class":258},[241,1064,1065],{"class":243,"line":269},[241,1066,266],{"class":265},[241,1068,1069,1072,1074,1076,1079,1081,1084,1086,1089,1092,1095,1098,1100,1102],{"class":243,"line":302},[241,1070,1071],{"class":555},"    Id ",[241,1073,633],{"class":278},[241,1075,882],{"class":647},[241,1077,1078],{"class":651},"term_",[241,1080,885],{"class":647},[241,1082,1083],{"class":555},"Guid",[241,1085,638],{"class":647},[241,1087,1088],{"class":564},"CreateVersion7",[241,1090,1091],{"class":647},"()",[241,1093,1094],{"class":278},":",[241,1096,1097],{"class":555},"N",[241,1099,894],{"class":647},[241,1101,648],{"class":647},[241,1103,678],{"class":265},[241,1105,1106,1109,1111,1114,1117,1119],{"class":243,"line":326},[241,1107,1108],{"class":555},"    Name ",[241,1110,633],{"class":278},[241,1112,1113],{"class":647}," \"",[241,1115,1116],{"class":651},"9-week term",[241,1118,648],{"class":647},[241,1120,678],{"class":265},[241,1122,1123,1126,1128,1130],{"class":243,"line":351},[241,1124,1125],{"class":555},"    StartsOn ",[241,1127,633],{"class":278},[241,1129,1029],{"class":555},[241,1131,678],{"class":265},[241,1133,1134,1137,1139,1141,1143,1145,1147,1150,1153,1155],{"class":243,"line":375},[241,1135,1136],{"class":555},"    EndsOn ",[241,1138,633],{"class":278},[241,1140,1029],{"class":555},[241,1142,638],{"class":265},[241,1144,714],{"class":564},[241,1146,644],{"class":265},[241,1148,1149],{"class":729},"9",[241,1151,1152],{"class":278}," *",[241,1154,730],{"class":729},[241,1156,657],{"class":265},[241,1158,1159],{"class":243,"line":381},[241,1160,1161],{"class":265},"};\n",[179,1163,1164,1167,1168,1170],{},[183,1165,1166],{},"halfTerm.EndsOn"," is nine weeks after ",[183,1169,692],{},", and the test never mentioned a date. Both versions stay in memory, because neither saves anything.",[196,1172,1174],{"id":1173},"typed-child-inputs","Typed child inputs",[179,1176,1177,1178,1180,1181,1184,1185,1188,1189,1192],{},"A child can use an input too. ",[183,1179,189],{}," takes the input factory and a build function that receives the ",[204,1182,1183],{},"typed parent",", the input, and the child context. It behaves like ",[183,1186,1187],{},"ChildOf",": the child compiles only after its parent, and ",[183,1190,1191],{},"ctx.Ancestor\u003CT>()"," reaches further up.",[179,1194,1195,1196,1094],{},"An enrollment row is immutable, and its seat number comes from a ",[1197,1198,1199],"a",{"href":57},"sequence",[231,1201,1203],{"className":233,"code":1202,"filename":235,"language":236,"meta":237,"style":237},"public sealed class Enrollment\n{\n    public required string Id { get; init; }\n    public required string SchoolId { get; init; }\n    public required string ClassId { get; init; }\n    public required int Seat { get; init; }\n    public required string Status { get; init; }\n    public required DateTimeOffset EnrolledAtUtc { get; init; }\n}\n\npublic sealed class EnrollmentInput\n{\n    public int Seat { get; set; }\n    public bool Waitlisted { get; set; }\n    public DateTimeOffset EnrolledAtUtc { get; set; }\n}\n",[183,1204,1205,1216,1220,1242,1265,1288,1311,1334,1358,1362,1366,1377,1381,1401,1423,1443],{"__ignoreMap":237},[241,1206,1207,1209,1211,1213],{"class":243,"line":244},[241,1208,248],{"class":247},[241,1210,251],{"class":247},[241,1212,255],{"class":254},[241,1214,1215],{"class":258}," Enrollment\n",[241,1217,1218],{"class":243,"line":262},[241,1219,266],{"class":265},[241,1221,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240],{"class":243,"line":269},[241,1223,272],{"class":247},[241,1225,275],{"class":247},[241,1227,279],{"class":278},[241,1229,282],{"class":258},[241,1231,285],{"class":265},[241,1233,288],{"class":254},[241,1235,291],{"class":265},[241,1237,294],{"class":254},[241,1239,291],{"class":265},[241,1241,299],{"class":265},[241,1243,1244,1246,1248,1250,1253,1255,1257,1259,1261,1263],{"class":243,"line":302},[241,1245,272],{"class":247},[241,1247,275],{"class":247},[241,1249,279],{"class":278},[241,1251,1252],{"class":258}," SchoolId",[241,1254,285],{"class":265},[241,1256,288],{"class":254},[241,1258,291],{"class":265},[241,1260,294],{"class":254},[241,1262,291],{"class":265},[241,1264,299],{"class":265},[241,1266,1267,1269,1271,1273,1276,1278,1280,1282,1284,1286],{"class":243,"line":326},[241,1268,272],{"class":247},[241,1270,275],{"class":247},[241,1272,279],{"class":278},[241,1274,1275],{"class":258}," ClassId",[241,1277,285],{"class":265},[241,1279,288],{"class":254},[241,1281,291],{"class":265},[241,1283,294],{"class":254},[241,1285,291],{"class":265},[241,1287,299],{"class":265},[241,1289,1290,1292,1294,1296,1299,1301,1303,1305,1307,1309],{"class":243,"line":351},[241,1291,272],{"class":247},[241,1293,275],{"class":247},[241,1295,463],{"class":278},[241,1297,1298],{"class":258}," Seat",[241,1300,285],{"class":265},[241,1302,288],{"class":254},[241,1304,291],{"class":265},[241,1306,294],{"class":254},[241,1308,291],{"class":265},[241,1310,299],{"class":265},[241,1312,1313,1315,1317,1319,1322,1324,1326,1328,1330,1332],{"class":243,"line":375},[241,1314,272],{"class":247},[241,1316,275],{"class":247},[241,1318,279],{"class":278},[241,1320,1321],{"class":258}," Status",[241,1323,285],{"class":265},[241,1325,288],{"class":254},[241,1327,291],{"class":265},[241,1329,294],{"class":254},[241,1331,291],{"class":265},[241,1333,299],{"class":265},[241,1335,1336,1338,1340,1343,1346,1348,1350,1352,1354,1356],{"class":243,"line":381},[241,1337,272],{"class":247},[241,1339,275],{"class":247},[241,1341,1342],{"class":258}," DateTimeOffset",[241,1344,1345],{"class":258}," EnrolledAtUtc",[241,1347,285],{"class":265},[241,1349,288],{"class":254},[241,1351,291],{"class":265},[241,1353,294],{"class":254},[241,1355,291],{"class":265},[241,1357,299],{"class":265},[241,1359,1360],{"class":243,"line":388},[241,1361,378],{"class":265},[241,1363,1364],{"class":243,"line":395},[241,1365,385],{"emptyLinePlaceholder":384},[241,1367,1368,1370,1372,1374],{"class":243,"line":407},[241,1369,248],{"class":247},[241,1371,251],{"class":247},[241,1373,255],{"class":254},[241,1375,1376],{"class":258}," EnrollmentInput\n",[241,1378,1379],{"class":243,"line":412},[241,1380,266],{"class":265},[241,1382,1383,1385,1387,1389,1391,1393,1395,1397,1399],{"class":243,"line":437},[241,1384,272],{"class":247},[241,1386,463],{"class":278},[241,1388,1298],{"class":258},[241,1390,285],{"class":265},[241,1392,288],{"class":254},[241,1394,291],{"class":265},[241,1396,430],{"class":254},[241,1398,291],{"class":265},[241,1400,299],{"class":265},[241,1402,1403,1405,1408,1411,1413,1415,1417,1419,1421],{"class":243,"line":458},[241,1404,272],{"class":247},[241,1406,1407],{"class":278}," bool",[241,1409,1410],{"class":258}," Waitlisted",[241,1412,285],{"class":265},[241,1414,288],{"class":254},[241,1416,291],{"class":265},[241,1418,430],{"class":254},[241,1420,291],{"class":265},[241,1422,299],{"class":265},[241,1424,1425,1427,1429,1431,1433,1435,1437,1439,1441],{"class":243,"line":481},[241,1426,272],{"class":247},[241,1428,1342],{"class":258},[241,1430,1345],{"class":258},[241,1432,285],{"class":265},[241,1434,288],{"class":254},[241,1436,291],{"class":265},[241,1438,430],{"class":254},[241,1440,291],{"class":265},[241,1442,299],{"class":265},[241,1444,1445],{"class":243,"line":489},[241,1446,378],{"class":265},[231,1448,1453],{"className":233,"code":1449,"filename":487,"highlights":1450,"language":236,"meta":237,"style":237},"public static readonly Sequence\u003Cint> EnrollmentSeats = Sequence\n    .Of(1, n => n + 1)\n    .PerParent(); \u002F\u002F restarts for each class\n\npublic static readonly ChildInputBlueprint\u003C\n    SchoolSeed,\n    SchoolClass,\n    EnrollmentInput,\n    Enrollment\n> Enrollment = Blueprint\n    .ChildFromInput\u003CSchoolSeed, SchoolClass, EnrollmentInput, Enrollment>(\n        () => new(),\n        (schoolClass, input, ctx) =>\n            new()\n            {\n                Id = ctx.NewId(\"enr\"),\n                SchoolId = ctx.Ancestor\u003CSchool>().Id, \u002F\u002F grandparent\n                ClassId = schoolClass.Id, \u002F\u002F typed parent\n                Seat = input.Seat,\n                Status = input.Waitlisted ? \"waitlisted\" : \"active\",\n                EnrolledAtUtc = input.EnrolledAtUtc,\n            }\n    )\n    .Derive(i => i.Seat, EnrollmentSeats)\n    .Derive(i => i.EnrolledAtUtc, (_, ctx) => ctx.Now);\n",[244,262,269,490,491,1451,1452],24,25,[183,1454,1455,1482,1513,1527,1531,1545,1550,1555,1560,1565,1577,1605,1616,1636,1643,1648,1672,1703,1723,1739,1775,1792,1798,1804,1831],{"__ignoreMap":237},[241,1456,1458,1460,1462,1464,1467,1469,1472,1474,1477,1479],{"class":1457,"line":244},[243,698],[241,1459,248],{"class":247},[241,1461,500],{"class":247},[241,1463,521],{"class":247},[241,1465,1466],{"class":258}," Sequence",[241,1468,527],{"class":265},[241,1470,1471],{"class":278},"int",[241,1473,544],{"class":265},[241,1475,1476],{"class":258}," EnrollmentSeats",[241,1478,1032],{"class":278},[241,1480,1481],{"class":555}," Sequence\n",[241,1483,1485,1487,1490,1492,1495,1497,1500,1502,1505,1508,1511],{"class":1484,"line":262},[243,698],[241,1486,942],{"class":265},[241,1488,1489],{"class":564},"Of",[241,1491,644],{"class":265},[241,1493,1494],{"class":729},"1",[241,1496,533],{"class":265},[241,1498,1499],{"class":258}," n",[241,1501,588],{"class":278},[241,1503,1504],{"class":555}," n ",[241,1506,1507],{"class":278},"+",[241,1509,1510],{"class":729}," 1",[241,1512,846],{"class":265},[241,1514,1516,1518,1521,1524],{"class":1515,"line":269},[243,698],[241,1517,942],{"class":265},[241,1519,1520],{"class":564},"PerParent",[241,1522,1523],{"class":265},"();",[241,1525,1526],{"class":391}," \u002F\u002F restarts for each class\n",[241,1528,1529],{"class":243,"line":302},[241,1530,385],{"emptyLinePlaceholder":384},[241,1532,1533,1535,1537,1539,1542],{"class":243,"line":326},[241,1534,248],{"class":247},[241,1536,500],{"class":247},[241,1538,521],{"class":247},[241,1540,1541],{"class":555}," ChildInputBlueprint",[241,1543,1544],{"class":278},"\u003C\n",[241,1546,1547],{"class":243,"line":351},[241,1548,1549],{"class":555},"    SchoolSeed,\n",[241,1551,1552],{"class":243,"line":375},[241,1553,1554],{"class":555},"    SchoolClass,\n",[241,1556,1557],{"class":243,"line":381},[241,1558,1559],{"class":555},"    EnrollmentInput,\n",[241,1561,1562],{"class":243,"line":388},[241,1563,1564],{"class":555},"    Enrollment\n",[241,1566,1567,1569,1572,1574],{"class":243,"line":395},[241,1568,544],{"class":278},[241,1570,1571],{"class":555}," Enrollment ",[241,1573,633],{"class":278},[241,1575,1576],{"class":555}," Blueprint\n",[241,1578,1579,1581,1584,1586,1588,1590,1593,1595,1598,1600,1603],{"class":243,"line":407},[241,1580,942],{"class":265},[241,1582,1583],{"class":564},"ChildFromInput",[241,1585,527],{"class":265},[241,1587,530],{"class":258},[241,1589,533],{"class":265},[241,1591,1592],{"class":258}," SchoolClass",[241,1594,533],{"class":265},[241,1596,1597],{"class":258}," EnrollmentInput",[241,1599,533],{"class":265},[241,1601,1602],{"class":258}," Enrollment",[241,1604,580],{"class":265},[241,1606,1607,1610,1612,1614],{"class":243,"line":412},[241,1608,1609],{"class":265},"        ()",[241,1611,588],{"class":278},[241,1613,591],{"class":278},[241,1615,594],{"class":265},[241,1617,1618,1621,1624,1626,1628,1630,1632,1634],{"class":243,"line":437},[241,1619,1620],{"class":265},"        (",[241,1622,1623],{"class":258},"schoolClass",[241,1625,533],{"class":265},[241,1627,667],{"class":258},[241,1629,533],{"class":265},[241,1631,606],{"class":258},[241,1633,609],{"class":265},[241,1635,612],{"class":278},[241,1637,1638,1641],{"class":243,"line":458},[241,1639,1640],{"class":278},"            new",[241,1642,620],{"class":265},[241,1644,1645],{"class":243,"line":481},[241,1646,1647],{"class":265},"            {\n",[241,1649,1650,1653,1655,1657,1659,1661,1663,1665,1668,1670],{"class":243,"line":489},[241,1651,1652],{"class":555},"                Id ",[241,1654,633],{"class":278},[241,1656,606],{"class":555},[241,1658,638],{"class":265},[241,1660,641],{"class":564},[241,1662,644],{"class":265},[241,1664,648],{"class":647},[241,1666,1667],{"class":651},"enr",[241,1669,648],{"class":647},[241,1671,657],{"class":265},[241,1673,1675,1678,1680,1682,1684,1687,1689,1692,1695,1698,1700],{"class":1674,"line":490},[243,698],[241,1676,1677],{"class":555},"                SchoolId ",[241,1679,633],{"class":278},[241,1681,606],{"class":555},[241,1683,638],{"class":265},[241,1685,1686],{"class":564},"Ancestor",[241,1688,527],{"class":265},[241,1690,1691],{"class":258},"School",[241,1693,1694],{"class":265},">().",[241,1696,1697],{"class":555},"Id",[241,1699,533],{"class":265},[241,1701,1702],{"class":391}," \u002F\u002F grandparent\n",[241,1704,1706,1709,1711,1714,1716,1718,1720],{"class":1705,"line":491},[243,698],[241,1707,1708],{"class":555},"                ClassId ",[241,1710,633],{"class":278},[241,1712,1713],{"class":555}," schoolClass",[241,1715,638],{"class":265},[241,1717,1697],{"class":555},[241,1719,533],{"class":265},[241,1721,1722],{"class":391}," \u002F\u002F typed parent\n",[241,1724,1725,1728,1730,1732,1734,1737],{"class":243,"line":905},[241,1726,1727],{"class":555},"                Seat ",[241,1729,633],{"class":278},[241,1731,667],{"class":555},[241,1733,638],{"class":265},[241,1735,1736],{"class":555},"Seat",[241,1738,678],{"class":265},[241,1740,1742,1745,1747,1749,1751,1754,1756,1758,1761,1763,1766,1768,1771,1773],{"class":243,"line":1741},20,[241,1743,1744],{"class":555},"                Status ",[241,1746,633],{"class":278},[241,1748,667],{"class":555},[241,1750,638],{"class":265},[241,1752,1753],{"class":555},"Waitlisted ",[241,1755,419],{"class":278},[241,1757,1113],{"class":647},[241,1759,1760],{"class":651},"waitlisted",[241,1762,648],{"class":647},[241,1764,1765],{"class":278}," :",[241,1767,1113],{"class":647},[241,1769,1770],{"class":651},"active",[241,1772,648],{"class":647},[241,1774,678],{"class":265},[241,1776,1778,1781,1783,1785,1787,1790],{"class":243,"line":1777},21,[241,1779,1780],{"class":555},"                EnrolledAtUtc ",[241,1782,633],{"class":278},[241,1784,667],{"class":555},[241,1786,638],{"class":265},[241,1788,1789],{"class":555},"EnrolledAtUtc",[241,1791,678],{"class":265},[241,1793,1795],{"class":243,"line":1794},22,[241,1796,1797],{"class":265},"            }\n",[241,1799,1801],{"class":243,"line":1800},23,[241,1802,1803],{"class":265},"    )\n",[241,1805,1807,1809,1811,1813,1816,1818,1821,1823,1825,1827,1829],{"class":1806,"line":1451},[243,698],[241,1808,942],{"class":265},[241,1810,750],{"class":564},[241,1812,644],{"class":265},[241,1814,1815],{"class":258},"i",[241,1817,588],{"class":278},[241,1819,1820],{"class":555}," i",[241,1822,638],{"class":265},[241,1824,1736],{"class":555},[241,1826,533],{"class":265},[241,1828,1476],{"class":555},[241,1830,846],{"class":265},[241,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870],{"class":1833,"line":1452},[243,698],[241,1835,942],{"class":265},[241,1837,750],{"class":564},[241,1839,644],{"class":265},[241,1841,1815],{"class":258},[241,1843,588],{"class":278},[241,1845,1820],{"class":555},[241,1847,638],{"class":265},[241,1849,1789],{"class":555},[241,1851,533],{"class":265},[241,1853,769],{"class":265},[241,1855,772],{"class":258},[241,1857,533],{"class":265},[241,1859,606],{"class":258},[241,1861,609],{"class":265},[241,1863,588],{"class":278},[241,1865,606],{"class":555},[241,1867,638],{"class":265},[241,1869,797],{"class":555},[241,1871,902],{"class":265},[179,1873,1874,1875,1877,1878,1881,1882,1884,1885,1888],{},"Customizers and ",[183,1876,750],{}," work on ",[183,1879,1880],{},"EnrollmentInput",", while ",[183,1883,950],{}," variables and the anchor hold the ",[183,1886,1887],{},"Enrollment"," rows. Fan-out is per parent, and a sequence reserves explicit seats across the whole step before it fills the rest:",[231,1890,1894],{"className":233,"code":1891,"filename":1892,"highlights":1893,"language":236,"meta":237,"style":237},"await TestBiome\n    .Start(out _)\n    .AddDistrict(out _)\n    .AddSchool(out _)\n    .AddClass(out var algebra)\n    .Add(Blueprints.Enrollment, out var seated, 2) \u002F\u002F seats 1, 2\n    .Under(algebra)\n    .AddOne(Blueprints.Enrollment, out var late, e => e.Waitlisted = true) \u002F\u002F seat 3\n    .BuildAsync();\n","EnrollmentTests.cs",[351,381],[183,1895,1896,1902,1916,1931,1946,1964,1999,2013,2061],{"__ignoreMap":237},[241,1897,1898,1900],{"class":243,"line":244},[241,1899,934],{"class":278},[241,1901,937],{"class":555},[241,1903,1904,1906,1908,1910,1912,1914],{"class":243,"line":262},[241,1905,942],{"class":265},[241,1907,945],{"class":564},[241,1909,644],{"class":265},[241,1911,950],{"class":247},[241,1913,836],{"class":555},[241,1915,846],{"class":265},[241,1917,1918,1920,1923,1925,1927,1929],{"class":243,"line":269},[241,1919,942],{"class":265},[241,1921,1922],{"class":564},"AddDistrict",[241,1924,644],{"class":265},[241,1926,950],{"class":247},[241,1928,836],{"class":555},[241,1930,846],{"class":265},[241,1932,1933,1935,1938,1940,1942,1944],{"class":243,"line":302},[241,1934,942],{"class":265},[241,1936,1937],{"class":564},"AddSchool",[241,1939,644],{"class":265},[241,1941,950],{"class":247},[241,1943,836],{"class":555},[241,1945,846],{"class":265},[241,1947,1948,1950,1953,1955,1957,1959,1962],{"class":243,"line":326},[241,1949,942],{"class":265},[241,1951,1952],{"class":564},"AddClass",[241,1954,644],{"class":265},[241,1956,950],{"class":247},[241,1958,979],{"class":254},[241,1960,1961],{"class":258}," algebra",[241,1963,846],{"class":265},[241,1965,1967,1969,1972,1974,1976,1978,1980,1982,1984,1986,1989,1991,1994,1996],{"class":1966,"line":351},[243,698],[241,1968,942],{"class":265},[241,1970,1971],{"class":564},"Add",[241,1973,644],{"class":265},[241,1975,36],{"class":555},[241,1977,638],{"class":265},[241,1979,1887],{"class":555},[241,1981,533],{"class":265},[241,1983,976],{"class":247},[241,1985,979],{"class":254},[241,1987,1988],{"class":258}," seated",[241,1990,533],{"class":265},[241,1992,1993],{"class":729}," 2",[241,1995,609],{"class":265},[241,1997,1998],{"class":391}," \u002F\u002F seats 1, 2\n",[241,2000,2001,2003,2006,2008,2011],{"class":243,"line":375},[241,2002,942],{"class":265},[241,2004,2005],{"class":564},"Under",[241,2007,644],{"class":265},[241,2009,2010],{"class":555},"algebra",[241,2012,846],{"class":265},[241,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2037,2039,2042,2044,2046,2048,2050,2052,2056,2058],{"class":2015,"line":381},[243,698],[241,2017,942],{"class":265},[241,2019,962],{"class":564},[241,2021,644],{"class":265},[241,2023,36],{"class":555},[241,2025,638],{"class":265},[241,2027,1887],{"class":555},[241,2029,533],{"class":265},[241,2031,976],{"class":247},[241,2033,979],{"class":254},[241,2035,2036],{"class":258}," late",[241,2038,533],{"class":265},[241,2040,2041],{"class":258}," e",[241,2043,588],{"class":278},[241,2045,2041],{"class":555},[241,2047,638],{"class":265},[241,2049,1753],{"class":555},[241,2051,633],{"class":278},[241,2053,2055],{"class":2054},"syTEX"," true",[241,2057,609],{"class":265},[241,2059,2060],{"class":391}," \u002F\u002F seat 3\n",[241,2062,2063,2065,2067],{"class":243,"line":388},[241,2064,942],{"class":265},[241,2066,1008],{"class":564},[241,2068,1011],{"class":265},[179,2070,2071,2072,2075,2076,2079,2080,2083],{},"A customizer that needs the parent or the clock takes a second parameter. For a child input, that is the ",[183,2073,2074],{},"ChildContext",", so ",[183,2077,2078],{},"ctx.Parent"," and ",[183,2081,2082],{},"ctx.Ago(…)"," are available:",[231,2085,2088],{"className":233,"code":2086,"filename":2087,"language":236,"meta":237,"style":237},".AddOne(\n    Blueprints.Enrollment,\n    out var early,\n    (e, ctx) => e.EnrolledAtUtc = ctx.Ago(TimeSpan.FromDays(3))\n)\n","Context-aware customizer",[183,2089,2090,2099,2110,2122,2171],{"__ignoreMap":237},[241,2091,2092,2094,2096],{"class":243,"line":244},[241,2093,638],{"class":265},[241,2095,962],{"class":564},[241,2097,2098],{"class":265},"(\n",[241,2100,2101,2104,2106,2108],{"class":243,"line":262},[241,2102,2103],{"class":555},"    Blueprints",[241,2105,638],{"class":265},[241,2107,1887],{"class":555},[241,2109,678],{"class":265},[241,2111,2112,2115,2117,2120],{"class":243,"line":269},[241,2113,2114],{"class":247},"    out",[241,2116,979],{"class":254},[241,2118,2119],{"class":258}," early",[241,2121,678],{"class":265},[241,2123,2124,2127,2130,2132,2134,2136,2138,2140,2142,2145,2147,2149,2151,2154,2156,2159,2161,2164,2166,2169],{"class":243,"line":302},[241,2125,2126],{"class":265},"    (",[241,2128,2129],{"class":258},"e",[241,2131,533],{"class":265},[241,2133,606],{"class":258},[241,2135,609],{"class":265},[241,2137,588],{"class":278},[241,2139,2041],{"class":555},[241,2141,638],{"class":265},[241,2143,2144],{"class":555},"EnrolledAtUtc ",[241,2146,633],{"class":278},[241,2148,606],{"class":555},[241,2150,638],{"class":265},[241,2152,2153],{"class":564},"Ago",[241,2155,644],{"class":265},[241,2157,2158],{"class":555},"TimeSpan",[241,2160,638],{"class":265},[241,2162,2163],{"class":564},"FromDays",[241,2165,644],{"class":265},[241,2167,2168],{"class":729},"3",[241,2170,805],{"class":265},[241,2172,2173],{"class":243,"line":326},[241,2174,846],{"class":265},[2176,2177,2178],"tip",{},[179,2179,2180,2181,2183,2184,638],{},"Generated graft methods work the same way for input blueprints, except their customizers receive the input type while ",[183,2182,950],{}," holds the output. Add a handwritten context-aware overload only when tests use it repeatedly. See ",[1197,2185,95],{"href":2186},"\u002Fguides\u002Fscenario-helpers-and-sugar#context-overloads-when-a-test-needs-them",[196,2188,2190],{"id":2189},"what-an-input-is-and-is-not","What an input is, and is not",[179,2192,2193,2194,2197],{},"An input is ",[204,2195,2196],{},"construction data",". Biome does not record it, save it, or let it be a parent:",[2199,2200,2201,2227,2239],"ul",{},[2202,2203,2204,2207,2208,2210,2211,2210,2214,2210,2217,2079,2220,2223,2224,638],"li",{},[183,2205,2206],{},"All\u003CEnrollmentInput>()"," is always empty. ",[183,2209,950],{},", ",[183,2212,2213],{},".Under(…)",[183,2215,2216],{},".Transient()",[183,2218,2219],{},"All\u003CEnrollment>()",[183,2221,2222],{},"Last\u003CEnrollment>()"," all work on the ",[204,2225,2226],{},"outputs",[2202,2228,2229,2230,2232,2233,2235,2236,2238],{},"A root input blueprint stays a root after ",[183,2231,2213],{},". ",[183,2234,2005],{}," does not fill its input or supply a parent. Use ",[183,2237,1583],{}," when the row needs a parent.",[2202,2240,2241,2242,769,2245,2248,2249,2252,2253,2255],{},"Global ",[1197,2243,2244],{"href":81},"defaults",[183,2246,2247],{},"options.Default",") apply to the ",[204,2250,2251],{},"output"," row after the factory runs. ",[183,2254,750],{}," on an input blueprint applies to the input.",[196,2257,2259],{"id":2258},"order-of-work-in-one-add-step","Order of work in one Add step",[179,2261,2262],{},"A step builds all of its inputs before it builds any output, so a sequence can reserve every explicit value first:",[2264,2265,2266,2280,2290,2303],"ol",{},[2202,2267,2268,2269,769,2272,2275,2276,2279],{},"Each input is created, then its ",[204,2270,2271],{},"traits",[183,2273,2274],{},".With",") and ",[204,2277,2278],{},"call-site customizers"," run.",[2202,2281,2282,2285,2286,2289],{},[183,2283,2284],{},"Derive(property, sequence)"," ",[204,2287,2288],{},"reserves"," every explicit value in the step.",[2202,2291,2292,2293,2298,2299,2302],{},"For each input, in order: its ",[204,2294,2295,2297],{},[183,2296,750],{},"s"," fill unset input properties, then the ",[204,2300,2301],{},"factory"," builds the output.",[2202,2304,2305,2306,2308],{},"Each output gets the global ",[204,2307,2244],{},", then is recorded with its parent link.",[179,2310,2311,2312,2315,2316,2079,2319,2322,2323,2325],{},"Input factories, derives, traits and customizers see only entities from ",[204,2313,2314],{},"earlier completed steps",", through ",[183,2317,2318],{},"ctx.All\u003CT>()",[183,2320,2321],{},"ctx.Last\u003CT>()",". Wire relationships through the typed parent and ",[183,2324,1191],{},", not through inspection.",[196,2327,2329],{"id":2328},"aggregates-one-input-several-rows","Aggregates: one input, several rows",[179,2331,2332,2333,2336,2337,2340],{},"An input blueprint can also build a group of rows from one choice. When the output implements ",[183,2334,2335],{},"IBiomeAggregate",", Biome saves its ",[204,2338,2339],{},"parts"," in place of the wrapper.",[179,2342,2343],{},"Creating an organization may require an organization row, a root team, and a membership. Tests usually care about the choice that creates the group, not each row separately.",[921,2345,2346,3123],{},[231,2347,2351],{"className":233,"code":2348,"filename":926,"highlights":2349,"language":236,"meta":237,"style":237},"public sealed class OrganizationInput\n{\n    public string DisplayName { get; set; } = \"Test Organization\";\n    public string? Slug { get; set; }\n    public string Role { get; set; } = \"owner\";\n    public bool IsDefaultMembership { get; set; }\n}\n\npublic sealed record OrganizationGraph(\n    Organization Organization,\n    Team RootTeam,\n    OrganizationMembership Membership\n) : IBiomeAggregate\n{\n    public IEnumerable\u003Cobject> GetEntities() =>\n        [Organization, RootTeam, Membership]; \u002F\u002F save order\n}\n\npublic static partial class Blueprints\n{\n    public static readonly InputBlueprint\u003C\n        ZeeqSeed,\n        OrganizationInput,\n        OrganizationGraph\n    > Organization = Blueprint\n        .FromInput\u003CZeeqSeed, OrganizationInput, OrganizationGraph>(\n            () => new(),\n            (input, ctx) =>\n            {\n                var owner = ctx.Seed.Owner;\n                var org = new Organization\n                {\n                    Id = ctx.NewId(\"org\"),\n                    DisplayName = input.DisplayName,\n                    Slug = input.Slug,\n                    CreatedByUserId = owner.Id,\n                };\n                var team = new Team\n                {\n                    Id = ctx.NewId(\"team\"),\n                    OrganizationId = org.Id,\n                    IsRootTeam = true,\n                };\n                var membership = new OrganizationMembership\n                {\n                    Id = ctx.NewId(\"mem\"),\n                    OrganizationId = org.Id,\n                    UserId = owner.Id,\n                    Role = input.Role,\n                    Status = MembershipStatus.Active,\n                    IsDefault = input.IsDefaultMembership,\n                    CreatedByUserId = owner.Id,\n                };\n                return new(org, team, membership);\n            }\n        )\n        .Derive(i => i.Slug, (_, ctx) => ctx.NewId(\"org\"));\n}\n",[437,481,489,1452,2350],26,[183,2352,2353,2364,2368,2402,2425,2457,2478,2482,2486,2500,2510,2520,2528,2538,2542,2564,2588,2592,2596,2608,2612,2623,2628,2633,2638,2644,2652,2668,2683,2688,2708,2721,2727,2752,2769,2786,2803,2811,2824,2829,2853,2870,2882,2889,2902,2907,2931,2946,2962,2979,2997,3014,3029,3036,3063,3068,3074,3118],{"__ignoreMap":237},[241,2354,2355,2357,2359,2361],{"class":243,"line":244},[241,2356,248],{"class":247},[241,2358,251],{"class":247},[241,2360,255],{"class":254},[241,2362,2363],{"class":258}," OrganizationInput\n",[241,2365,2366],{"class":243,"line":262},[241,2367,266],{"class":265},[241,2369,2370,2372,2374,2377,2379,2381,2383,2385,2387,2390,2392,2394,2397,2399],{"class":243,"line":269},[241,2371,272],{"class":247},[241,2373,279],{"class":278},[241,2375,2376],{"class":258}," DisplayName",[241,2378,285],{"class":265},[241,2380,288],{"class":254},[241,2382,291],{"class":265},[241,2384,430],{"class":254},[241,2386,291],{"class":265},[241,2388,2389],{"class":265}," }",[241,2391,1032],{"class":278},[241,2393,1113],{"class":647},[241,2395,2396],{"class":651},"Test Organization",[241,2398,648],{"class":647},[241,2400,2401],{"class":265},";\n",[241,2403,2404,2406,2408,2410,2413,2415,2417,2419,2421,2423],{"class":243,"line":302},[241,2405,272],{"class":247},[241,2407,279],{"class":278},[241,2409,419],{"class":265},[241,2411,2412],{"class":258}," Slug",[241,2414,285],{"class":265},[241,2416,288],{"class":254},[241,2418,291],{"class":265},[241,2420,430],{"class":254},[241,2422,291],{"class":265},[241,2424,299],{"class":265},[241,2426,2427,2429,2431,2434,2436,2438,2440,2442,2444,2446,2448,2450,2453,2455],{"class":243,"line":326},[241,2428,272],{"class":247},[241,2430,279],{"class":278},[241,2432,2433],{"class":258}," Role",[241,2435,285],{"class":265},[241,2437,288],{"class":254},[241,2439,291],{"class":265},[241,2441,430],{"class":254},[241,2443,291],{"class":265},[241,2445,2389],{"class":265},[241,2447,1032],{"class":278},[241,2449,1113],{"class":647},[241,2451,2452],{"class":651},"owner",[241,2454,648],{"class":647},[241,2456,2401],{"class":265},[241,2458,2459,2461,2463,2466,2468,2470,2472,2474,2476],{"class":243,"line":351},[241,2460,272],{"class":247},[241,2462,1407],{"class":278},[241,2464,2465],{"class":258}," IsDefaultMembership",[241,2467,285],{"class":265},[241,2469,288],{"class":254},[241,2471,291],{"class":265},[241,2473,430],{"class":254},[241,2475,291],{"class":265},[241,2477,299],{"class":265},[241,2479,2480],{"class":243,"line":375},[241,2481,378],{"class":265},[241,2483,2484],{"class":243,"line":381},[241,2485,385],{"emptyLinePlaceholder":384},[241,2487,2488,2490,2492,2495,2498],{"class":243,"line":388},[241,2489,248],{"class":247},[241,2491,251],{"class":247},[241,2493,2494],{"class":254}," record",[241,2496,2497],{"class":258}," OrganizationGraph",[241,2499,2098],{"class":265},[241,2501,2502,2505,2508],{"class":243,"line":395},[241,2503,2504],{"class":258},"    Organization",[241,2506,2507],{"class":258}," Organization",[241,2509,678],{"class":265},[241,2511,2512,2515,2518],{"class":243,"line":407},[241,2513,2514],{"class":258},"    Team",[241,2516,2517],{"class":258}," RootTeam",[241,2519,678],{"class":265},[241,2521,2522,2525],{"class":243,"line":412},[241,2523,2524],{"class":258},"    OrganizationMembership",[241,2526,2527],{"class":258}," Membership\n",[241,2529,2531,2533,2535],{"class":2530,"line":437},[243,698],[241,2532,609],{"class":265},[241,2534,1765],{"class":265},[241,2536,2537],{"class":258}," IBiomeAggregate\n",[241,2539,2540],{"class":243,"line":458},[241,2541,266],{"class":265},[241,2543,2545,2547,2550,2552,2555,2557,2560,2562],{"class":2544,"line":481},[243,698],[241,2546,272],{"class":247},[241,2548,2549],{"class":258}," IEnumerable",[241,2551,527],{"class":265},[241,2553,2554],{"class":278},"object",[241,2556,544],{"class":265},[241,2558,2559],{"class":564}," GetEntities",[241,2561,1091],{"class":265},[241,2563,612],{"class":278},[241,2565,2567,2570,2573,2575,2577,2579,2582,2585],{"class":2566,"line":489},[243,698],[241,2568,2569],{"class":265},"        [",[241,2571,2572],{"class":555},"Organization",[241,2574,533],{"class":265},[241,2576,2517],{"class":555},[241,2578,533],{"class":265},[241,2580,2581],{"class":555}," Membership",[241,2583,2584],{"class":265},"];",[241,2586,2587],{"class":391}," \u002F\u002F save order\n",[241,2589,2590],{"class":243,"line":490},[241,2591,378],{"class":265},[241,2593,2594],{"class":243,"line":491},[241,2595,385],{"emptyLinePlaceholder":384},[241,2597,2598,2600,2602,2604,2606],{"class":243,"line":905},[241,2599,248],{"class":247},[241,2601,500],{"class":247},[241,2603,503],{"class":247},[241,2605,255],{"class":254},[241,2607,508],{"class":258},[241,2609,2610],{"class":243,"line":1741},[241,2611,266],{"class":265},[241,2613,2614,2616,2618,2620],{"class":243,"line":1777},[241,2615,272],{"class":247},[241,2617,500],{"class":247},[241,2619,521],{"class":247},[241,2621,2622],{"class":555}," InputBlueprint\u003C\n",[241,2624,2625],{"class":243,"line":1794},[241,2626,2627],{"class":555},"        ZeeqSeed,\n",[241,2629,2630],{"class":243,"line":1800},[241,2631,2632],{"class":555},"        OrganizationInput,\n",[241,2634,2635],{"class":243,"line":1451},[241,2636,2637],{"class":564},"        OrganizationGraph\n",[241,2639,2641],{"class":2640,"line":1452},[243,698],[241,2642,2643],{"class":555},"    > Organization = Blueprint\n",[241,2645,2647,2650],{"class":2646,"line":2350},[243,698],[241,2648,2649],{"class":555},"        .FromInput\u003CZeeqSeed, OrganizationInput, OrganizationGraph>",[241,2651,2098],{"class":265},[241,2653,2655,2658,2660,2662,2664,2666],{"class":243,"line":2654},27,[241,2656,2657],{"class":555},"            (",[241,2659,609],{"class":265},[241,2661,588],{"class":278},[241,2663,591],{"class":278},[241,2665,1091],{"class":265},[241,2667,678],{"class":555},[241,2669,2671,2673,2675,2677,2679,2681],{"class":243,"line":2670},28,[241,2672,2657],{"class":265},[241,2674,221],{"class":555},[241,2676,533],{"class":265},[241,2678,606],{"class":555},[241,2680,609],{"class":265},[241,2682,612],{"class":278},[241,2684,2686],{"class":243,"line":2685},29,[241,2687,1647],{"class":265},[241,2689,2691,2694,2696,2698,2700,2703,2705],{"class":243,"line":2690},30,[241,2692,2693],{"class":555},"                var owner ",[241,2695,633],{"class":278},[241,2697,606],{"class":555},[241,2699,638],{"class":265},[241,2701,2702],{"class":555},"Seed",[241,2704,638],{"class":265},[241,2706,2707],{"class":555},"Owner;\n",[241,2709,2711,2714,2716,2718],{"class":243,"line":2710},31,[241,2712,2713],{"class":555},"                var org ",[241,2715,633],{"class":278},[241,2717,591],{"class":278},[241,2719,2720],{"class":258}," Organization\n",[241,2722,2724],{"class":243,"line":2723},32,[241,2725,2726],{"class":265},"                {\n",[241,2728,2730,2733,2735,2737,2739,2741,2743,2745,2748,2750],{"class":243,"line":2729},33,[241,2731,2732],{"class":555},"                    Id ",[241,2734,633],{"class":278},[241,2736,606],{"class":555},[241,2738,638],{"class":265},[241,2740,641],{"class":564},[241,2742,644],{"class":265},[241,2744,648],{"class":647},[241,2746,2747],{"class":651},"org",[241,2749,648],{"class":647},[241,2751,657],{"class":265},[241,2753,2755,2758,2760,2762,2764,2767],{"class":243,"line":2754},34,[241,2756,2757],{"class":555},"                    DisplayName ",[241,2759,633],{"class":278},[241,2761,667],{"class":555},[241,2763,638],{"class":265},[241,2765,2766],{"class":555},"DisplayName",[241,2768,678],{"class":265},[241,2770,2772,2775,2777,2779,2781,2784],{"class":243,"line":2771},35,[241,2773,2774],{"class":555},"                    Slug ",[241,2776,633],{"class":278},[241,2778,667],{"class":555},[241,2780,638],{"class":265},[241,2782,2783],{"class":555},"Slug",[241,2785,678],{"class":265},[241,2787,2789,2792,2794,2797,2799,2801],{"class":243,"line":2788},36,[241,2790,2791],{"class":555},"                    CreatedByUserId ",[241,2793,633],{"class":278},[241,2795,2796],{"class":555}," owner",[241,2798,638],{"class":265},[241,2800,1697],{"class":555},[241,2802,678],{"class":265},[241,2804,2806,2809],{"class":243,"line":2805},37,[241,2807,2808],{"class":265},"                }",[241,2810,2401],{"class":555},[241,2812,2814,2817,2819,2821],{"class":243,"line":2813},38,[241,2815,2816],{"class":555},"                var team ",[241,2818,633],{"class":278},[241,2820,591],{"class":278},[241,2822,2823],{"class":258}," Team\n",[241,2825,2827],{"class":243,"line":2826},39,[241,2828,2726],{"class":265},[241,2830,2832,2834,2836,2838,2840,2842,2844,2846,2849,2851],{"class":243,"line":2831},40,[241,2833,2732],{"class":555},[241,2835,633],{"class":278},[241,2837,606],{"class":555},[241,2839,638],{"class":265},[241,2841,641],{"class":564},[241,2843,644],{"class":265},[241,2845,648],{"class":647},[241,2847,2848],{"class":651},"team",[241,2850,648],{"class":647},[241,2852,657],{"class":265},[241,2854,2856,2859,2861,2864,2866,2868],{"class":243,"line":2855},41,[241,2857,2858],{"class":555},"                    OrganizationId ",[241,2860,633],{"class":278},[241,2862,2863],{"class":555}," org",[241,2865,638],{"class":265},[241,2867,1697],{"class":555},[241,2869,678],{"class":265},[241,2871,2873,2876,2878,2880],{"class":243,"line":2872},42,[241,2874,2875],{"class":555},"                    IsRootTeam ",[241,2877,633],{"class":278},[241,2879,2055],{"class":2054},[241,2881,678],{"class":265},[241,2883,2885,2887],{"class":243,"line":2884},43,[241,2886,2808],{"class":265},[241,2888,2401],{"class":555},[241,2890,2892,2895,2897,2899],{"class":243,"line":2891},44,[241,2893,2894],{"class":555},"                var membership ",[241,2896,633],{"class":278},[241,2898,591],{"class":278},[241,2900,2901],{"class":258}," OrganizationMembership\n",[241,2903,2905],{"class":243,"line":2904},45,[241,2906,2726],{"class":265},[241,2908,2910,2912,2914,2916,2918,2920,2922,2924,2927,2929],{"class":243,"line":2909},46,[241,2911,2732],{"class":555},[241,2913,633],{"class":278},[241,2915,606],{"class":555},[241,2917,638],{"class":265},[241,2919,641],{"class":564},[241,2921,644],{"class":265},[241,2923,648],{"class":647},[241,2925,2926],{"class":651},"mem",[241,2928,648],{"class":647},[241,2930,657],{"class":265},[241,2932,2934,2936,2938,2940,2942,2944],{"class":243,"line":2933},47,[241,2935,2858],{"class":555},[241,2937,633],{"class":278},[241,2939,2863],{"class":555},[241,2941,638],{"class":265},[241,2943,1697],{"class":555},[241,2945,678],{"class":265},[241,2947,2949,2952,2954,2956,2958,2960],{"class":243,"line":2948},48,[241,2950,2951],{"class":555},"                    UserId ",[241,2953,633],{"class":278},[241,2955,2796],{"class":555},[241,2957,638],{"class":265},[241,2959,1697],{"class":555},[241,2961,678],{"class":265},[241,2963,2965,2968,2970,2972,2974,2977],{"class":243,"line":2964},49,[241,2966,2967],{"class":555},"                    Role ",[241,2969,633],{"class":278},[241,2971,667],{"class":555},[241,2973,638],{"class":265},[241,2975,2976],{"class":555},"Role",[241,2978,678],{"class":265},[241,2980,2982,2985,2987,2990,2992,2995],{"class":243,"line":2981},50,[241,2983,2984],{"class":555},"                    Status ",[241,2986,633],{"class":278},[241,2988,2989],{"class":555}," MembershipStatus",[241,2991,638],{"class":265},[241,2993,2994],{"class":555},"Active",[241,2996,678],{"class":265},[241,2998,3000,3003,3005,3007,3009,3012],{"class":243,"line":2999},51,[241,3001,3002],{"class":555},"                    IsDefault ",[241,3004,633],{"class":278},[241,3006,667],{"class":555},[241,3008,638],{"class":265},[241,3010,3011],{"class":555},"IsDefaultMembership",[241,3013,678],{"class":265},[241,3015,3017,3019,3021,3023,3025,3027],{"class":243,"line":3016},52,[241,3018,2791],{"class":555},[241,3020,633],{"class":278},[241,3022,2796],{"class":555},[241,3024,638],{"class":265},[241,3026,1697],{"class":555},[241,3028,678],{"class":265},[241,3030,3032,3034],{"class":243,"line":3031},53,[241,3033,2808],{"class":265},[241,3035,2401],{"class":555},[241,3037,3039,3042,3045,3047,3049,3051,3054,3056,3059,3061],{"class":243,"line":3038},54,[241,3040,3041],{"class":555},"                return ",[241,3043,3044],{"class":278},"new",[241,3046,644],{"class":265},[241,3048,2747],{"class":555},[241,3050,533],{"class":265},[241,3052,3053],{"class":555}," team",[241,3055,533],{"class":265},[241,3057,3058],{"class":555}," membership",[241,3060,609],{"class":265},[241,3062,2401],{"class":555},[241,3064,3066],{"class":243,"line":3065},55,[241,3067,1797],{"class":265},[241,3069,3071],{"class":243,"line":3070},56,[241,3072,3073],{"class":555},"        )\n",[241,3075,3077,3080,3082,3085,3087,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3110,3112,3114,3116],{"class":243,"line":3076},57,[241,3078,3079],{"class":555},"        .Derive",[241,3081,644],{"class":265},[241,3083,3084],{"class":555},"i => i.Slug",[241,3086,533],{"class":265},[241,3088,3089],{"class":555}," (_",[241,3091,533],{"class":265},[241,3093,606],{"class":555},[241,3095,609],{"class":265},[241,3097,588],{"class":278},[241,3099,606],{"class":555},[241,3101,638],{"class":265},[241,3103,641],{"class":564},[241,3105,644],{"class":265},[241,3107,648],{"class":647},[241,3109,2747],{"class":651},[241,3111,648],{"class":647},[241,3113,609],{"class":265},[241,3115,609],{"class":555},[241,3117,2401],{"class":265},[241,3119,3121],{"class":243,"line":3120},58,[241,3122,378],{"class":265},[1013,3124,3125],{"label":1015,"name":1016},[231,3126,3128],{"className":233,"code":3127,"language":236,"meta":237,"style":237},"\u002F\u002F Every test that needs an organization repeats the rows and their relationships.\nvar org = new Organization\n{\n    Id = $\"org_{Guid.CreateVersion7():N}\",\n    DisplayName = \"Beta\",\n    Slug = \"beta\",\n    CreatedByUserId = seed.Owner.Id,\n};\nvar team = new Team\n{\n    Id = $\"team_{Guid.CreateVersion7():N}\",\n    OrganizationId = org.Id,\n    IsRootTeam = true,\n};\nvar membership = new OrganizationMembership\n{\n    Id = $\"mem_{Guid.CreateVersion7():N}\",\n    OrganizationId = org.Id,\n    UserId = seed.Owner.Id,\n    Role = \"owner\",\n    Status = MembershipStatus.Active,\n    IsDefault = true,\n    CreatedByUserId = seed.Owner.Id,\n};\n_db.AddRange(seed.Owner, seed.Organization, org, team, membership); \u002F\u002F order matters\nawait _db.SaveChangesAsync();\n",[183,3129,3130,3135,3147,3151,3182,3198,3214,3235,3239,3251,3255,3286,3301,3312,3316,3328,3332,3363,3377,3396,3411,3426,3437,3455,3459,3504],{"__ignoreMap":237},[241,3131,3132],{"class":243,"line":244},[241,3133,3134],{"class":391},"\u002F\u002F Every test that needs an organization repeats the rows and their relationships.\n",[241,3136,3137,3139,3141,3143,3145],{"class":243,"line":262},[241,3138,1026],{"class":254},[241,3140,2863],{"class":258},[241,3142,1032],{"class":278},[241,3144,591],{"class":278},[241,3146,2720],{"class":258},[241,3148,3149],{"class":243,"line":269},[241,3150,266],{"class":265},[241,3152,3153,3155,3157,3159,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180],{"class":243,"line":302},[241,3154,1071],{"class":555},[241,3156,633],{"class":278},[241,3158,882],{"class":647},[241,3160,3161],{"class":651},"org_",[241,3163,885],{"class":647},[241,3165,1083],{"class":555},[241,3167,638],{"class":647},[241,3169,1088],{"class":564},[241,3171,1091],{"class":647},[241,3173,1094],{"class":278},[241,3175,1097],{"class":555},[241,3177,894],{"class":647},[241,3179,648],{"class":647},[241,3181,678],{"class":265},[241,3183,3184,3187,3189,3191,3194,3196],{"class":243,"line":326},[241,3185,3186],{"class":555},"    DisplayName ",[241,3188,633],{"class":278},[241,3190,1113],{"class":647},[241,3192,3193],{"class":651},"Beta",[241,3195,648],{"class":647},[241,3197,678],{"class":265},[241,3199,3200,3203,3205,3207,3210,3212],{"class":243,"line":351},[241,3201,3202],{"class":555},"    Slug ",[241,3204,633],{"class":278},[241,3206,1113],{"class":647},[241,3208,3209],{"class":651},"beta",[241,3211,648],{"class":647},[241,3213,678],{"class":265},[241,3215,3216,3219,3221,3224,3226,3229,3231,3233],{"class":243,"line":375},[241,3217,3218],{"class":555},"    CreatedByUserId ",[241,3220,633],{"class":278},[241,3222,3223],{"class":555}," seed",[241,3225,638],{"class":265},[241,3227,3228],{"class":555},"Owner",[241,3230,638],{"class":265},[241,3232,1697],{"class":555},[241,3234,678],{"class":265},[241,3236,3237],{"class":243,"line":381},[241,3238,1161],{"class":265},[241,3240,3241,3243,3245,3247,3249],{"class":243,"line":388},[241,3242,1026],{"class":254},[241,3244,3053],{"class":258},[241,3246,1032],{"class":278},[241,3248,591],{"class":278},[241,3250,2823],{"class":258},[241,3252,3253],{"class":243,"line":395},[241,3254,266],{"class":265},[241,3256,3257,3259,3261,3263,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284],{"class":243,"line":407},[241,3258,1071],{"class":555},[241,3260,633],{"class":278},[241,3262,882],{"class":647},[241,3264,3265],{"class":651},"team_",[241,3267,885],{"class":647},[241,3269,1083],{"class":555},[241,3271,638],{"class":647},[241,3273,1088],{"class":564},[241,3275,1091],{"class":647},[241,3277,1094],{"class":278},[241,3279,1097],{"class":555},[241,3281,894],{"class":647},[241,3283,648],{"class":647},[241,3285,678],{"class":265},[241,3287,3288,3291,3293,3295,3297,3299],{"class":243,"line":412},[241,3289,3290],{"class":555},"    OrganizationId ",[241,3292,633],{"class":278},[241,3294,2863],{"class":555},[241,3296,638],{"class":265},[241,3298,1697],{"class":555},[241,3300,678],{"class":265},[241,3302,3303,3306,3308,3310],{"class":243,"line":437},[241,3304,3305],{"class":555},"    IsRootTeam ",[241,3307,633],{"class":278},[241,3309,2055],{"class":2054},[241,3311,678],{"class":265},[241,3313,3314],{"class":243,"line":458},[241,3315,1161],{"class":265},[241,3317,3318,3320,3322,3324,3326],{"class":243,"line":481},[241,3319,1026],{"class":254},[241,3321,3058],{"class":258},[241,3323,1032],{"class":278},[241,3325,591],{"class":278},[241,3327,2901],{"class":258},[241,3329,3330],{"class":243,"line":489},[241,3331,266],{"class":265},[241,3333,3334,3336,3338,3340,3343,3345,3347,3349,3351,3353,3355,3357,3359,3361],{"class":243,"line":490},[241,3335,1071],{"class":555},[241,3337,633],{"class":278},[241,3339,882],{"class":647},[241,3341,3342],{"class":651},"mem_",[241,3344,885],{"class":647},[241,3346,1083],{"class":555},[241,3348,638],{"class":647},[241,3350,1088],{"class":564},[241,3352,1091],{"class":647},[241,3354,1094],{"class":278},[241,3356,1097],{"class":555},[241,3358,894],{"class":647},[241,3360,648],{"class":647},[241,3362,678],{"class":265},[241,3364,3365,3367,3369,3371,3373,3375],{"class":243,"line":491},[241,3366,3290],{"class":555},[241,3368,633],{"class":278},[241,3370,2863],{"class":555},[241,3372,638],{"class":265},[241,3374,1697],{"class":555},[241,3376,678],{"class":265},[241,3378,3379,3382,3384,3386,3388,3390,3392,3394],{"class":243,"line":905},[241,3380,3381],{"class":555},"    UserId ",[241,3383,633],{"class":278},[241,3385,3223],{"class":555},[241,3387,638],{"class":265},[241,3389,3228],{"class":555},[241,3391,638],{"class":265},[241,3393,1697],{"class":555},[241,3395,678],{"class":265},[241,3397,3398,3401,3403,3405,3407,3409],{"class":243,"line":1741},[241,3399,3400],{"class":555},"    Role ",[241,3402,633],{"class":278},[241,3404,1113],{"class":647},[241,3406,2452],{"class":651},[241,3408,648],{"class":647},[241,3410,678],{"class":265},[241,3412,3413,3416,3418,3420,3422,3424],{"class":243,"line":1777},[241,3414,3415],{"class":555},"    Status ",[241,3417,633],{"class":278},[241,3419,2989],{"class":555},[241,3421,638],{"class":265},[241,3423,2994],{"class":555},[241,3425,678],{"class":265},[241,3427,3428,3431,3433,3435],{"class":243,"line":1794},[241,3429,3430],{"class":555},"    IsDefault ",[241,3432,633],{"class":278},[241,3434,2055],{"class":2054},[241,3436,678],{"class":265},[241,3438,3439,3441,3443,3445,3447,3449,3451,3453],{"class":243,"line":1800},[241,3440,3218],{"class":555},[241,3442,633],{"class":278},[241,3444,3223],{"class":555},[241,3446,638],{"class":265},[241,3448,3228],{"class":555},[241,3450,638],{"class":265},[241,3452,1697],{"class":555},[241,3454,678],{"class":265},[241,3456,3457],{"class":243,"line":1451},[241,3458,1161],{"class":265},[241,3460,3461,3464,3466,3469,3471,3474,3476,3478,3480,3482,3484,3486,3488,3490,3492,3494,3496,3498,3501],{"class":243,"line":1452},[241,3462,3463],{"class":555},"_db",[241,3465,638],{"class":265},[241,3467,3468],{"class":564},"AddRange",[241,3470,644],{"class":265},[241,3472,3473],{"class":555},"seed",[241,3475,638],{"class":265},[241,3477,3228],{"class":555},[241,3479,533],{"class":265},[241,3481,3223],{"class":555},[241,3483,638],{"class":265},[241,3485,2572],{"class":555},[241,3487,533],{"class":265},[241,3489,2863],{"class":555},[241,3491,533],{"class":265},[241,3493,3053],{"class":555},[241,3495,533],{"class":265},[241,3497,3058],{"class":555},[241,3499,3500],{"class":265},");",[241,3502,3503],{"class":391}," \u002F\u002F order matters\n",[241,3505,3506,3508,3511,3513,3516],{"class":243,"line":2350},[241,3507,934],{"class":278},[241,3509,3510],{"class":555}," _db",[241,3512,638],{"class":265},[241,3514,3515],{"class":564},"SaveChangesAsync",[241,3517,1011],{"class":265},[231,3519,3523],{"className":233,"code":3520,"filename":3521,"highlights":3522,"language":236,"meta":237,"style":237},"await TestBiome\n    .Start(_db, out _)\n    .Add(\n        Blueprints.Organization,\n        out var orgs,\n        o => o.IsDefaultMembership = true,\n        o => o.Slug = \"beta\"\n    )\n    \u002F\u002F saves org, root team, membership for each, in GetEntities() order\n    .BuildAsync();\n","OrganizationTests.cs",[351,375,381],[183,3524,3525,3531,3549,3557,3568,3580,3602,3625,3630,3635],{"__ignoreMap":237},[241,3526,3527,3529],{"class":243,"line":244},[241,3528,934],{"class":278},[241,3530,937],{"class":555},[241,3532,3533,3535,3537,3539,3541,3543,3545,3547],{"class":243,"line":262},[241,3534,942],{"class":265},[241,3536,945],{"class":564},[241,3538,644],{"class":265},[241,3540,3463],{"class":555},[241,3542,533],{"class":265},[241,3544,976],{"class":247},[241,3546,836],{"class":555},[241,3548,846],{"class":265},[241,3550,3551,3553,3555],{"class":243,"line":269},[241,3552,942],{"class":265},[241,3554,1971],{"class":564},[241,3556,2098],{"class":265},[241,3558,3559,3562,3564,3566],{"class":243,"line":302},[241,3560,3561],{"class":555},"        Blueprints",[241,3563,638],{"class":265},[241,3565,2572],{"class":555},[241,3567,678],{"class":265},[241,3569,3570,3573,3575,3578],{"class":243,"line":326},[241,3571,3572],{"class":247},"        out",[241,3574,979],{"class":254},[241,3576,3577],{"class":258}," orgs",[241,3579,678],{"class":265},[241,3581,3583,3586,3588,3591,3593,3596,3598,3600],{"class":3582,"line":351},[243,698],[241,3584,3585],{"class":258},"        o",[241,3587,588],{"class":278},[241,3589,3590],{"class":555}," o",[241,3592,638],{"class":265},[241,3594,3595],{"class":555},"IsDefaultMembership ",[241,3597,633],{"class":278},[241,3599,2055],{"class":2054},[241,3601,678],{"class":265},[241,3603,3605,3607,3609,3611,3613,3616,3618,3620,3622],{"class":3604,"line":375},[243,698],[241,3606,3585],{"class":258},[241,3608,588],{"class":278},[241,3610,3590],{"class":555},[241,3612,638],{"class":265},[241,3614,3615],{"class":555},"Slug ",[241,3617,633],{"class":278},[241,3619,1113],{"class":647},[241,3621,3209],{"class":651},[241,3623,3624],{"class":647},"\"\n",[241,3626,3628],{"class":3627,"line":381},[243,698],[241,3629,1803],{"class":265},[241,3631,3632],{"class":243,"line":388},[241,3633,3634],{"class":391},"    \u002F\u002F saves org, root team, membership for each, in GetEntities() order\n",[241,3636,3637,3639,3641],{"class":243,"line":395},[241,3638,942],{"class":265},[241,3640,1008],{"class":564},[241,3642,1011],{"class":265},[179,3644,3645,3646,3648,3649,3652,3653,3656,3657,3659],{},"At ",[183,3647,1008],{},", aggregates are expanded ",[204,3650,3651],{},"recursively"," into their parts. Duplicate references are saved once, and a cycle in ",[183,3654,3655],{},"GetEntities()"," throws. The library's ",[183,3658,117],{}," tests show the effect: the owner (seed row) precedes the organization and membership parts.",[176,3661,3662],{},[179,3663,3664,2079,3667,3670,3671,3674,3675,3678],{},[183,3665,3666],{},"All\u003CT>()",[183,3668,3669],{},"Last\u003CT>()"," include ",[204,3672,3673],{},"aggregate wrappers and transient entities",", but not seed rows. The store never receives the wrapper itself. Parts are not tracked as parents, so a child of an aggregate takes the wrapper type as its ",[183,3676,3677],{},"TParent",". Global defaults reach the wrapper, not its parts.",[196,3680,3682],{"id":3681},"variants-and-transients","Variants and transients",[179,3684,3685,3686,2210,3688,2079,3691,3694],{},"Input blueprints, root and child, support ",[183,3687,2274],{},[183,3689,3690],{},".Derive",[183,3692,3693],{},".AsTransient()"," like entity blueprints. A transient aggregate excludes all of its parts from the save.",[231,3696,3700],{"className":233,"code":3697,"filename":3698,"highlights":3699,"language":236,"meta":237,"style":237},"var variant = Blueprints\n    .Organization.With(i => i.Slug = \"trait\")\n    .With((i, ctx) => i.IsDefaultMembership = ctx.Seed.Owner.Id == \"owner\")\n    .Derive(i => i.Slug, (_, _) => \"fallback\")\n    .AsTransient(); \u002F\u002F none of the aggregate's parts are saved\n","MembershipTests.cs",[326],[183,3701,3702,3713,3747,3800,3841],{"__ignoreMap":237},[241,3703,3704,3706,3709,3711],{"class":243,"line":244},[241,3705,1026],{"class":254},[241,3707,3708],{"class":258}," variant",[241,3710,1032],{"class":278},[241,3712,508],{"class":555},[241,3714,3715,3717,3719,3721,3724,3726,3728,3730,3732,3734,3736,3738,3740,3743,3745],{"class":243,"line":262},[241,3716,942],{"class":265},[241,3718,2572],{"class":555},[241,3720,638],{"class":265},[241,3722,3723],{"class":564},"With",[241,3725,644],{"class":265},[241,3727,1815],{"class":258},[241,3729,588],{"class":278},[241,3731,1820],{"class":555},[241,3733,638],{"class":265},[241,3735,3615],{"class":555},[241,3737,633],{"class":278},[241,3739,1113],{"class":647},[241,3741,3742],{"class":651},"trait",[241,3744,648],{"class":647},[241,3746,846],{"class":265},[241,3748,3749,3751,3753,3756,3758,3760,3762,3764,3766,3768,3770,3772,3774,3776,3778,3780,3782,3784,3786,3789,3792,3794,3796,3798],{"class":243,"line":269},[241,3750,942],{"class":265},[241,3752,3723],{"class":564},[241,3754,3755],{"class":265},"((",[241,3757,1815],{"class":258},[241,3759,533],{"class":265},[241,3761,606],{"class":258},[241,3763,609],{"class":265},[241,3765,588],{"class":278},[241,3767,1820],{"class":555},[241,3769,638],{"class":265},[241,3771,3595],{"class":555},[241,3773,633],{"class":278},[241,3775,606],{"class":555},[241,3777,638],{"class":265},[241,3779,2702],{"class":555},[241,3781,638],{"class":265},[241,3783,3228],{"class":555},[241,3785,638],{"class":265},[241,3787,3788],{"class":555},"Id ",[241,3790,3791],{"class":278},"==",[241,3793,1113],{"class":647},[241,3795,2452],{"class":651},[241,3797,648],{"class":647},[241,3799,846],{"class":265},[241,3801,3802,3804,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3837,3839],{"class":243,"line":302},[241,3803,942],{"class":265},[241,3805,750],{"class":564},[241,3807,644],{"class":265},[241,3809,1815],{"class":258},[241,3811,588],{"class":278},[241,3813,1820],{"class":555},[241,3815,638],{"class":265},[241,3817,2783],{"class":555},[241,3819,533],{"class":265},[241,3821,769],{"class":265},[241,3823,772],{"class":258},[241,3825,533],{"class":265},[241,3827,836],{"class":258},[241,3829,609],{"class":265},[241,3831,588],{"class":278},[241,3833,1113],{"class":647},[241,3835,3836],{"class":651},"fallback",[241,3838,648],{"class":647},[241,3840,846],{"class":265},[241,3842,3844,3846,3849,3851],{"class":3843,"line":326},[243,698],[241,3845,942],{"class":265},[241,3847,3848],{"class":564},"AsTransient",[241,3850,1523],{"class":265},[241,3852,3853],{"class":391}," \u002F\u002F none of the aggregate's parts are saved\n",[196,3855,3857],{"id":3856},"limits-to-keep-in-mind","Limits to keep in mind",[3859,3860,3861],"caution",{},[179,3862,3863,3865,3866,3869,3870,3872,3873,3876,3877,3872,3880,3883,3884,3872,3887,3876,3890,3872,3892,3894,3895,3898,3899,3901,3902,3904,3905,3907,3908,2210,3910,3872,3912,3914],{},[183,3864,750],{}," treats an input property's ",[204,3867,3868],{},"default value"," as unset. On a plain ",[183,3871,1471],{}," or ",[183,3874,3875],{},"bool",", an explicit ",[183,3878,3879],{},"0",[183,3881,3882],{},"false"," looks \"not chosen\", so a derive will fill it. On a nullable value type such as ",[183,3885,3886],{},"int?",[183,3888,3889],{},"bool?",[183,3891,3879],{},[183,3893,3882],{}," is kept, but an explicit ",[183,3896,3897],{},"null"," is still treated as unset and refilled if a ",[183,3900,750],{}," targets that property. Global ",[1197,3903,2244],{"href":81}," on the ",[204,3906,2251],{}," can also replace ",[183,3909,3897],{},[183,3911,3879],{},[183,3913,3882],{},", because they fill by the same rule.",[2199,3916,3917,3920,3923],{},[2202,3918,3919],{},"Biome does not copy values from an input to the output. The factory decides how each input property becomes part of the row.",[2202,3921,3922],{},"An input blueprint is more setup than a plain blueprint. Use one when the row has init-only properties that tests vary, when one choice drives several values, or when the output is a group of rows. For a single settable entity, customizing it directly is simpler.",[2202,3924,3925,3926,3930],{},"The ",[1197,3927,3929],{"href":3928},"\u002Fguides\u002Fcustomizing#the-one-rule","default pipeline"," still applies to outputs: defaults are fill-only and run after the factory.",[3932,3933,3934],"style",{},"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 .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--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 .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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":237,"searchDepth":244,"depth":262,"links":3936},[3937,3938,3939,3940,3941,3942,3943],{"id":198,"depth":262,"text":199},{"id":1173,"depth":262,"text":1174},{"id":2189,"depth":262,"text":2190},{"id":2258,"depth":262,"text":2259},{"id":2328,"depth":262,"text":2329},{"id":3681,"depth":262,"text":3682},{"id":3856,"depth":262,"text":3857},"Customize a small input object, then build the row from it. For init-only properties, derived values, typed children, and groups of rows.","md",null,{},{"icon":74},{"title":76,"description":3944},"nqyKFmIPRmpV3k9a-uYg2GtIxA0O0z6BAZrPdhF2VdI",[3952,3954],{"title":71,"path":72,"stem":73,"description":3953,"icon":74,"children":-1},"One input, several rows. Aggregates are built with input blueprints, so the full guide lives there.",{"title":80,"path":81,"stem":82,"description":3955,"icon":83,"children":-1},"Fill unset properties on every matching entity, and see or change the final row list before it is saved.",1791831052382]