[{"data":1,"prerenderedAt":2907},["ShallowReactive",2],{"navigation":3,"\u002Fexamples\u002Flearning":170,"\u002Fexamples\u002Flearning-surround":2902},[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":141,"body":172,"description":2895,"extension":2896,"links":2897,"meta":2898,"navigation":2899,"path":142,"seo":2900,"stem":143,"__hash__":2901},"docs\u002F3.examples\u002F8.learning.md",{"type":173,"value":174,"toc":2888},"minimark",[175,179,220,229,967,971,978,2203,2225,2258,2262,2442,2446,2453,2870,2884],[176,177,178],"p",{},"A late-submission test needs setup and policy to agree about time. This example shares a fake clock between them and explores why a nullable grade of zero must survive a derived default.",[176,180,181,185,186,185,189,185,192,185,195,185,198,201,202,209,210,219],{},[182,183,184],"code",{},"School"," → ",[182,187,188],{},"Course",[182,190,191],{},"Section",[182,193,194],{},"Enrollment",[182,196,197],{},"Assignment",[182,199,200],{},"Submission",". Rosters run across a course's sections, assignments restart per enrollment, and a late policy reads the ",[203,204,205,206],"strong",{},"same ",[182,207,208],{},"FakeTimeProvider"," as the setup. Source: ",[211,212,216],"a",{"href":213,"rel":214},"https:\u002F\u002Fgithub.com\u002Fzeeq-ai\u002Fzeeq-biome\u002Ftree\u002Fmain\u002Ftests\u002FZeeq.Biome.Tests\u002FLearning",[215],"nofollow",[182,217,218],{},"tests\u002FZeeq.Biome.Tests\u002FLearning",".",[221,222,224,225,228],"h2",{"id":223},"blueprints-scopes-time-and-a-derived-late-flag","Blueprints: scopes, time, and a derived ",[182,226,227],{},"Late"," flag",[230,231,245],"pre",{"className":232,"code":233,"filename":234,"highlights":235,"language":243,"meta":244,"style":244},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F Enrollment parents are sections; Per\u003CCourse>\n\u002F\u002F continues the roster across those sections.\ninternal static readonly Sequence\u003Cint> RosterNumbers = Sequence\n    .Of(1, n => n + 1)\n    .Per\u003CCourse>();\n\n\u002F\u002F Open in the past, due in the future; use ctx time for setup instead of UtcNow.\ninternal static readonly ChildBlueprint\u003C\n    LearningSeed,\n    Enrollment,\n    Assignment\n> Assignment = Blueprint\n    .ChildOf\u003CLearningSeed, Enrollment, Assignment>(\n        (enrollment, ctx) =>\n            new()\n            {\n                Enrollment = enrollment,\n                School = ctx.Ancestor\u003CSchool>(),\n                OpensAt = ctx.Ago(TimeSpan.FromDays(1)),\n                DueAt = ctx.FromNow(TimeSpan.FromDays(1)),\n            }\n    )\n    .Derive(a => a.Number, AssignmentNumbers)\n    .Derive(a => a.Title, (a, _) => $\"Assignment {a.Number}\");\n\n\u002F\u002F Time precedes the Late derive; grade remains\n\u002F\u002F fill-only so a call-site grade survives.\ninternal static readonly ChildBlueprint\u003C\n    LearningSeed,\n    Assignment,\n    Submission\n> Submission = Blueprint\n    .ChildOf\u003CLearningSeed, Assignment, Submission>(\n        (assignment, ctx) =>\n            new()\n            {\n                Assignment = assignment,\n                School = ctx.Ancestor\u003CSchool>(),\n                SubmittedAt = ctx.Now,\n            }\n    )\n    .Derive(s => s.Attempt, Attempts)\n    .Derive(s => s.Grade, (_, _) => 80m)\n    .Derive(s => s.Late, (s, _) => s.SubmittedAt > s.Assignment.DueAt);\n","Learning\u002FDomain.cs",[236,237,238,239,240,241,242],3,4,5,19,20,43,44,"csharp","",[182,246,247,256,262,301,339,354,361,367,382,388,394,400,414,440,460,469,475,489,511,543,572,578,584,613,675,680,686,692,705,710,716,722,734,756,772,779,784,797,816,833,838,843,872,912],{"__ignoreMap":244},[248,249,252],"span",{"class":250,"line":251},"line",1,[248,253,255],{"class":254},"sutJx","\u002F\u002F Enrollment parents are sections; Per\u003CCourse>\n",[248,257,259],{"class":250,"line":258},2,[248,260,261],{"class":254},"\u002F\u002F continues the roster across those sections.\n",[248,263,266,270,273,276,280,284,288,291,294,297],{"class":264,"line":236},[250,265],"highlight",[248,267,269],{"class":268},"sbsja","internal",[248,271,272],{"class":268}," static",[248,274,275],{"class":268}," readonly",[248,277,279],{"class":278},"sbgvK"," Sequence",[248,281,283],{"class":282},"sP7_E","\u003C",[248,285,287],{"class":286},"smGrS","int",[248,289,290],{"class":282},">",[248,292,293],{"class":278}," RosterNumbers",[248,295,296],{"class":286}," =",[248,298,300],{"class":299},"su5hD"," Sequence\n",[248,302,304,307,311,314,318,321,324,327,330,333,336],{"class":303,"line":237},[250,265],[248,305,306],{"class":282},"    .",[248,308,310],{"class":309},"sGLFI","Of",[248,312,313],{"class":282},"(",[248,315,317],{"class":316},"srdBf","1",[248,319,320],{"class":282},",",[248,322,323],{"class":278}," n",[248,325,326],{"class":286}," =>",[248,328,329],{"class":299}," n ",[248,331,332],{"class":286},"+",[248,334,335],{"class":316}," 1",[248,337,338],{"class":282},")\n",[248,340,342,344,347,349,351],{"class":341,"line":238},[250,265],[248,343,306],{"class":282},[248,345,346],{"class":309},"Per",[248,348,283],{"class":282},[248,350,188],{"class":278},[248,352,353],{"class":282},">();\n",[248,355,357],{"class":250,"line":356},6,[248,358,360],{"emptyLinePlaceholder":359},true,"\n",[248,362,364],{"class":250,"line":363},7,[248,365,366],{"class":254},"\u002F\u002F Open in the past, due in the future; use ctx time for setup instead of UtcNow.\n",[248,368,370,372,374,376,379],{"class":250,"line":369},8,[248,371,269],{"class":268},[248,373,272],{"class":268},[248,375,275],{"class":268},[248,377,378],{"class":299}," ChildBlueprint",[248,380,381],{"class":286},"\u003C\n",[248,383,385],{"class":250,"line":384},9,[248,386,387],{"class":299},"    LearningSeed,\n",[248,389,391],{"class":250,"line":390},10,[248,392,393],{"class":299},"    Enrollment,\n",[248,395,397],{"class":250,"line":396},11,[248,398,399],{"class":299},"    Assignment\n",[248,401,403,405,408,411],{"class":250,"line":402},12,[248,404,290],{"class":286},[248,406,407],{"class":299}," Assignment ",[248,409,410],{"class":286},"=",[248,412,413],{"class":299}," Blueprint\n",[248,415,417,419,422,424,427,429,432,434,437],{"class":250,"line":416},13,[248,418,306],{"class":282},[248,420,421],{"class":309},"ChildOf",[248,423,283],{"class":282},[248,425,426],{"class":278},"LearningSeed",[248,428,320],{"class":282},[248,430,431],{"class":278}," Enrollment",[248,433,320],{"class":282},[248,435,436],{"class":278}," Assignment",[248,438,439],{"class":282},">(\n",[248,441,443,446,449,451,454,457],{"class":250,"line":442},14,[248,444,445],{"class":282},"        (",[248,447,448],{"class":278},"enrollment",[248,450,320],{"class":282},[248,452,453],{"class":278}," ctx",[248,455,456],{"class":282},")",[248,458,459],{"class":286}," =>\n",[248,461,463,466],{"class":250,"line":462},15,[248,464,465],{"class":286},"            new",[248,467,468],{"class":282},"()\n",[248,470,472],{"class":250,"line":471},16,[248,473,474],{"class":282},"            {\n",[248,476,478,481,483,486],{"class":250,"line":477},17,[248,479,480],{"class":299},"                Enrollment ",[248,482,410],{"class":286},[248,484,485],{"class":299}," enrollment",[248,487,488],{"class":282},",\n",[248,490,492,495,497,499,501,504,506,508],{"class":250,"line":491},18,[248,493,494],{"class":299},"                School ",[248,496,410],{"class":286},[248,498,453],{"class":299},[248,500,219],{"class":282},[248,502,503],{"class":309},"Ancestor",[248,505,283],{"class":282},[248,507,184],{"class":278},[248,509,510],{"class":282},">(),\n",[248,512,514,517,519,521,523,526,528,531,533,536,538,540],{"class":513,"line":239},[250,265],[248,515,516],{"class":299},"                OpensAt ",[248,518,410],{"class":286},[248,520,453],{"class":299},[248,522,219],{"class":282},[248,524,525],{"class":309},"Ago",[248,527,313],{"class":282},[248,529,530],{"class":299},"TimeSpan",[248,532,219],{"class":282},[248,534,535],{"class":309},"FromDays",[248,537,313],{"class":282},[248,539,317],{"class":316},[248,541,542],{"class":282},")),\n",[248,544,546,549,551,553,555,558,560,562,564,566,568,570],{"class":545,"line":240},[250,265],[248,547,548],{"class":299},"                DueAt ",[248,550,410],{"class":286},[248,552,453],{"class":299},[248,554,219],{"class":282},[248,556,557],{"class":309},"FromNow",[248,559,313],{"class":282},[248,561,530],{"class":299},[248,563,219],{"class":282},[248,565,535],{"class":309},[248,567,313],{"class":282},[248,569,317],{"class":316},[248,571,542],{"class":282},[248,573,575],{"class":250,"line":574},21,[248,576,577],{"class":282},"            }\n",[248,579,581],{"class":250,"line":580},22,[248,582,583],{"class":282},"    )\n",[248,585,587,589,592,594,596,598,601,603,606,608,611],{"class":250,"line":586},23,[248,588,306],{"class":282},[248,590,591],{"class":309},"Derive",[248,593,313],{"class":282},[248,595,211],{"class":278},[248,597,326],{"class":286},[248,599,600],{"class":299}," a",[248,602,219],{"class":282},[248,604,605],{"class":299},"Number",[248,607,320],{"class":282},[248,609,610],{"class":299}," AssignmentNumbers",[248,612,338],{"class":282},[248,614,616,618,620,622,624,626,628,630,633,635,638,640,642,645,647,649,653,657,660,662,664,666,669,672],{"class":250,"line":615},24,[248,617,306],{"class":282},[248,619,591],{"class":309},[248,621,313],{"class":282},[248,623,211],{"class":278},[248,625,326],{"class":286},[248,627,600],{"class":299},[248,629,219],{"class":282},[248,631,632],{"class":299},"Title",[248,634,320],{"class":282},[248,636,637],{"class":282}," (",[248,639,211],{"class":278},[248,641,320],{"class":282},[248,643,644],{"class":278}," _",[248,646,456],{"class":282},[248,648,326],{"class":286},[248,650,652],{"class":651},"sjJ54"," $\"",[248,654,656],{"class":655},"s_sjI","Assignment ",[248,658,659],{"class":651},"{",[248,661,211],{"class":299},[248,663,219],{"class":651},[248,665,605],{"class":299},[248,667,668],{"class":651},"}",[248,670,671],{"class":651},"\"",[248,673,674],{"class":282},");\n",[248,676,678],{"class":250,"line":677},25,[248,679,360],{"emptyLinePlaceholder":359},[248,681,683],{"class":250,"line":682},26,[248,684,685],{"class":254},"\u002F\u002F Time precedes the Late derive; grade remains\n",[248,687,689],{"class":250,"line":688},27,[248,690,691],{"class":254},"\u002F\u002F fill-only so a call-site grade survives.\n",[248,693,695,697,699,701,703],{"class":250,"line":694},28,[248,696,269],{"class":268},[248,698,272],{"class":268},[248,700,275],{"class":268},[248,702,378],{"class":299},[248,704,381],{"class":286},[248,706,708],{"class":250,"line":707},29,[248,709,387],{"class":299},[248,711,713],{"class":250,"line":712},30,[248,714,715],{"class":299},"    Assignment,\n",[248,717,719],{"class":250,"line":718},31,[248,720,721],{"class":299},"    Submission\n",[248,723,725,727,730,732],{"class":250,"line":724},32,[248,726,290],{"class":286},[248,728,729],{"class":299}," Submission ",[248,731,410],{"class":286},[248,733,413],{"class":299},[248,735,737,739,741,743,745,747,749,751,754],{"class":250,"line":736},33,[248,738,306],{"class":282},[248,740,421],{"class":309},[248,742,283],{"class":282},[248,744,426],{"class":278},[248,746,320],{"class":282},[248,748,436],{"class":278},[248,750,320],{"class":282},[248,752,753],{"class":278}," Submission",[248,755,439],{"class":282},[248,757,759,761,764,766,768,770],{"class":250,"line":758},34,[248,760,445],{"class":282},[248,762,763],{"class":278},"assignment",[248,765,320],{"class":282},[248,767,453],{"class":278},[248,769,456],{"class":282},[248,771,459],{"class":286},[248,773,775,777],{"class":250,"line":774},35,[248,776,465],{"class":286},[248,778,468],{"class":282},[248,780,782],{"class":250,"line":781},36,[248,783,474],{"class":282},[248,785,787,790,792,795],{"class":250,"line":786},37,[248,788,789],{"class":299},"                Assignment ",[248,791,410],{"class":286},[248,793,794],{"class":299}," assignment",[248,796,488],{"class":282},[248,798,800,802,804,806,808,810,812,814],{"class":250,"line":799},38,[248,801,494],{"class":299},[248,803,410],{"class":286},[248,805,453],{"class":299},[248,807,219],{"class":282},[248,809,503],{"class":309},[248,811,283],{"class":282},[248,813,184],{"class":278},[248,815,510],{"class":282},[248,817,819,822,824,826,828,831],{"class":250,"line":818},39,[248,820,821],{"class":299},"                SubmittedAt ",[248,823,410],{"class":286},[248,825,453],{"class":299},[248,827,219],{"class":282},[248,829,830],{"class":299},"Now",[248,832,488],{"class":282},[248,834,836],{"class":250,"line":835},40,[248,837,577],{"class":282},[248,839,841],{"class":250,"line":840},41,[248,842,583],{"class":282},[248,844,846,848,850,852,855,857,860,862,865,867,870],{"class":250,"line":845},42,[248,847,306],{"class":282},[248,849,591],{"class":309},[248,851,313],{"class":282},[248,853,854],{"class":278},"s",[248,856,326],{"class":286},[248,858,859],{"class":299}," s",[248,861,219],{"class":282},[248,863,864],{"class":299},"Attempt",[248,866,320],{"class":282},[248,868,869],{"class":299}," Attempts",[248,871,338],{"class":282},[248,873,875,877,879,881,883,885,887,889,892,894,896,899,901,903,905,907,910],{"class":874,"line":241},[250,265],[248,876,306],{"class":282},[248,878,591],{"class":309},[248,880,313],{"class":282},[248,882,854],{"class":278},[248,884,326],{"class":286},[248,886,859],{"class":299},[248,888,219],{"class":282},[248,890,891],{"class":299},"Grade",[248,893,320],{"class":282},[248,895,637],{"class":282},[248,897,898],{"class":278},"_",[248,900,320],{"class":282},[248,902,644],{"class":278},[248,904,456],{"class":282},[248,906,326],{"class":286},[248,908,909],{"class":316}," 80m",[248,911,338],{"class":282},[248,913,915,917,919,921,923,925,927,929,931,933,935,937,939,941,943,945,947,949,952,954,956,958,960,962,965],{"class":914,"line":242},[250,265],[248,916,306],{"class":282},[248,918,591],{"class":309},[248,920,313],{"class":282},[248,922,854],{"class":278},[248,924,326],{"class":286},[248,926,859],{"class":299},[248,928,219],{"class":282},[248,930,227],{"class":299},[248,932,320],{"class":282},[248,934,637],{"class":282},[248,936,854],{"class":278},[248,938,320],{"class":282},[248,940,644],{"class":278},[248,942,456],{"class":282},[248,944,326],{"class":286},[248,946,859],{"class":299},[248,948,219],{"class":282},[248,950,951],{"class":299},"SubmittedAt ",[248,953,290],{"class":286},[248,955,859],{"class":299},[248,957,219],{"class":282},[248,959,197],{"class":299},[248,961,219],{"class":282},[248,963,964],{"class":299},"DueAt",[248,966,674],{"class":282},[221,968,970],{"id":969},"a-call-site-grade-survives-the-fill-only-derive","A call-site grade survives the fill-only derive",[176,972,973,974,977],{},"A grade of zero is a meaningful result, so this model uses ",[182,975,976],{},"decimal?"," to distinguish it from a missing grade. The test checks that the derived default leaves zero alone and that a draft can be built without being saved.",[979,980,981,1284],"code-group",{},[230,982,986],{"className":232,"code":983,"filename":984,"highlights":985,"language":243,"meta":244,"style":244},"await biome\n    .AddSchool(out _)\n    .AddCourse(out var course)\n    .AddSections(out var sections, _ => { }, s => s.Number = 1)\n    .AddEnrollments(out _, 2)\n    .AddAssignments(out var assignments, 1)\n    .AddSubmissions(\n        out var submissions,\n        Submissions.Distinction + Submissions.Reviewed\n    )\n    .Under(course)\n    .AddSection(out var third)\n    \u002F\u002F Return to a specific assignment for a second, preview-only attempt.\n    .Under(assignments[0])\n    .AddSubmission(out var draft, s => s.Grade = 0m)\n    .Transient()\n    .BuildAsync();\n","With Biome",[237,363,369,384,390,462,471],[182,987,988,996,1012,1032,1078,1098,1120,1131,1144,1165,1170,1184,1202,1207,1227,1264,1274],{"__ignoreMap":244},[248,989,990,993],{"class":250,"line":251},[248,991,992],{"class":286},"await",[248,994,995],{"class":299}," biome\n",[248,997,998,1000,1003,1005,1008,1010],{"class":250,"line":258},[248,999,306],{"class":282},[248,1001,1002],{"class":309},"AddSchool",[248,1004,313],{"class":282},[248,1006,1007],{"class":268},"out",[248,1009,644],{"class":299},[248,1011,338],{"class":282},[248,1013,1014,1016,1019,1021,1023,1027,1030],{"class":250,"line":236},[248,1015,306],{"class":282},[248,1017,1018],{"class":309},"AddCourse",[248,1020,313],{"class":282},[248,1022,1007],{"class":268},[248,1024,1026],{"class":1025},"sG8yY"," var",[248,1028,1029],{"class":278}," course",[248,1031,338],{"class":282},[248,1033,1035,1037,1040,1042,1044,1046,1049,1051,1053,1055,1058,1061,1063,1065,1067,1069,1072,1074,1076],{"class":1034,"line":237},[250,265],[248,1036,306],{"class":282},[248,1038,1039],{"class":309},"AddSections",[248,1041,313],{"class":282},[248,1043,1007],{"class":268},[248,1045,1026],{"class":1025},[248,1047,1048],{"class":278}," sections",[248,1050,320],{"class":282},[248,1052,644],{"class":278},[248,1054,326],{"class":286},[248,1056,1057],{"class":282}," {",[248,1059,1060],{"class":282}," },",[248,1062,859],{"class":278},[248,1064,326],{"class":286},[248,1066,859],{"class":299},[248,1068,219],{"class":282},[248,1070,1071],{"class":299},"Number ",[248,1073,410],{"class":286},[248,1075,335],{"class":316},[248,1077,338],{"class":282},[248,1079,1080,1082,1085,1087,1089,1091,1093,1096],{"class":250,"line":238},[248,1081,306],{"class":282},[248,1083,1084],{"class":309},"AddEnrollments",[248,1086,313],{"class":282},[248,1088,1007],{"class":268},[248,1090,644],{"class":299},[248,1092,320],{"class":282},[248,1094,1095],{"class":316}," 2",[248,1097,338],{"class":282},[248,1099,1100,1102,1105,1107,1109,1111,1114,1116,1118],{"class":250,"line":356},[248,1101,306],{"class":282},[248,1103,1104],{"class":309},"AddAssignments",[248,1106,313],{"class":282},[248,1108,1007],{"class":268},[248,1110,1026],{"class":1025},[248,1112,1113],{"class":278}," assignments",[248,1115,320],{"class":282},[248,1117,335],{"class":316},[248,1119,338],{"class":282},[248,1121,1123,1125,1128],{"class":1122,"line":363},[250,265],[248,1124,306],{"class":282},[248,1126,1127],{"class":309},"AddSubmissions",[248,1129,1130],{"class":282},"(\n",[248,1132,1134,1137,1139,1142],{"class":1133,"line":369},[250,265],[248,1135,1136],{"class":268},"        out",[248,1138,1026],{"class":1025},[248,1140,1141],{"class":278}," submissions",[248,1143,488],{"class":282},[248,1145,1147,1150,1152,1155,1157,1160,1162],{"class":1146,"line":384},[250,265],[248,1148,1149],{"class":299},"        Submissions",[248,1151,219],{"class":282},[248,1153,1154],{"class":299},"Distinction ",[248,1156,332],{"class":286},[248,1158,1159],{"class":299}," Submissions",[248,1161,219],{"class":282},[248,1163,1164],{"class":299},"Reviewed\n",[248,1166,1168],{"class":1167,"line":390},[250,265],[248,1169,583],{"class":282},[248,1171,1172,1174,1177,1179,1182],{"class":250,"line":396},[248,1173,306],{"class":282},[248,1175,1176],{"class":309},"Under",[248,1178,313],{"class":282},[248,1180,1181],{"class":299},"course",[248,1183,338],{"class":282},[248,1185,1186,1188,1191,1193,1195,1197,1200],{"class":250,"line":402},[248,1187,306],{"class":282},[248,1189,1190],{"class":309},"AddSection",[248,1192,313],{"class":282},[248,1194,1007],{"class":268},[248,1196,1026],{"class":1025},[248,1198,1199],{"class":278}," third",[248,1201,338],{"class":282},[248,1203,1204],{"class":250,"line":416},[248,1205,1206],{"class":254},"    \u002F\u002F Return to a specific assignment for a second, preview-only attempt.\n",[248,1208,1209,1211,1213,1215,1218,1221,1224],{"class":250,"line":442},[248,1210,306],{"class":282},[248,1212,1176],{"class":309},[248,1214,313],{"class":282},[248,1216,1217],{"class":299},"assignments",[248,1219,1220],{"class":282},"[",[248,1222,1223],{"class":316},"0",[248,1225,1226],{"class":282},"])\n",[248,1228,1230,1232,1235,1237,1239,1241,1244,1246,1248,1250,1252,1254,1257,1259,1262],{"class":1229,"line":462},[250,265],[248,1231,306],{"class":282},[248,1233,1234],{"class":309},"AddSubmission",[248,1236,313],{"class":282},[248,1238,1007],{"class":268},[248,1240,1026],{"class":1025},[248,1242,1243],{"class":278}," draft",[248,1245,320],{"class":282},[248,1247,859],{"class":278},[248,1249,326],{"class":286},[248,1251,859],{"class":299},[248,1253,219],{"class":282},[248,1255,1256],{"class":299},"Grade ",[248,1258,410],{"class":286},[248,1260,1261],{"class":316}," 0m",[248,1263,338],{"class":282},[248,1265,1267,1269,1272],{"class":1266,"line":471},[250,265],[248,1268,306],{"class":282},[248,1270,1271],{"class":309},"Transient",[248,1273,468],{"class":282},[248,1275,1276,1278,1281],{"class":250,"line":477},[248,1277,306],{"class":282},[248,1279,1280],{"class":309},"BuildAsync",[248,1282,1283],{"class":282},"();\n",[1285,1286,1289],"code-collapse",{"label":1287,"name":1288},"Without Biome","setup",[230,1290,1292],{"className":232,"code":1291,"language":243,"meta":244,"style":244},"var school = new School { District = \"Example district\" };\nvar course = new Course { School = school };\nvar sectionTwo = new Section\n{\n    Course = course,\n    Number = 2,\n    Name = \"Section 2\",\n};\nvar sectionOne = new Section\n{\n    Course = course,\n    Number = 1,\n    Name = \"Section 1\",\n}; \u002F\u002F explicit 1 pushes the first to 2\nvar sections = new[] { sectionTwo, sectionOne };\nvar third = new Section\n{\n    Course = course,\n    Number = 3,\n    Name = \"Section 3\",\n};\n\nvar now = DateTimeOffset.UtcNow;\nvar roster = 1; \u002F\u002F per course, across sections\nvar enrollments = sections\n    .SelectMany(s =>\n        Enumerable\n            .Range(0, 2)\n            .Select(_ => new Enrollment\n            {\n                Section = s,\n                RosterNumber = roster,\n                Student = $\"Student {roster++}\",\n            })\n    )\n    .ToList();\nvar assignments = enrollments\n    .Select(e => new Assignment\n    {\n        Enrollment = e,\n        School = school,\n        Number = 1,\n        Title = \"Assignment 1\",\n        OpensAt = now.AddDays(-1),\n        DueAt = now.AddDays(1),\n    })\n    .ToList();\nvar submissions = assignments\n    .Select(a => new Submission\n    {\n        Assignment = a,\n        School = school,\n        Attempt = 1,\n        Grade = 95m,\n        Reviewed = true,\n        SubmittedAt = now,\n        Late = false,\n    })\n    .ToList();\nvar draft = new Submission\n{\n    Assignment = assignments[0],\n    School = school,\n    Attempt = 2,\n    Grade = 0m,\n    SubmittedAt = now,\n}; \u002F\u002F not saved\n\ndb.AddRange(school, course, sectionTwo, sectionOne, third);\ndb.AddRange(enrollments);\ndb.AddRange(assignments);\ndb.AddRange(submissions);\nawait db.SaveChangesAsync();\n",[182,1293,1294,1328,1354,1368,1373,1384,1395,1411,1415,1428,1432,1442,1452,1467,1475,1499,1511,1515,1525,1536,1551,1555,1559,1579,1596,1608,1621,1626,1644,1662,1666,1677,1688,1714,1719,1723,1732,1743,1761,1766,1778,1789,1800,1816,1840,1860,1866,1875,1887,1905,1910,1922,1933,1945,1958,1972,1984,1997,2002,2011,2024,2029,2046,2058,2070,2082,2094,2102,2107,2141,2157,2172,2188],{"__ignoreMap":244},[248,1295,1296,1299,1302,1304,1307,1310,1312,1315,1317,1320,1323,1325],{"class":250,"line":251},[248,1297,1298],{"class":1025},"var",[248,1300,1301],{"class":278}," school",[248,1303,296],{"class":286},[248,1305,1306],{"class":286}," new",[248,1308,1309],{"class":278}," School",[248,1311,1057],{"class":282},[248,1313,1314],{"class":299}," District ",[248,1316,410],{"class":286},[248,1318,1319],{"class":651}," \"",[248,1321,1322],{"class":655},"Example district",[248,1324,671],{"class":651},[248,1326,1327],{"class":282}," };\n",[248,1329,1330,1332,1334,1336,1338,1341,1343,1346,1348,1351],{"class":250,"line":258},[248,1331,1298],{"class":1025},[248,1333,1029],{"class":278},[248,1335,296],{"class":286},[248,1337,1306],{"class":286},[248,1339,1340],{"class":278}," Course",[248,1342,1057],{"class":282},[248,1344,1345],{"class":299}," School ",[248,1347,410],{"class":286},[248,1349,1350],{"class":299}," school ",[248,1352,1353],{"class":282},"};\n",[248,1355,1356,1358,1361,1363,1365],{"class":250,"line":236},[248,1357,1298],{"class":1025},[248,1359,1360],{"class":278}," sectionTwo",[248,1362,296],{"class":286},[248,1364,1306],{"class":286},[248,1366,1367],{"class":278}," Section\n",[248,1369,1370],{"class":250,"line":237},[248,1371,1372],{"class":282},"{\n",[248,1374,1375,1378,1380,1382],{"class":250,"line":238},[248,1376,1377],{"class":299},"    Course ",[248,1379,410],{"class":286},[248,1381,1029],{"class":299},[248,1383,488],{"class":282},[248,1385,1386,1389,1391,1393],{"class":250,"line":356},[248,1387,1388],{"class":299},"    Number ",[248,1390,410],{"class":286},[248,1392,1095],{"class":316},[248,1394,488],{"class":282},[248,1396,1397,1400,1402,1404,1407,1409],{"class":250,"line":363},[248,1398,1399],{"class":299},"    Name ",[248,1401,410],{"class":286},[248,1403,1319],{"class":651},[248,1405,1406],{"class":655},"Section 2",[248,1408,671],{"class":651},[248,1410,488],{"class":282},[248,1412,1413],{"class":250,"line":369},[248,1414,1353],{"class":282},[248,1416,1417,1419,1422,1424,1426],{"class":250,"line":384},[248,1418,1298],{"class":1025},[248,1420,1421],{"class":278}," sectionOne",[248,1423,296],{"class":286},[248,1425,1306],{"class":286},[248,1427,1367],{"class":278},[248,1429,1430],{"class":250,"line":390},[248,1431,1372],{"class":282},[248,1433,1434,1436,1438,1440],{"class":250,"line":396},[248,1435,1377],{"class":299},[248,1437,410],{"class":286},[248,1439,1029],{"class":299},[248,1441,488],{"class":282},[248,1443,1444,1446,1448,1450],{"class":250,"line":402},[248,1445,1388],{"class":299},[248,1447,410],{"class":286},[248,1449,335],{"class":316},[248,1451,488],{"class":282},[248,1453,1454,1456,1458,1460,1463,1465],{"class":250,"line":416},[248,1455,1399],{"class":299},[248,1457,410],{"class":286},[248,1459,1319],{"class":651},[248,1461,1462],{"class":655},"Section 1",[248,1464,671],{"class":651},[248,1466,488],{"class":282},[248,1468,1469,1472],{"class":250,"line":442},[248,1470,1471],{"class":282},"};",[248,1473,1474],{"class":254}," \u002F\u002F explicit 1 pushes the first to 2\n",[248,1476,1477,1479,1481,1483,1485,1488,1490,1492,1494,1497],{"class":250,"line":462},[248,1478,1298],{"class":1025},[248,1480,1048],{"class":278},[248,1482,296],{"class":286},[248,1484,1306],{"class":286},[248,1486,1487],{"class":282},"[]",[248,1489,1057],{"class":282},[248,1491,1360],{"class":299},[248,1493,320],{"class":282},[248,1495,1496],{"class":299}," sectionOne ",[248,1498,1353],{"class":282},[248,1500,1501,1503,1505,1507,1509],{"class":250,"line":471},[248,1502,1298],{"class":1025},[248,1504,1199],{"class":278},[248,1506,296],{"class":286},[248,1508,1306],{"class":286},[248,1510,1367],{"class":278},[248,1512,1513],{"class":250,"line":477},[248,1514,1372],{"class":282},[248,1516,1517,1519,1521,1523],{"class":250,"line":491},[248,1518,1377],{"class":299},[248,1520,410],{"class":286},[248,1522,1029],{"class":299},[248,1524,488],{"class":282},[248,1526,1527,1529,1531,1534],{"class":250,"line":239},[248,1528,1388],{"class":299},[248,1530,410],{"class":286},[248,1532,1533],{"class":316}," 3",[248,1535,488],{"class":282},[248,1537,1538,1540,1542,1544,1547,1549],{"class":250,"line":240},[248,1539,1399],{"class":299},[248,1541,410],{"class":286},[248,1543,1319],{"class":651},[248,1545,1546],{"class":655},"Section 3",[248,1548,671],{"class":651},[248,1550,488],{"class":282},[248,1552,1553],{"class":250,"line":574},[248,1554,1353],{"class":282},[248,1556,1557],{"class":250,"line":580},[248,1558,360],{"emptyLinePlaceholder":359},[248,1560,1561,1563,1566,1568,1571,1573,1576],{"class":250,"line":586},[248,1562,1298],{"class":1025},[248,1564,1565],{"class":278}," now",[248,1567,296],{"class":286},[248,1569,1570],{"class":299}," DateTimeOffset",[248,1572,219],{"class":282},[248,1574,1575],{"class":299},"UtcNow",[248,1577,1578],{"class":282},";\n",[248,1580,1581,1583,1586,1588,1590,1593],{"class":250,"line":615},[248,1582,1298],{"class":1025},[248,1584,1585],{"class":278}," roster",[248,1587,296],{"class":286},[248,1589,335],{"class":316},[248,1591,1592],{"class":282},";",[248,1594,1595],{"class":254}," \u002F\u002F per course, across sections\n",[248,1597,1598,1600,1603,1605],{"class":250,"line":677},[248,1599,1298],{"class":1025},[248,1601,1602],{"class":278}," enrollments",[248,1604,296],{"class":286},[248,1606,1607],{"class":299}," sections\n",[248,1609,1610,1612,1615,1617,1619],{"class":250,"line":682},[248,1611,306],{"class":282},[248,1613,1614],{"class":309},"SelectMany",[248,1616,313],{"class":282},[248,1618,854],{"class":278},[248,1620,459],{"class":286},[248,1622,1623],{"class":250,"line":688},[248,1624,1625],{"class":299},"        Enumerable\n",[248,1627,1628,1631,1634,1636,1638,1640,1642],{"class":250,"line":694},[248,1629,1630],{"class":282},"            .",[248,1632,1633],{"class":309},"Range",[248,1635,313],{"class":282},[248,1637,1223],{"class":316},[248,1639,320],{"class":282},[248,1641,1095],{"class":316},[248,1643,338],{"class":282},[248,1645,1646,1648,1651,1653,1655,1657,1659],{"class":250,"line":707},[248,1647,1630],{"class":282},[248,1649,1650],{"class":309},"Select",[248,1652,313],{"class":282},[248,1654,898],{"class":278},[248,1656,326],{"class":286},[248,1658,1306],{"class":286},[248,1660,1661],{"class":278}," Enrollment\n",[248,1663,1664],{"class":250,"line":712},[248,1665,474],{"class":282},[248,1667,1668,1671,1673,1675],{"class":250,"line":718},[248,1669,1670],{"class":299},"                Section ",[248,1672,410],{"class":286},[248,1674,859],{"class":299},[248,1676,488],{"class":282},[248,1678,1679,1682,1684,1686],{"class":250,"line":724},[248,1680,1681],{"class":299},"                RosterNumber ",[248,1683,410],{"class":286},[248,1685,1585],{"class":299},[248,1687,488],{"class":282},[248,1689,1690,1693,1695,1697,1700,1702,1705,1708,1710,1712],{"class":250,"line":736},[248,1691,1692],{"class":299},"                Student ",[248,1694,410],{"class":286},[248,1696,652],{"class":651},[248,1698,1699],{"class":655},"Student ",[248,1701,659],{"class":651},[248,1703,1704],{"class":299},"roster",[248,1706,1707],{"class":286},"++",[248,1709,668],{"class":651},[248,1711,671],{"class":651},[248,1713,488],{"class":282},[248,1715,1716],{"class":250,"line":758},[248,1717,1718],{"class":282},"            })\n",[248,1720,1721],{"class":250,"line":774},[248,1722,583],{"class":282},[248,1724,1725,1727,1730],{"class":250,"line":781},[248,1726,306],{"class":282},[248,1728,1729],{"class":309},"ToList",[248,1731,1283],{"class":282},[248,1733,1734,1736,1738,1740],{"class":250,"line":786},[248,1735,1298],{"class":1025},[248,1737,1113],{"class":278},[248,1739,296],{"class":286},[248,1741,1742],{"class":299}," enrollments\n",[248,1744,1745,1747,1749,1751,1754,1756,1758],{"class":250,"line":799},[248,1746,306],{"class":282},[248,1748,1650],{"class":309},[248,1750,313],{"class":282},[248,1752,1753],{"class":278},"e",[248,1755,326],{"class":286},[248,1757,1306],{"class":286},[248,1759,1760],{"class":278}," Assignment\n",[248,1762,1763],{"class":250,"line":818},[248,1764,1765],{"class":282},"    {\n",[248,1767,1768,1771,1773,1776],{"class":250,"line":835},[248,1769,1770],{"class":299},"        Enrollment ",[248,1772,410],{"class":286},[248,1774,1775],{"class":299}," e",[248,1777,488],{"class":282},[248,1779,1780,1783,1785,1787],{"class":250,"line":840},[248,1781,1782],{"class":299},"        School ",[248,1784,410],{"class":286},[248,1786,1301],{"class":299},[248,1788,488],{"class":282},[248,1790,1791,1794,1796,1798],{"class":250,"line":845},[248,1792,1793],{"class":299},"        Number ",[248,1795,410],{"class":286},[248,1797,335],{"class":316},[248,1799,488],{"class":282},[248,1801,1802,1805,1807,1809,1812,1814],{"class":250,"line":241},[248,1803,1804],{"class":299},"        Title ",[248,1806,410],{"class":286},[248,1808,1319],{"class":651},[248,1810,1811],{"class":655},"Assignment 1",[248,1813,671],{"class":651},[248,1815,488],{"class":282},[248,1817,1818,1821,1823,1825,1827,1830,1832,1835,1837],{"class":250,"line":242},[248,1819,1820],{"class":299},"        OpensAt ",[248,1822,410],{"class":286},[248,1824,1565],{"class":299},[248,1826,219],{"class":282},[248,1828,1829],{"class":309},"AddDays",[248,1831,313],{"class":282},[248,1833,1834],{"class":286},"-",[248,1836,317],{"class":316},[248,1838,1839],{"class":282},"),\n",[248,1841,1843,1846,1848,1850,1852,1854,1856,1858],{"class":250,"line":1842},45,[248,1844,1845],{"class":299},"        DueAt ",[248,1847,410],{"class":286},[248,1849,1565],{"class":299},[248,1851,219],{"class":282},[248,1853,1829],{"class":309},[248,1855,313],{"class":282},[248,1857,317],{"class":316},[248,1859,1839],{"class":282},[248,1861,1863],{"class":250,"line":1862},46,[248,1864,1865],{"class":282},"    })\n",[248,1867,1869,1871,1873],{"class":250,"line":1868},47,[248,1870,306],{"class":282},[248,1872,1729],{"class":309},[248,1874,1283],{"class":282},[248,1876,1878,1880,1882,1884],{"class":250,"line":1877},48,[248,1879,1298],{"class":1025},[248,1881,1141],{"class":278},[248,1883,296],{"class":286},[248,1885,1886],{"class":299}," assignments\n",[248,1888,1890,1892,1894,1896,1898,1900,1902],{"class":250,"line":1889},49,[248,1891,306],{"class":282},[248,1893,1650],{"class":309},[248,1895,313],{"class":282},[248,1897,211],{"class":278},[248,1899,326],{"class":286},[248,1901,1306],{"class":286},[248,1903,1904],{"class":278}," Submission\n",[248,1906,1908],{"class":250,"line":1907},50,[248,1909,1765],{"class":282},[248,1911,1913,1916,1918,1920],{"class":250,"line":1912},51,[248,1914,1915],{"class":299},"        Assignment ",[248,1917,410],{"class":286},[248,1919,600],{"class":299},[248,1921,488],{"class":282},[248,1923,1925,1927,1929,1931],{"class":250,"line":1924},52,[248,1926,1782],{"class":299},[248,1928,410],{"class":286},[248,1930,1301],{"class":299},[248,1932,488],{"class":282},[248,1934,1936,1939,1941,1943],{"class":250,"line":1935},53,[248,1937,1938],{"class":299},"        Attempt ",[248,1940,410],{"class":286},[248,1942,335],{"class":316},[248,1944,488],{"class":282},[248,1946,1948,1951,1953,1956],{"class":250,"line":1947},54,[248,1949,1950],{"class":299},"        Grade ",[248,1952,410],{"class":286},[248,1954,1955],{"class":316}," 95m",[248,1957,488],{"class":282},[248,1959,1961,1964,1966,1970],{"class":250,"line":1960},55,[248,1962,1963],{"class":299},"        Reviewed ",[248,1965,410],{"class":286},[248,1967,1969],{"class":1968},"syTEX"," true",[248,1971,488],{"class":282},[248,1973,1975,1978,1980,1982],{"class":250,"line":1974},56,[248,1976,1977],{"class":299},"        SubmittedAt ",[248,1979,410],{"class":286},[248,1981,1565],{"class":299},[248,1983,488],{"class":282},[248,1985,1987,1990,1992,1995],{"class":250,"line":1986},57,[248,1988,1989],{"class":299},"        Late ",[248,1991,410],{"class":286},[248,1993,1994],{"class":1968}," false",[248,1996,488],{"class":282},[248,1998,2000],{"class":250,"line":1999},58,[248,2001,1865],{"class":282},[248,2003,2005,2007,2009],{"class":250,"line":2004},59,[248,2006,306],{"class":282},[248,2008,1729],{"class":309},[248,2010,1283],{"class":282},[248,2012,2014,2016,2018,2020,2022],{"class":250,"line":2013},60,[248,2015,1298],{"class":1025},[248,2017,1243],{"class":278},[248,2019,296],{"class":286},[248,2021,1306],{"class":286},[248,2023,1904],{"class":278},[248,2025,2027],{"class":250,"line":2026},61,[248,2028,1372],{"class":282},[248,2030,2032,2035,2037,2039,2041,2043],{"class":250,"line":2031},62,[248,2033,2034],{"class":299},"    Assignment ",[248,2036,410],{"class":286},[248,2038,1113],{"class":299},[248,2040,1220],{"class":282},[248,2042,1223],{"class":316},[248,2044,2045],{"class":282},"],\n",[248,2047,2049,2052,2054,2056],{"class":250,"line":2048},63,[248,2050,2051],{"class":299},"    School ",[248,2053,410],{"class":286},[248,2055,1301],{"class":299},[248,2057,488],{"class":282},[248,2059,2061,2064,2066,2068],{"class":250,"line":2060},64,[248,2062,2063],{"class":299},"    Attempt ",[248,2065,410],{"class":286},[248,2067,1095],{"class":316},[248,2069,488],{"class":282},[248,2071,2073,2076,2078,2080],{"class":250,"line":2072},65,[248,2074,2075],{"class":299},"    Grade ",[248,2077,410],{"class":286},[248,2079,1261],{"class":316},[248,2081,488],{"class":282},[248,2083,2085,2088,2090,2092],{"class":250,"line":2084},66,[248,2086,2087],{"class":299},"    SubmittedAt ",[248,2089,410],{"class":286},[248,2091,1565],{"class":299},[248,2093,488],{"class":282},[248,2095,2097,2099],{"class":250,"line":2096},67,[248,2098,1471],{"class":282},[248,2100,2101],{"class":254}," \u002F\u002F not saved\n",[248,2103,2105],{"class":250,"line":2104},68,[248,2106,360],{"emptyLinePlaceholder":359},[248,2108,2110,2113,2115,2118,2120,2123,2125,2127,2129,2131,2133,2135,2137,2139],{"class":250,"line":2109},69,[248,2111,2112],{"class":299},"db",[248,2114,219],{"class":282},[248,2116,2117],{"class":309},"AddRange",[248,2119,313],{"class":282},[248,2121,2122],{"class":299},"school",[248,2124,320],{"class":282},[248,2126,1029],{"class":299},[248,2128,320],{"class":282},[248,2130,1360],{"class":299},[248,2132,320],{"class":282},[248,2134,1421],{"class":299},[248,2136,320],{"class":282},[248,2138,1199],{"class":299},[248,2140,674],{"class":282},[248,2142,2144,2146,2148,2150,2152,2155],{"class":250,"line":2143},70,[248,2145,2112],{"class":299},[248,2147,219],{"class":282},[248,2149,2117],{"class":309},[248,2151,313],{"class":282},[248,2153,2154],{"class":299},"enrollments",[248,2156,674],{"class":282},[248,2158,2160,2162,2164,2166,2168,2170],{"class":250,"line":2159},71,[248,2161,2112],{"class":299},[248,2163,219],{"class":282},[248,2165,2117],{"class":309},[248,2167,313],{"class":282},[248,2169,1217],{"class":299},[248,2171,674],{"class":282},[248,2173,2175,2177,2179,2181,2183,2186],{"class":250,"line":2174},72,[248,2176,2112],{"class":299},[248,2178,219],{"class":282},[248,2180,2117],{"class":309},[248,2182,313],{"class":282},[248,2184,2185],{"class":299},"submissions",[248,2187,674],{"class":282},[248,2189,2191,2193,2196,2198,2201],{"class":250,"line":2190},73,[248,2192,992],{"class":286},[248,2194,2195],{"class":299}," db",[248,2197,219],{"class":282},[248,2199,2200],{"class":309},"SaveChangesAsync",[248,2202,1283],{"class":282},[176,2204,2205,2206,2209,2210,2209,2213,2216,2217,2220,2221,2224],{},"The real test asserts ",[182,2207,2208],{},"sections[0].Number == 2",", ",[182,2211,2212],{},"third.Number == 3",[182,2214,2215],{},"draft.Grade == 0m"," (explicit zero kept, not filled with ",[182,2218,2219],{},"80","), ",[182,2222,2223],{},"draft.Attempt == 2"," (attempts resume per assignment), and four saved submissions out of five built.",[2226,2227,2228],"caution",{},[176,2229,2230,2233,2234,2236,2237,2240,2241,2243,2244,2247,2248,2251,2252,2209,2255,2257],{},[182,2231,2232],{},"Derive(s => s.Grade, (_, _) => 80m)"," fills ",[182,2235,976],{}," only when it's ",[182,2238,2239],{},"null",". Because ",[182,2242,891],{}," is nullable, ",[182,2245,2246],{},"0m"," is ",[203,2249,2250],{},"explicit",". For a non-nullable ",[182,2253,2254],{},"decimal",[182,2256,1223],{}," would count as unset.",[221,2259,2261],{"id":2260},"roster-numbers-cross-section-boundaries","Roster numbers cross section boundaries",[230,2263,2267],{"className":232,"code":2264,"filename":2265,"highlights":2266,"language":243,"meta":244,"style":244},"await biome\n    .AddSchools(out var schools, 2)\n    .AddCourses(out _, 2) \u002F\u002F 4 courses\n    .AddSections(out var sections, 2) \u002F\u002F 8 sections\n    .AddEnrollments(out var enrollments, 3) \u002F\u002F 24 enrollments\n    .AddAssignments(out var assignments, 2) \u002F\u002F 48 assignments\n    .AddSubmissions(out var submissions, 1)\n    .BuildAsync();\n\n\u002F\u002F sections[2].Number == 1          (numbered per course)\n\u002F\u002F enrollments[3].RosterNumber == 4 (the roster continues into the next section)\n\u002F\u002F enrollments[6].RosterNumber == 1 (a new course restarts it)\n\u002F\u002F submissions[47].School == schools[1]  (Ancestor\u003CSchool> reaches five levels up)\n","LearningTests.cs",[237,238],[182,2268,2269,2275,2297,2319,2343,2367,2390,2410,2418,2422,2427,2432,2437],{"__ignoreMap":244},[248,2270,2271,2273],{"class":250,"line":251},[248,2272,992],{"class":286},[248,2274,995],{"class":299},[248,2276,2277,2279,2282,2284,2286,2288,2291,2293,2295],{"class":250,"line":258},[248,2278,306],{"class":282},[248,2280,2281],{"class":309},"AddSchools",[248,2283,313],{"class":282},[248,2285,1007],{"class":268},[248,2287,1026],{"class":1025},[248,2289,2290],{"class":278}," schools",[248,2292,320],{"class":282},[248,2294,1095],{"class":316},[248,2296,338],{"class":282},[248,2298,2299,2301,2304,2306,2308,2310,2312,2314,2316],{"class":250,"line":236},[248,2300,306],{"class":282},[248,2302,2303],{"class":309},"AddCourses",[248,2305,313],{"class":282},[248,2307,1007],{"class":268},[248,2309,644],{"class":299},[248,2311,320],{"class":282},[248,2313,1095],{"class":316},[248,2315,456],{"class":282},[248,2317,2318],{"class":254}," \u002F\u002F 4 courses\n",[248,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340],{"class":2321,"line":237},[250,265],[248,2323,306],{"class":282},[248,2325,1039],{"class":309},[248,2327,313],{"class":282},[248,2329,1007],{"class":268},[248,2331,1026],{"class":1025},[248,2333,1048],{"class":278},[248,2335,320],{"class":282},[248,2337,1095],{"class":316},[248,2339,456],{"class":282},[248,2341,2342],{"class":254}," \u002F\u002F 8 sections\n",[248,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364],{"class":2345,"line":238},[250,265],[248,2347,306],{"class":282},[248,2349,1084],{"class":309},[248,2351,313],{"class":282},[248,2353,1007],{"class":268},[248,2355,1026],{"class":1025},[248,2357,1602],{"class":278},[248,2359,320],{"class":282},[248,2361,1533],{"class":316},[248,2363,456],{"class":282},[248,2365,2366],{"class":254}," \u002F\u002F 24 enrollments\n",[248,2368,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387],{"class":250,"line":356},[248,2370,306],{"class":282},[248,2372,1104],{"class":309},[248,2374,313],{"class":282},[248,2376,1007],{"class":268},[248,2378,1026],{"class":1025},[248,2380,1113],{"class":278},[248,2382,320],{"class":282},[248,2384,1095],{"class":316},[248,2386,456],{"class":282},[248,2388,2389],{"class":254}," \u002F\u002F 48 assignments\n",[248,2391,2392,2394,2396,2398,2400,2402,2404,2406,2408],{"class":250,"line":363},[248,2393,306],{"class":282},[248,2395,1127],{"class":309},[248,2397,313],{"class":282},[248,2399,1007],{"class":268},[248,2401,1026],{"class":1025},[248,2403,1141],{"class":278},[248,2405,320],{"class":282},[248,2407,335],{"class":316},[248,2409,338],{"class":282},[248,2411,2412,2414,2416],{"class":250,"line":369},[248,2413,306],{"class":282},[248,2415,1280],{"class":309},[248,2417,1283],{"class":282},[248,2419,2420],{"class":250,"line":384},[248,2421,360],{"emptyLinePlaceholder":359},[248,2423,2424],{"class":250,"line":390},[248,2425,2426],{"class":254},"\u002F\u002F sections[2].Number == 1          (numbered per course)\n",[248,2428,2429],{"class":250,"line":396},[248,2430,2431],{"class":254},"\u002F\u002F enrollments[3].RosterNumber == 4 (the roster continues into the next section)\n",[248,2433,2434],{"class":250,"line":402},[248,2435,2436],{"class":254},"\u002F\u002F enrollments[6].RosterNumber == 1 (a new course restarts it)\n",[248,2438,2439],{"class":250,"line":416},[248,2440,2441],{"class":254},"\u002F\u002F submissions[47].School == schools[1]  (Ancestor\u003CSchool> reaches five levels up)\n",[221,2443,2445],{"id":2444},"one-clock-for-setup-and-policy","One clock for setup and policy",[176,2447,2448,2449,2452],{},"The late policy and the biome read the ",[203,2450,2451],{},"same fake clock",". Advancing it changes the policy's answer, but never mutates historical rows:",[230,2454,2457],{"className":232,"code":2455,"filename":2265,"highlights":2456,"language":243,"meta":244,"style":244},"var deadline = new DateTimeOffset(2026, 10, 11, 12, 0, 0, TimeSpan.Zero);\nvar time = new FakeTimeProvider(deadline.AddHours(-1));\nvar policy = new LatePolicy(time);\nvar biome = TestBiome.Start(out _, time: time);\n\nbiome.AddLateSubmission(\n    out var historicalLate,\n    dueAt: time.GetUtcNow().AddMinutes(-1)\n);\nbiome\n    .AddSchool(out _)\n    .AddCourse(out _)\n    .AddSection(out _)\n    .AddEnrollment(out _)\n    .AddAssignment(out var upcoming, a => a.DueAt = deadline);\nvar wasOverdue = policy.IsOverdue(upcoming); \u002F\u002F false\n\ntime.Advance(TimeSpan.FromHours(2));\nawait biome.Under(upcoming).AddSubmission(out var late).BuildAsync();\n\n\u002F\u002F policy.IsOverdue(upcoming) is now true; late.Late is derived true;\n\u002F\u002F historicalLate.SubmittedAt is unchanged\n",[258,236,356,363,369,384,491,239],[182,2458,2459,2513,2547,2569,2603,2607,2620,2633,2662,2667,2672,2686,2700,2714,2729,2764,2791,2795,2821,2856,2860,2865],{"__ignoreMap":244},[248,2460,2461,2463,2466,2468,2470,2472,2474,2477,2479,2482,2484,2487,2489,2492,2494,2497,2499,2501,2503,2506,2508,2511],{"class":250,"line":251},[248,2462,1298],{"class":1025},[248,2464,2465],{"class":278}," deadline",[248,2467,296],{"class":286},[248,2469,1306],{"class":286},[248,2471,1570],{"class":278},[248,2473,313],{"class":282},[248,2475,2476],{"class":316},"2026",[248,2478,320],{"class":282},[248,2480,2481],{"class":316}," 10",[248,2483,320],{"class":282},[248,2485,2486],{"class":316}," 11",[248,2488,320],{"class":282},[248,2490,2491],{"class":316}," 12",[248,2493,320],{"class":282},[248,2495,2496],{"class":316}," 0",[248,2498,320],{"class":282},[248,2500,2496],{"class":316},[248,2502,320],{"class":282},[248,2504,2505],{"class":299}," TimeSpan",[248,2507,219],{"class":282},[248,2509,2510],{"class":299},"Zero",[248,2512,674],{"class":282},[248,2514,2516,2518,2521,2523,2525,2528,2530,2533,2535,2538,2540,2542,2544],{"class":2515,"line":258},[250,265],[248,2517,1298],{"class":1025},[248,2519,2520],{"class":278}," time",[248,2522,296],{"class":286},[248,2524,1306],{"class":286},[248,2526,2527],{"class":278}," FakeTimeProvider",[248,2529,313],{"class":282},[248,2531,2532],{"class":299},"deadline",[248,2534,219],{"class":282},[248,2536,2537],{"class":309},"AddHours",[248,2539,313],{"class":282},[248,2541,1834],{"class":286},[248,2543,317],{"class":316},[248,2545,2546],{"class":282},"));\n",[248,2548,2550,2552,2555,2557,2559,2562,2564,2567],{"class":2549,"line":236},[250,265],[248,2551,1298],{"class":1025},[248,2553,2554],{"class":278}," policy",[248,2556,296],{"class":286},[248,2558,1306],{"class":286},[248,2560,2561],{"class":278}," LatePolicy",[248,2563,313],{"class":282},[248,2565,2566],{"class":299},"time",[248,2568,674],{"class":282},[248,2570,2571,2573,2576,2578,2581,2583,2586,2588,2590,2592,2594,2596,2599,2601],{"class":250,"line":237},[248,2572,1298],{"class":1025},[248,2574,2575],{"class":278}," biome",[248,2577,296],{"class":286},[248,2579,2580],{"class":299}," TestBiome",[248,2582,219],{"class":282},[248,2584,2585],{"class":309},"Start",[248,2587,313],{"class":282},[248,2589,1007],{"class":268},[248,2591,644],{"class":299},[248,2593,320],{"class":282},[248,2595,2520],{"class":278},[248,2597,2598],{"class":282},":",[248,2600,2520],{"class":299},[248,2602,674],{"class":282},[248,2604,2605],{"class":250,"line":238},[248,2606,360],{"emptyLinePlaceholder":359},[248,2608,2610,2613,2615,2618],{"class":2609,"line":356},[250,265],[248,2611,2612],{"class":299},"biome",[248,2614,219],{"class":282},[248,2616,2617],{"class":309},"AddLateSubmission",[248,2619,1130],{"class":282},[248,2621,2623,2626,2628,2631],{"class":2622,"line":363},[250,265],[248,2624,2625],{"class":268},"    out",[248,2627,1026],{"class":1025},[248,2629,2630],{"class":278}," historicalLate",[248,2632,488],{"class":282},[248,2634,2636,2639,2641,2643,2645,2648,2651,2654,2656,2658,2660],{"class":2635,"line":369},[250,265],[248,2637,2638],{"class":278},"    dueAt",[248,2640,2598],{"class":282},[248,2642,2520],{"class":299},[248,2644,219],{"class":282},[248,2646,2647],{"class":309},"GetUtcNow",[248,2649,2650],{"class":282},"().",[248,2652,2653],{"class":309},"AddMinutes",[248,2655,313],{"class":282},[248,2657,1834],{"class":286},[248,2659,317],{"class":316},[248,2661,338],{"class":282},[248,2663,2665],{"class":2664,"line":384},[250,265],[248,2666,674],{"class":282},[248,2668,2669],{"class":250,"line":390},[248,2670,2671],{"class":299},"biome\n",[248,2673,2674,2676,2678,2680,2682,2684],{"class":250,"line":396},[248,2675,306],{"class":282},[248,2677,1002],{"class":309},[248,2679,313],{"class":282},[248,2681,1007],{"class":268},[248,2683,644],{"class":299},[248,2685,338],{"class":282},[248,2687,2688,2690,2692,2694,2696,2698],{"class":250,"line":402},[248,2689,306],{"class":282},[248,2691,1018],{"class":309},[248,2693,313],{"class":282},[248,2695,1007],{"class":268},[248,2697,644],{"class":299},[248,2699,338],{"class":282},[248,2701,2702,2704,2706,2708,2710,2712],{"class":250,"line":416},[248,2703,306],{"class":282},[248,2705,1190],{"class":309},[248,2707,313],{"class":282},[248,2709,1007],{"class":268},[248,2711,644],{"class":299},[248,2713,338],{"class":282},[248,2715,2716,2718,2721,2723,2725,2727],{"class":250,"line":442},[248,2717,306],{"class":282},[248,2719,2720],{"class":309},"AddEnrollment",[248,2722,313],{"class":282},[248,2724,1007],{"class":268},[248,2726,644],{"class":299},[248,2728,338],{"class":282},[248,2730,2731,2733,2736,2738,2740,2742,2745,2747,2749,2751,2753,2755,2758,2760,2762],{"class":250,"line":462},[248,2732,306],{"class":282},[248,2734,2735],{"class":309},"AddAssignment",[248,2737,313],{"class":282},[248,2739,1007],{"class":268},[248,2741,1026],{"class":1025},[248,2743,2744],{"class":278}," upcoming",[248,2746,320],{"class":282},[248,2748,600],{"class":278},[248,2750,326],{"class":286},[248,2752,600],{"class":299},[248,2754,219],{"class":282},[248,2756,2757],{"class":299},"DueAt ",[248,2759,410],{"class":286},[248,2761,2465],{"class":299},[248,2763,674],{"class":282},[248,2765,2766,2768,2771,2773,2775,2777,2780,2782,2785,2788],{"class":250,"line":471},[248,2767,1298],{"class":1025},[248,2769,2770],{"class":278}," wasOverdue",[248,2772,296],{"class":286},[248,2774,2554],{"class":299},[248,2776,219],{"class":282},[248,2778,2779],{"class":309},"IsOverdue",[248,2781,313],{"class":282},[248,2783,2784],{"class":299},"upcoming",[248,2786,2787],{"class":282},");",[248,2789,2790],{"class":254}," \u002F\u002F false\n",[248,2792,2793],{"class":250,"line":477},[248,2794,360],{"emptyLinePlaceholder":359},[248,2796,2798,2800,2802,2805,2807,2809,2811,2814,2816,2819],{"class":2797,"line":491},[250,265],[248,2799,2566],{"class":299},[248,2801,219],{"class":282},[248,2803,2804],{"class":309},"Advance",[248,2806,313],{"class":282},[248,2808,530],{"class":299},[248,2810,219],{"class":282},[248,2812,2813],{"class":309},"FromHours",[248,2815,313],{"class":282},[248,2817,2818],{"class":316},"2",[248,2820,2546],{"class":282},[248,2822,2824,2826,2828,2830,2832,2834,2836,2839,2841,2843,2845,2847,2850,2852,2854],{"class":2823,"line":239},[250,265],[248,2825,992],{"class":286},[248,2827,2575],{"class":299},[248,2829,219],{"class":282},[248,2831,1176],{"class":309},[248,2833,313],{"class":282},[248,2835,2784],{"class":299},[248,2837,2838],{"class":282},").",[248,2840,1234],{"class":309},[248,2842,313],{"class":282},[248,2844,1007],{"class":268},[248,2846,1026],{"class":1025},[248,2848,2849],{"class":278}," late",[248,2851,2838],{"class":282},[248,2853,1280],{"class":309},[248,2855,1283],{"class":282},[248,2857,2858],{"class":250,"line":240},[248,2859,360],{"emptyLinePlaceholder":359},[248,2861,2862],{"class":250,"line":574},[248,2863,2864],{"class":254},"\u002F\u002F policy.IsOverdue(upcoming) is now true; late.Late is derived true;\n",[248,2866,2867],{"class":250,"line":580},[248,2868,2869],{"class":254},"\u002F\u002F historicalLate.SubmittedAt is unchanged\n",[2871,2872,2873],"tip",{},[176,2874,2875,2876,2879,2880,219],{},"A scenario helper can take an argument: ",[182,2877,2878],{},"AddLateSubmission(out var leaf, dueAt: …)"," builds the whole six-level branch with a chosen deadline, and its definition still shows every step. See ",[211,2881,2883],{"href":2882},"\u002Fguides\u002Fscenario-helpers-and-sugar#scenario-helpers","Scenario helpers",[2885,2886,2887],"style",{},"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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--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 .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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--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 .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":244,"searchDepth":251,"depth":258,"links":2889},[2890,2892,2893,2894],{"id":223,"depth":258,"text":2891},"Blueprints: scopes, time, and a derived Late flag",{"id":969,"depth":258,"text":970},{"id":2260,"depth":258,"text":2261},{"id":2444,"depth":258,"text":2445},"School to submission, with roster numbers across sections and a clock shared with the code under test.","md",null,{},{"icon":144},{"title":141,"description":2895},"uT5_mU8ojPfPpsJ5ZYja7TFdI4hpkgo2P7vlFPwtwL8",[2903,2905],{"title":136,"path":137,"stem":138,"description":2904,"icon":139,"children":-1},"Six levels, three rank scopes, workspace-wide tickets and sibling branches.",{"title":146,"path":147,"stem":148,"description":2906,"icon":149,"children":-1},"Library, document, section and chunk, plus an ingest-run aggregate and a transient preview.",1791831050382]