[{"data":1,"prerenderedAt":2164},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fpresets":123},[4,9,13,17,22,26,30,34,38,42,46,50,55,59,63,67,72,76,80,85,89,93,97,102,106,110,114,119],{"path":5,"title":6,"description":7,"group":8},"\u002Fdocs","Introduction","What tunables is, the problem it solves, and the principles it holds to.","Get started",{"path":10,"title":11,"description":12,"group":8},"\u002Fdocs\u002Fquickstart","Quickstart","Take one group of settings from constants to a screen with a history, in a Nuxt app on Postgres.",{"path":14,"title":15,"description":16,"group":8},"\u002Fdocs\u002Fpatterns","What it is for","The kinds of value tunables keeps — live limits, plans, per-workspace and per-person values, model choices, values that bound each other, costly switches — and the feature that does each.",{"path":18,"title":19,"description":20,"group":21},"\u002Fdocs\u002Fsettings-and-groups","Settings and groups","Declare each setting once, in a group edited beside what it affects, and read it with types.","Concepts",{"path":23,"title":24,"description":25,"group":21},"\u002Fdocs\u002Fkinds-and-units","Kinds and units","The eight kinds of setting, the built-in units, your own units, and how values are checked and read.",{"path":27,"title":28,"description":29,"group":21},"\u002Fdocs\u002Fchecks-and-guards","Checks and guards","Rules across settings, guards for what your app keeps, within for presets, confirmations for costly changes, and notes.",{"path":31,"title":32,"description":33,"group":21},"\u002Fdocs\u002Fhistory-and-restore","History and restore","Every change is a revision with who, when, why and each value before and after; restoring one runs the same checks as any save.",{"path":35,"title":36,"description":37,"group":21},"\u002Fdocs\u002Fpresets","Presets","Named, reusable configurations with one default per slot, assigned by reference and bounded by the settings.",{"path":39,"title":40,"description":41,"group":21},"\u002Fdocs\u002Fscopes","Scopes","Values per workspace and per person, through layers — the system, a plan, the workspace, the person — each bounded by what it inherits.",{"path":43,"title":44,"description":45,"group":21},"\u002Fdocs\u002Fcatalogs","Catalogs","Lists of allowed choices, such as permitted models, whose entries are retired rather than deleted and cannot be retired while in use.",{"path":47,"title":48,"description":49,"group":21},"\u002Fdocs\u002Fdeployment-values","Deployment values","Values a deployment sets in its environment and nobody tunes while the app runs, declared once and listed in .env.example.",{"path":51,"title":52,"description":53,"group":54},"\u002Fdocs\u002Fstorage","Storage","Postgres through your own client, the four tables and how to create them, joining your transactions, and the storage contract behind it.","Integrate",{"path":56,"title":57,"description":58,"group":54},"\u002Fdocs\u002Fserver","Server and access","Mount tunables' API as a fetch handler in Nitro, Hono, Bun or Deno, as Express middleware or as an oRPC router, with access decided by your app.",{"path":60,"title":61,"description":62,"group":54},"\u002Fdocs\u002Faccess","Who can do what","End users bound by values they never see, staff who tune groups, owners and members who change only their own scope, and the terminal.",{"path":64,"title":65,"description":66,"group":54},"\u002Fdocs\u002Ftesting","Testing","Your app's tunables in memory for its own tests, with values set where a test needs them, and how to test rules, guards and confirmations.",{"path":68,"title":69,"description":70,"group":71},"\u002Fdocs\u002Fnuxt-layer","The Nuxt layer","Ready screens for a Nuxt UI app — a group's form, All settings, history, presets, assignments and catalogs — placed beside what they affect.","Screens",{"path":73,"title":74,"description":75,"group":71},"\u002Fdocs\u002Fvue-composables","Vue composables","Headless composables for building tunables' screens in any Vue app, on any design system.",{"path":77,"title":78,"description":79,"group":71},"\u002Fdocs\u002Ftheming","Theming","The screens bring no colors, fonts or CSS of their own; they take your Nuxt UI theme.",{"path":81,"title":82,"description":83,"group":84},"\u002Fdocs\u002Fcli","The CLI","The tunables command, tunables.config.ts, and which commands need a database.","CLI",{"path":86,"title":87,"description":88,"group":84},"\u002Fdocs\u002Fcli-check","Check and generate","The commands that need no database — checking definitions, writing .env.example, and keeping explanations and defaults in step with a pdd-kit Product Model.",{"path":90,"title":91,"description":92,"group":84},"\u002Fdocs\u002Fcli-values","Read and change values","The commands that read and change stored values, through the same checks and history as the screens.",{"path":94,"title":95,"description":96,"group":84},"\u002Fdocs\u002Fcli-skills","Install skills","Install tunables' agent skills for Claude Code, Codex CLI, Cursor, Gemini CLI and GitHub Copilot, and keep them current.",{"path":98,"title":99,"description":100,"group":101},"\u002Fdocs\u002Fskills","Agent skills","Three skills that let a coding agent adopt tunables, define settings the right way and verify that every value has one home.","Skills",{"path":103,"title":104,"description":105,"group":101},"\u002Fdocs\u002Fskill-adopt","tunables-adopt","Bring tunables into an app that has none yet, from an inventory of every value to a wired, synced app with the old homes removed.",{"path":107,"title":108,"description":109,"group":101},"\u002Fdocs\u002Fskill-define","tunables-define","Add, change, rename or remove one value in an app that uses tunables, with its home, its checks, its reads and what happens to stored values.",{"path":111,"title":112,"description":113,"group":101},"\u002Fdocs\u002Fskill-verify","tunables-verify","Audit an app's tunables against their rules, report every finding with where it is and the rule it breaks, and fix only the findings you choose.",{"path":115,"title":116,"description":117,"group":118},"\u002Fdocs\u002Fapi","API reference","Every export of the tunables package, by the subpath it is imported from.","Reference",{"path":120,"title":121,"description":122,"group":118},"\u002Fdocs\u002Ftasklane-example","Tasklane, the example app","A todo app with workspaces and people as tunables — two groups, plans as a layer, a catalog of models, scopes, a rule, a confirmation, and the playground that runs it.",{"id":124,"title":36,"body":125,"description":37,"extension":2159,"group":21,"meta":2160,"navigation":218,"order":314,"path":35,"seo":2161,"stem":2162,"__hash__":2163},"docs\u002Fdocs\u002Fpresets.md",{"type":126,"value":127,"toc":2149},"minimark",[128,132,149,154,1276,1379,1382,1392,1416,1419,1423,1442,1455,1459,1465,1706,1726,1730,1733,1850,1853,1900,1912,1915,1918,2107,2116,2120,2128,2132,2145],[129,130,36],"h1",{"id":131},"presets",[133,134,135,136,140,141,144,145,148],"p",{},"A ",[137,138,139],"strong",{},"preset set"," holds named configurations that subjects follow: the plans\nworkspaces are on, configurations for a daily and a weekly job, limits for a\ntier. Each preset has the same fields, declared once, and each fills a\n",[137,142,143],{},"slot",". Every slot has exactly one ",[137,146,147],{},"default",". A subject follows the\ndefault for a slot, or is assigned a preset by its key, never given a copy.\nEdit a preset and everyone who follows it gets the change.",[150,151,153],"h2",{"id":152},"declaring-a-preset-set","Declaring a preset set",[155,156,161],"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-ts shiki shiki-themes tunables-panel-light tunables-panel-light tunables-panel-dark","import { createTunables, definePresets, number, pick } from 'tunables'\n\nexport const plans = definePresets({\n  id: 'plans',\n  title: 'Plans',\n  singular: 'Plan',\n  description: 'What a workspace may hold and spend on each plan.',\n  place: { label: 'Admin › Plans', href: '\u002Fadmin\u002Fplans' },\n  slots: ['plan'],\n  fields: {\n    maxProjects: number({ label: 'Projects', unit: 'count', default: 3 }),\n    aiSuggestionsPerDay: number({ label: 'AI suggestions a day', unit: 'count', default: 5, min: 0 }),\n    aiCentsPerDay: number({ label: 'AI budget a day', unit: 'count', default: 10, min: 0 }),\n    suggestionModel: pick({ label: 'Suggestion model', catalog: 'models', default: 'small' })\n  },\n  rules: (values, catalogs) => {\n    const model = catalogs.entry('models', values.suggestionModel)\n    const cents = Number(model?.values.centsPerSuggestion ?? 0) * values.aiSuggestionsPerDay\n    return cents > values.aiCentsPerDay\n      ? [{ key: 'aiSuggestionsPerDay', message: `${values.aiSuggestionsPerDay} suggestions a day on ${String(model?.values.label)} cost ${cents} cents, above the AI budget of ${values.aiCentsPerDay}.` }]\n      : []\n  },\n  within: (values, settings) => {\n    const { projectCeiling } = settings.get('ceilings') as { projectCeiling: number }\n    return values.maxProjects > projectCeiling\n      ? [`its Projects, ${values.maxProjects}, is above the ceiling of ${projectCeiling}.`]\n      : []\n  },\n  seed: [\n    { key: 'free', slot: 'plan', label: 'Free' },\n    { key: 'pro', slot: 'plan', label: 'Pro', values: { maxProjects: 50, aiSuggestionsPerDay: 100, aiCentsPerDay: 500 } },\n    { key: 'team', slot: 'plan', label: 'Team', values: { maxProjects: 500, aiSuggestionsPerDay: 500, aiCentsPerDay: 2500, suggestionModel: 'large' } }\n  ]\n})\n\ncreateTunables({ store, groups, presets: [plans], catalogs: [models] })\n","ts","",[162,163,164,213,220,241,261,278,295,312,351,372,383,434,490,544,598,604,631,674,719,737,834,843,848,871,919,936,976,983,988,999,1044,1126,1216,1222,1228,1233],"code",{"__ignoreMap":160},[165,166,169,173,177,181,184,187,189,192,194,197,200,203,206,210],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"sZ4mS","import",[165,174,176],{"class":175},"sp9ci"," {",[165,178,180],{"class":179},"sVz71"," createTunables",[165,182,183],{"class":175},",",[165,185,186],{"class":179}," definePresets",[165,188,183],{"class":175},[165,190,191],{"class":179}," number",[165,193,183],{"class":175},[165,195,196],{"class":179}," pick ",[165,198,199],{"class":175},"}",[165,201,202],{"class":171}," from",[165,204,205],{"class":175}," '",[165,207,209],{"class":208},"sjCzm","tunables",[165,211,212],{"class":175},"'\n",[165,214,216],{"class":167,"line":215},2,[165,217,219],{"emptyLinePlaceholder":218},true,"\n",[165,221,223,226,229,232,235,238],{"class":167,"line":222},3,[165,224,225],{"class":171},"export",[165,227,228],{"class":171}," const",[165,230,231],{"class":179}," plans ",[165,233,234],{"class":175},"=",[165,236,186],{"class":237},"sOThN",[165,239,240],{"class":175},"({\n",[165,242,244,247,250,252,255,258],{"class":167,"line":243},4,[165,245,246],{"class":179},"  id",[165,248,249],{"class":175},":",[165,251,205],{"class":175},[165,253,254],{"class":208},"plans",[165,256,257],{"class":175},"'",[165,259,260],{"class":175},",\n",[165,262,264,267,269,271,274,276],{"class":167,"line":263},5,[165,265,266],{"class":179},"  title",[165,268,249],{"class":175},[165,270,205],{"class":175},[165,272,273],{"class":208},"Plans",[165,275,257],{"class":175},[165,277,260],{"class":175},[165,279,281,284,286,288,291,293],{"class":167,"line":280},6,[165,282,283],{"class":179},"  singular",[165,285,249],{"class":175},[165,287,205],{"class":175},[165,289,290],{"class":208},"Plan",[165,292,257],{"class":175},[165,294,260],{"class":175},[165,296,298,301,303,305,308,310],{"class":167,"line":297},7,[165,299,300],{"class":179},"  description",[165,302,249],{"class":175},[165,304,205],{"class":175},[165,306,307],{"class":208},"What a workspace may hold and spend on each plan.",[165,309,257],{"class":175},[165,311,260],{"class":175},[165,313,315,318,320,322,325,327,329,332,334,336,339,341,343,346,348],{"class":167,"line":314},8,[165,316,317],{"class":179},"  place",[165,319,249],{"class":175},[165,321,176],{"class":175},[165,323,324],{"class":179}," label",[165,326,249],{"class":175},[165,328,205],{"class":175},[165,330,331],{"class":208},"Admin › Plans",[165,333,257],{"class":175},[165,335,183],{"class":175},[165,337,338],{"class":179}," href",[165,340,249],{"class":175},[165,342,205],{"class":175},[165,344,345],{"class":208},"\u002Fadmin\u002Fplans",[165,347,257],{"class":175},[165,349,350],{"class":175}," },\n",[165,352,354,357,359,362,364,367,369],{"class":167,"line":353},9,[165,355,356],{"class":179},"  slots",[165,358,249],{"class":175},[165,360,361],{"class":175}," [",[165,363,257],{"class":175},[165,365,366],{"class":208},"plan",[165,368,257],{"class":175},[165,370,371],{"class":175},"],\n",[165,373,375,378,380],{"class":167,"line":374},10,[165,376,377],{"class":179},"  fields",[165,379,249],{"class":175},[165,381,382],{"class":175}," {\n",[165,384,386,389,391,393,396,398,400,402,405,407,409,412,414,416,419,421,423,426,428,431],{"class":167,"line":385},11,[165,387,388],{"class":179},"    maxProjects",[165,390,249],{"class":175},[165,392,191],{"class":237},[165,394,395],{"class":175},"({",[165,397,324],{"class":179},[165,399,249],{"class":175},[165,401,205],{"class":175},[165,403,404],{"class":208},"Projects",[165,406,257],{"class":175},[165,408,183],{"class":175},[165,410,411],{"class":179}," unit",[165,413,249],{"class":175},[165,415,205],{"class":175},[165,417,418],{"class":208},"count",[165,420,257],{"class":175},[165,422,183],{"class":175},[165,424,425],{"class":179}," default",[165,427,249],{"class":175},[165,429,430],{"class":208}," 3",[165,432,433],{"class":175}," }),\n",[165,435,437,440,442,444,446,448,450,452,455,457,459,461,463,465,467,469,471,473,475,478,480,483,485,488],{"class":167,"line":436},12,[165,438,439],{"class":179},"    aiSuggestionsPerDay",[165,441,249],{"class":175},[165,443,191],{"class":237},[165,445,395],{"class":175},[165,447,324],{"class":179},[165,449,249],{"class":175},[165,451,205],{"class":175},[165,453,454],{"class":208},"AI suggestions a day",[165,456,257],{"class":175},[165,458,183],{"class":175},[165,460,411],{"class":179},[165,462,249],{"class":175},[165,464,205],{"class":175},[165,466,418],{"class":208},[165,468,257],{"class":175},[165,470,183],{"class":175},[165,472,425],{"class":179},[165,474,249],{"class":175},[165,476,477],{"class":208}," 5",[165,479,183],{"class":175},[165,481,482],{"class":179}," min",[165,484,249],{"class":175},[165,486,487],{"class":208}," 0",[165,489,433],{"class":175},[165,491,493,496,498,500,502,504,506,508,511,513,515,517,519,521,523,525,527,529,531,534,536,538,540,542],{"class":167,"line":492},13,[165,494,495],{"class":179},"    aiCentsPerDay",[165,497,249],{"class":175},[165,499,191],{"class":237},[165,501,395],{"class":175},[165,503,324],{"class":179},[165,505,249],{"class":175},[165,507,205],{"class":175},[165,509,510],{"class":208},"AI budget a day",[165,512,257],{"class":175},[165,514,183],{"class":175},[165,516,411],{"class":179},[165,518,249],{"class":175},[165,520,205],{"class":175},[165,522,418],{"class":208},[165,524,257],{"class":175},[165,526,183],{"class":175},[165,528,425],{"class":179},[165,530,249],{"class":175},[165,532,533],{"class":208}," 10",[165,535,183],{"class":175},[165,537,482],{"class":179},[165,539,249],{"class":175},[165,541,487],{"class":208},[165,543,433],{"class":175},[165,545,547,550,552,555,557,559,561,563,566,568,570,573,575,577,580,582,584,586,588,590,593,595],{"class":167,"line":546},14,[165,548,549],{"class":179},"    suggestionModel",[165,551,249],{"class":175},[165,553,554],{"class":237}," pick",[165,556,395],{"class":175},[165,558,324],{"class":179},[165,560,249],{"class":175},[165,562,205],{"class":175},[165,564,565],{"class":208},"Suggestion model",[165,567,257],{"class":175},[165,569,183],{"class":175},[165,571,572],{"class":179}," catalog",[165,574,249],{"class":175},[165,576,205],{"class":175},[165,578,579],{"class":208},"models",[165,581,257],{"class":175},[165,583,183],{"class":175},[165,585,425],{"class":179},[165,587,249],{"class":175},[165,589,205],{"class":175},[165,591,592],{"class":208},"small",[165,594,257],{"class":175},[165,596,597],{"class":175}," })\n",[165,599,601],{"class":167,"line":600},15,[165,602,603],{"class":175},"  },\n",[165,605,607,610,612,615,618,620,623,626,629],{"class":167,"line":606},16,[165,608,609],{"class":237},"  rules",[165,611,249],{"class":175},[165,613,614],{"class":175}," (",[165,616,617],{"class":179},"values",[165,619,183],{"class":175},[165,621,622],{"class":179}," catalogs",[165,624,625],{"class":175},")",[165,627,628],{"class":171}," =>",[165,630,382],{"class":175},[165,632,634,637,640,642,645,649,652,655,657,659,661,663,666,668,671],{"class":167,"line":633},17,[165,635,636],{"class":171},"    const",[165,638,639],{"class":179}," model ",[165,641,234],{"class":175},[165,643,622],{"class":644},"sq0K3",[165,646,648],{"class":647},"sBd0f",".",[165,650,651],{"class":237},"entry",[165,653,654],{"class":175},"(",[165,656,257],{"class":175},[165,658,579],{"class":208},[165,660,257],{"class":175},[165,662,183],{"class":175},[165,664,665],{"class":179}," values",[165,667,648],{"class":175},[165,669,670],{"class":179},"suggestionModel",[165,672,673],{"class":175},")\n",[165,675,677,679,682,684,687,689,692,695,697,699,702,705,707,709,712,714,716],{"class":167,"line":676},18,[165,678,636],{"class":171},[165,680,681],{"class":179}," cents ",[165,683,234],{"class":175},[165,685,686],{"class":237}," Number",[165,688,654],{"class":175},[165,690,691],{"class":179},"model",[165,693,694],{"class":175},"?.",[165,696,617],{"class":179},[165,698,648],{"class":175},[165,700,701],{"class":179},"centsPerSuggestion ",[165,703,704],{"class":175},"??",[165,706,487],{"class":208},[165,708,625],{"class":175},[165,710,711],{"class":175}," *",[165,713,665],{"class":179},[165,715,648],{"class":175},[165,717,718],{"class":179},"aiSuggestionsPerDay\n",[165,720,722,725,727,730,732,734],{"class":167,"line":721},19,[165,723,724],{"class":171},"    return",[165,726,681],{"class":179},[165,728,729],{"class":175},">",[165,731,665],{"class":179},[165,733,648],{"class":175},[165,735,736],{"class":179},"aiCentsPerDay\n",[165,738,740,743,746,749,751,753,756,758,760,763,765,768,770,772,774,776,779,782,785,787,789,791,793,795,798,800,802,805,807,810,812,815,817,819,821,824,826,828,831],{"class":167,"line":739},20,[165,741,742],{"class":175},"      ?",[165,744,745],{"class":175}," [{",[165,747,748],{"class":179}," key",[165,750,249],{"class":175},[165,752,205],{"class":175},[165,754,755],{"class":208},"aiSuggestionsPerDay",[165,757,257],{"class":175},[165,759,183],{"class":175},[165,761,762],{"class":179}," message",[165,764,249],{"class":175},[165,766,767],{"class":175}," `${",[165,769,617],{"class":179},[165,771,648],{"class":175},[165,773,755],{"class":179},[165,775,199],{"class":175},[165,777,778],{"class":208}," suggestions a day on ",[165,780,781],{"class":175},"${",[165,783,784],{"class":237},"String",[165,786,654],{"class":175},[165,788,691],{"class":179},[165,790,694],{"class":175},[165,792,617],{"class":179},[165,794,648],{"class":175},[165,796,797],{"class":179},"label",[165,799,625],{"class":175},[165,801,199],{"class":175},[165,803,804],{"class":208}," cost ",[165,806,781],{"class":175},[165,808,809],{"class":179},"cents",[165,811,199],{"class":175},[165,813,814],{"class":208}," cents, above the AI budget of ",[165,816,781],{"class":175},[165,818,617],{"class":179},[165,820,648],{"class":175},[165,822,823],{"class":179},"aiCentsPerDay",[165,825,199],{"class":175},[165,827,648],{"class":208},[165,829,830],{"class":175},"`",[165,832,833],{"class":175}," }]\n",[165,835,837,840],{"class":167,"line":836},21,[165,838,839],{"class":175},"      :",[165,841,842],{"class":175}," []\n",[165,844,846],{"class":167,"line":845},22,[165,847,603],{"class":175},[165,849,851,854,856,858,860,862,865,867,869],{"class":167,"line":850},23,[165,852,853],{"class":237},"  within",[165,855,249],{"class":175},[165,857,614],{"class":175},[165,859,617],{"class":179},[165,861,183],{"class":175},[165,863,864],{"class":179}," settings",[165,866,625],{"class":175},[165,868,628],{"class":171},[165,870,382],{"class":175},[165,872,874,876,878,881,883,886,888,890,893,895,897,900,902,904,907,909,912,914,916],{"class":167,"line":873},24,[165,875,636],{"class":171},[165,877,176],{"class":175},[165,879,880],{"class":179}," projectCeiling ",[165,882,199],{"class":175},[165,884,885],{"class":175}," =",[165,887,864],{"class":644},[165,889,648],{"class":647},[165,891,892],{"class":237},"get",[165,894,654],{"class":175},[165,896,257],{"class":175},[165,898,899],{"class":208},"ceilings",[165,901,257],{"class":175},[165,903,625],{"class":175},[165,905,906],{"class":171}," as",[165,908,176],{"class":175},[165,910,911],{"class":179}," projectCeiling",[165,913,249],{"class":175},[165,915,191],{"class":237},[165,917,918],{"class":175}," }\n",[165,920,922,924,926,928,931,933],{"class":167,"line":921},25,[165,923,724],{"class":171},[165,925,665],{"class":179},[165,927,648],{"class":175},[165,929,930],{"class":179},"maxProjects ",[165,932,729],{"class":175},[165,934,935],{"class":179}," projectCeiling\n",[165,937,939,941,943,945,948,950,952,954,957,959,962,964,967,969,971,973],{"class":167,"line":938},26,[165,940,742],{"class":175},[165,942,361],{"class":175},[165,944,830],{"class":175},[165,946,947],{"class":208},"its Projects, ",[165,949,781],{"class":175},[165,951,617],{"class":179},[165,953,648],{"class":175},[165,955,956],{"class":179},"maxProjects",[165,958,199],{"class":175},[165,960,961],{"class":208},", is above the ceiling of ",[165,963,781],{"class":175},[165,965,966],{"class":179},"projectCeiling",[165,968,199],{"class":175},[165,970,648],{"class":208},[165,972,830],{"class":175},[165,974,975],{"class":175},"]\n",[165,977,979,981],{"class":167,"line":978},27,[165,980,839],{"class":175},[165,982,842],{"class":175},[165,984,986],{"class":167,"line":985},28,[165,987,603],{"class":175},[165,989,991,994,996],{"class":167,"line":990},29,[165,992,993],{"class":179},"  seed",[165,995,249],{"class":175},[165,997,998],{"class":175}," [\n",[165,1000,1002,1005,1007,1009,1011,1014,1016,1018,1021,1023,1025,1027,1029,1031,1033,1035,1037,1040,1042],{"class":167,"line":1001},30,[165,1003,1004],{"class":175},"    {",[165,1006,748],{"class":179},[165,1008,249],{"class":175},[165,1010,205],{"class":175},[165,1012,1013],{"class":208},"free",[165,1015,257],{"class":175},[165,1017,183],{"class":175},[165,1019,1020],{"class":179}," slot",[165,1022,249],{"class":175},[165,1024,205],{"class":175},[165,1026,366],{"class":208},[165,1028,257],{"class":175},[165,1030,183],{"class":175},[165,1032,324],{"class":179},[165,1034,249],{"class":175},[165,1036,205],{"class":175},[165,1038,1039],{"class":208},"Free",[165,1041,257],{"class":175},[165,1043,350],{"class":175},[165,1045,1047,1049,1051,1053,1055,1058,1060,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1083,1085,1087,1089,1091,1093,1096,1098,1101,1103,1106,1108,1111,1113,1116,1118,1121,1124],{"class":167,"line":1046},31,[165,1048,1004],{"class":175},[165,1050,748],{"class":179},[165,1052,249],{"class":175},[165,1054,205],{"class":175},[165,1056,1057],{"class":208},"pro",[165,1059,257],{"class":175},[165,1061,183],{"class":175},[165,1063,1020],{"class":179},[165,1065,249],{"class":175},[165,1067,205],{"class":175},[165,1069,366],{"class":208},[165,1071,257],{"class":175},[165,1073,183],{"class":175},[165,1075,324],{"class":179},[165,1077,249],{"class":175},[165,1079,205],{"class":175},[165,1081,1082],{"class":208},"Pro",[165,1084,257],{"class":175},[165,1086,183],{"class":175},[165,1088,665],{"class":179},[165,1090,249],{"class":175},[165,1092,176],{"class":175},[165,1094,1095],{"class":179}," maxProjects",[165,1097,249],{"class":175},[165,1099,1100],{"class":208}," 50",[165,1102,183],{"class":175},[165,1104,1105],{"class":179}," aiSuggestionsPerDay",[165,1107,249],{"class":175},[165,1109,1110],{"class":208}," 100",[165,1112,183],{"class":175},[165,1114,1115],{"class":179}," aiCentsPerDay",[165,1117,249],{"class":175},[165,1119,1120],{"class":208}," 500",[165,1122,1123],{"class":175}," }",[165,1125,350],{"class":175},[165,1127,1129,1131,1133,1135,1137,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1198,1200,1203,1205,1207,1210,1212,1214],{"class":167,"line":1128},32,[165,1130,1004],{"class":175},[165,1132,748],{"class":179},[165,1134,249],{"class":175},[165,1136,205],{"class":175},[165,1138,1139],{"class":208},"team",[165,1141,257],{"class":175},[165,1143,183],{"class":175},[165,1145,1020],{"class":179},[165,1147,249],{"class":175},[165,1149,205],{"class":175},[165,1151,366],{"class":208},[165,1153,257],{"class":175},[165,1155,183],{"class":175},[165,1157,324],{"class":179},[165,1159,249],{"class":175},[165,1161,205],{"class":175},[165,1163,1164],{"class":208},"Team",[165,1166,257],{"class":175},[165,1168,183],{"class":175},[165,1170,665],{"class":179},[165,1172,249],{"class":175},[165,1174,176],{"class":175},[165,1176,1095],{"class":179},[165,1178,249],{"class":175},[165,1180,1120],{"class":208},[165,1182,183],{"class":175},[165,1184,1105],{"class":179},[165,1186,249],{"class":175},[165,1188,1120],{"class":208},[165,1190,183],{"class":175},[165,1192,1115],{"class":179},[165,1194,249],{"class":175},[165,1196,1197],{"class":208}," 2500",[165,1199,183],{"class":175},[165,1201,1202],{"class":179}," suggestionModel",[165,1204,249],{"class":175},[165,1206,205],{"class":175},[165,1208,1209],{"class":208},"large",[165,1211,257],{"class":175},[165,1213,1123],{"class":175},[165,1215,918],{"class":175},[165,1217,1219],{"class":167,"line":1218},33,[165,1220,1221],{"class":175},"  ]\n",[165,1223,1225],{"class":167,"line":1224},34,[165,1226,1227],{"class":175},"})\n",[165,1229,1231],{"class":167,"line":1230},35,[165,1232,219],{"emptyLinePlaceholder":218},[165,1234,1236,1239,1241,1244,1246,1249,1251,1254,1256,1258,1260,1263,1265,1267,1269,1271,1274],{"class":167,"line":1235},36,[165,1237,1238],{"class":237},"createTunables",[165,1240,395],{"class":175},[165,1242,1243],{"class":179}," store",[165,1245,183],{"class":175},[165,1247,1248],{"class":179}," groups",[165,1250,183],{"class":175},[165,1252,1253],{"class":179}," presets",[165,1255,249],{"class":175},[165,1257,361],{"class":175},[165,1259,254],{"class":179},[165,1261,1262],{"class":175},"],",[165,1264,622],{"class":179},[165,1266,249],{"class":175},[165,1268,361],{"class":175},[165,1270,579],{"class":179},[165,1272,1273],{"class":175},"]",[165,1275,597],{"class":175},[1277,1278,1279,1292],"table",{},[1280,1281,1282],"thead",{},[1283,1284,1285,1289],"tr",{},[1286,1287,1288],"th",{},"Option",[1286,1290,1291],{},"What it is",[1293,1294,1295,1310,1320,1330,1340,1350,1365],"tbody",{},[1283,1296,1297,1307],{},[1298,1299,1300,1303,1304],"td",{},[162,1301,1302],{},"title",", ",[162,1305,1306],{},"singular",[1298,1308,1309],{},"The set and one of them: \"Plans\", \"Plan\".",[1283,1311,1312,1317],{},[1298,1313,1314],{},[162,1315,1316],{},"slots",[1298,1318,1319],{},"What a preset fills. Each slot has exactly one default.",[1283,1321,1322,1327],{},[1298,1323,1324],{},[162,1325,1326],{},"fields",[1298,1328,1329],{},"Each preset's fields, declared like a group's.",[1283,1331,1332,1337],{},[1298,1333,1334],{},[162,1335,1336],{},"rules",[1298,1338,1339],{},"Checks between one preset's fields, or against a catalog entry it picks.",[1283,1341,1342,1347],{},[1298,1343,1344],{},[162,1345,1346],{},"within",[1298,1348,1349],{},"How the settings bound a preset.",[1283,1351,1352,1357],{},[1298,1353,1354],{},[162,1355,1356],{},"layer",[1298,1358,1359,1360,648],{},"Makes the set a layer of a group at a scope, so a workspace reads its plan's values. See ",[1361,1362,1364],"a",{"href":1363},"#plans-as-a-layer","Plans as a layer",[1283,1366,1367,1372],{},[1298,1368,1369],{},[162,1370,1371],{},"seed",[1298,1373,1374,1375,1378],{},"The presets ",[162,1376,1377],{},"sync"," creates for a slot that has no default.",[150,1380,1381],{"id":1346},"Within",[133,1383,1384,1387,1388,1391],{},[162,1385,1386],{},"within(values, settings)"," reads the settings through ",[162,1389,1390],{},"settings.get(groupId)",",\nas they would be after the change being checked, and returns its problems. It\nruns in two places:",[1393,1394,1395,1402],"ul",{},[1396,1397,1398,1401],"li",{},[137,1399,1400],{},"When a preset is saved."," A preset above a limit cannot be created or\nedited.",[1396,1403,1404,1407,1408],{},[137,1405,1406],{},"When any group is saved",", against every stored preset. Lowering a limit\nbelow a preset is refused, and each problem names the preset in front of\nyour sentence:",[155,1409,1414],{"className":1410,"code":1412,"language":1413},[1411],"language-text","Plan \"Team\": its Projects, 500, is above the ceiling of 400.\n","text",[162,1415,1412],{"__ignoreMap":160},[133,1417,1418],{},"To lower the limit, first edit or remove the preset in the way. A limit never\ndrops below what uses it.",[150,1420,1422],{"id":1421},"rules-and-catalogs","Rules and catalogs",[133,1424,1425,1426,1429,1430,1434,1435,1438,1439,1441],{},"A preset's ",[162,1427,1428],{},"rules(values, catalogs)"," checks its own fields together, and can\nread the ",[1361,1431,1433],{"href":1432},".\u002Fcatalogs","catalog"," entries it picks through\n",[162,1436,1437],{},"catalogs.entry(catalogId, entryId)",", as they would be after the change. The\n",[162,1440,1336],{}," above refuse more suggestions a day than the plan's AI budget pays\nfor on the model it picks, beside the AI suggestions field.",[133,1443,1444,1445,1447,1448,1451,1452,1454],{},"Before ",[162,1446,1336],{}," runs, every ",[162,1449,1450],{},"pick"," is checked: it must name an entry of its\ncatalog, and that entry must be Available, unless the preset already picked it\nbefore this change. Editing a catalog entry runs every preset's ",[162,1453,1336],{}," again,\nso an entry cannot change under a preset in a way that preset would refuse.",[150,1456,1458],{"id":1457},"working-with-presets","Working with presets",[133,1460,1461,1464],{},[162,1462,1463],{},"tunables.presets(id)"," returns the set's operations. Each change is checked,\nlocked and recorded as a revision, like a group save.",[155,1466,1468],{"className":157,"code":1467,"language":159,"meta":160,"style":160},"const plans = tunables.presets('plans')\n\nawait plans.create({ key: 'starter', slot: 'plan', label: 'Starter', values: { maxProjects: 10 } }, { actor })\nawait plans.update('starter', { values: { aiSuggestionsPerDay: 20 } }, { actor, reason: 'Launch offer' })\nawait plans.makeDefault('starter', { actor })\nawait plans.remove('free', { actor })\nawait plans.list()\n",[162,1469,1470,1496,1500,1577,1638,1665,1692],{"__ignoreMap":160},[165,1471,1472,1475,1477,1479,1482,1484,1486,1488,1490,1492,1494],{"class":167,"line":168},[165,1473,1474],{"class":171},"const",[165,1476,231],{"class":179},[165,1478,234],{"class":175},[165,1480,1481],{"class":644}," tunables",[165,1483,648],{"class":647},[165,1485,131],{"class":237},[165,1487,654],{"class":175},[165,1489,257],{"class":175},[165,1491,254],{"class":208},[165,1493,257],{"class":175},[165,1495,673],{"class":175},[165,1497,1498],{"class":167,"line":215},[165,1499,219],{"emptyLinePlaceholder":218},[165,1501,1502,1505,1508,1510,1513,1515,1517,1519,1521,1524,1526,1528,1530,1532,1534,1536,1538,1540,1542,1544,1546,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1570,1572,1575],{"class":167,"line":222},[165,1503,1504],{"class":171},"await",[165,1506,1507],{"class":644}," plans",[165,1509,648],{"class":647},[165,1511,1512],{"class":237},"create",[165,1514,395],{"class":175},[165,1516,748],{"class":179},[165,1518,249],{"class":175},[165,1520,205],{"class":175},[165,1522,1523],{"class":208},"starter",[165,1525,257],{"class":175},[165,1527,183],{"class":175},[165,1529,1020],{"class":179},[165,1531,249],{"class":175},[165,1533,205],{"class":175},[165,1535,366],{"class":208},[165,1537,257],{"class":175},[165,1539,183],{"class":175},[165,1541,324],{"class":179},[165,1543,249],{"class":175},[165,1545,205],{"class":175},[165,1547,1548],{"class":208},"Starter",[165,1550,257],{"class":175},[165,1552,183],{"class":175},[165,1554,665],{"class":179},[165,1556,249],{"class":175},[165,1558,176],{"class":175},[165,1560,1095],{"class":179},[165,1562,249],{"class":175},[165,1564,533],{"class":208},[165,1566,1123],{"class":175},[165,1568,1569],{"class":175}," },",[165,1571,176],{"class":175},[165,1573,1574],{"class":179}," actor ",[165,1576,1227],{"class":175},[165,1578,1579,1581,1583,1585,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,1613,1615,1617,1619,1622,1624,1627,1629,1631,1634,1636],{"class":167,"line":243},[165,1580,1504],{"class":171},[165,1582,1507],{"class":644},[165,1584,648],{"class":647},[165,1586,1587],{"class":237},"update",[165,1589,654],{"class":175},[165,1591,257],{"class":175},[165,1593,1523],{"class":208},[165,1595,257],{"class":175},[165,1597,183],{"class":175},[165,1599,176],{"class":175},[165,1601,665],{"class":179},[165,1603,249],{"class":175},[165,1605,176],{"class":175},[165,1607,1105],{"class":179},[165,1609,249],{"class":175},[165,1611,1612],{"class":208}," 20",[165,1614,1123],{"class":175},[165,1616,1569],{"class":175},[165,1618,176],{"class":175},[165,1620,1621],{"class":179}," actor",[165,1623,183],{"class":175},[165,1625,1626],{"class":179}," reason",[165,1628,249],{"class":175},[165,1630,205],{"class":175},[165,1632,1633],{"class":208},"Launch offer",[165,1635,257],{"class":175},[165,1637,597],{"class":175},[165,1639,1640,1642,1644,1646,1649,1651,1653,1655,1657,1659,1661,1663],{"class":167,"line":263},[165,1641,1504],{"class":171},[165,1643,1507],{"class":644},[165,1645,648],{"class":647},[165,1647,1648],{"class":237},"makeDefault",[165,1650,654],{"class":175},[165,1652,257],{"class":175},[165,1654,1523],{"class":208},[165,1656,257],{"class":175},[165,1658,183],{"class":175},[165,1660,176],{"class":175},[165,1662,1574],{"class":179},[165,1664,1227],{"class":175},[165,1666,1667,1669,1671,1673,1676,1678,1680,1682,1684,1686,1688,1690],{"class":167,"line":280},[165,1668,1504],{"class":171},[165,1670,1507],{"class":644},[165,1672,648],{"class":647},[165,1674,1675],{"class":237},"remove",[165,1677,654],{"class":175},[165,1679,257],{"class":175},[165,1681,1013],{"class":208},[165,1683,257],{"class":175},[165,1685,183],{"class":175},[165,1687,176],{"class":175},[165,1689,1574],{"class":179},[165,1691,1227],{"class":175},[165,1693,1694,1696,1698,1700,1703],{"class":167,"line":297},[165,1695,1504],{"class":171},[165,1697,1507],{"class":644},[165,1699,648],{"class":647},[165,1701,1702],{"class":237},"list",[165,1704,1705],{"class":175},"()\n",[1393,1707,1708,1715,1718,1723],{},[1396,1709,1710,1711,1714],{},"A key is lowercase letters, digits and single hyphens, such as ",[162,1712,1713],{},"team-2026",",\nand never changes. The label can.",[1396,1716,1717],{},"A new preset starts from the field defaults, overlaid with the values you\ngive. The first preset in a slot becomes its default.",[1396,1719,1720,1722],{},[162,1721,1648],{}," moves the slot's default to this preset.",[1396,1724,1725],{},"The default of a slot cannot be removed; make another the default first.\nRemoving a preset returns every subject assigned to it to the default.",[150,1727,1729],{"id":1728},"assigning-by-reference","Assigning by reference",[133,1731,1732],{},"A subject is whatever your app assigns presets to: a workspace, an account, a\nperson. It is identified by your own id; tunables never stores anything else\nabout it.",[155,1734,1736],{"className":157,"code":1735,"language":159,"meta":160,"style":160},"await plans.assign('acme', 'plan', 'pro', { actor }) \u002F\u002F assign\nawait plans.assign('acme', 'plan', null, { actor }) \u002F\u002F follow the default again\nawait plans.assignments('acme')\n",[162,1737,1738,1787,1829],{"__ignoreMap":160},[165,1739,1740,1742,1744,1746,1749,1751,1753,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1783],{"class":167,"line":168},[165,1741,1504],{"class":171},[165,1743,1507],{"class":644},[165,1745,648],{"class":647},[165,1747,1748],{"class":237},"assign",[165,1750,654],{"class":175},[165,1752,257],{"class":175},[165,1754,1755],{"class":208},"acme",[165,1757,257],{"class":175},[165,1759,183],{"class":175},[165,1761,205],{"class":175},[165,1763,366],{"class":208},[165,1765,257],{"class":175},[165,1767,183],{"class":175},[165,1769,205],{"class":175},[165,1771,1057],{"class":208},[165,1773,257],{"class":175},[165,1775,183],{"class":175},[165,1777,176],{"class":175},[165,1779,1574],{"class":179},[165,1781,1782],{"class":175},"})",[165,1784,1786],{"class":1785},"sKllz"," \u002F\u002F assign\n",[165,1788,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1818,1820,1822,1824,1826],{"class":167,"line":215},[165,1790,1504],{"class":171},[165,1792,1507],{"class":644},[165,1794,648],{"class":647},[165,1796,1748],{"class":237},[165,1798,654],{"class":175},[165,1800,257],{"class":175},[165,1802,1755],{"class":208},[165,1804,257],{"class":175},[165,1806,183],{"class":175},[165,1808,205],{"class":175},[165,1810,366],{"class":208},[165,1812,257],{"class":175},[165,1814,183],{"class":175},[165,1816,1817],{"class":171}," null",[165,1819,183],{"class":175},[165,1821,176],{"class":175},[165,1823,1574],{"class":179},[165,1825,1782],{"class":175},[165,1827,1828],{"class":1785}," \u002F\u002F follow the default again\n",[165,1830,1831,1833,1835,1837,1840,1842,1844,1846,1848],{"class":167,"line":222},[165,1832,1504],{"class":171},[165,1834,1507],{"class":644},[165,1836,648],{"class":647},[165,1838,1839],{"class":237},"assignments",[165,1841,654],{"class":175},[165,1843,257],{"class":175},[165,1845,1755],{"class":208},[165,1847,257],{"class":175},[165,1849,673],{"class":175},[133,1851,1852],{},"When work runs, resolve the preset for the subject and slot, and keep its key\nwith what it produced:",[155,1854,1856],{"className":157,"code":1855,"language":159,"meta":160,"style":160},"const plan = await plans.resolve('acme', 'plan')\n\u002F\u002F { key: 'pro', label: 'Pro', assigned: true, values: { … }, resolvedAt: '…' }\n",[162,1857,1858,1895],{"__ignoreMap":160},[165,1859,1860,1862,1865,1867,1870,1872,1874,1877,1879,1881,1883,1885,1887,1889,1891,1893],{"class":167,"line":168},[165,1861,1474],{"class":171},[165,1863,1864],{"class":179}," plan ",[165,1866,234],{"class":175},[165,1868,1869],{"class":171}," await",[165,1871,1507],{"class":644},[165,1873,648],{"class":647},[165,1875,1876],{"class":237},"resolve",[165,1878,654],{"class":175},[165,1880,257],{"class":175},[165,1882,1755],{"class":208},[165,1884,257],{"class":175},[165,1886,183],{"class":175},[165,1888,205],{"class":175},[165,1890,366],{"class":208},[165,1892,257],{"class":175},[165,1894,673],{"class":175},[165,1896,1897],{"class":167,"line":215},[165,1898,1899],{"class":1785},"\u002F\u002F { key: 'pro', label: 'Pro', assigned: true, values: { … }, resolvedAt: '…' }\n",[133,1901,1902,1904,1905,1908,1909,1911],{},[162,1903,1876],{}," returns the subject's assignment, or the slot's default when there\nis none (",[162,1906,1907],{},"assigned: false","). Its ",[162,1910,617],{}," include defaults for fields the\npreset was stored without.",[150,1913,1364],{"id":1914},"plans-as-a-layer",[133,1916,1917],{},"A preset set can instead be read as a layer of a group, so code that reads the\ngroup at a workspace gets its plan's values without resolving anything:",[155,1919,1921],{"className":157,"code":1920,"language":159,"meta":160,"style":160},"definePresets({\n  id: 'plans',\n  slots: ['plan'],\n  layer: { group: 'limits', scope: 'workspace' },\n  fields: { maxProjects: number({ label: 'Projects', unit: 'count', default: 3 }) }\n  \u002F\u002F …\n})\n\nawait tunables.get('limits', { scope: { workspace: 'acme' } }) \u002F\u002F Pro's Projects, unless Acme sets its own\n",[162,1922,1923,1930,1944,1960,1997,2048,2053,2057,2061],{"__ignoreMap":160},[165,1924,1925,1928],{"class":167,"line":168},[165,1926,1927],{"class":237},"definePresets",[165,1929,240],{"class":175},[165,1931,1932,1934,1936,1938,1940,1942],{"class":167,"line":215},[165,1933,246],{"class":179},[165,1935,249],{"class":175},[165,1937,205],{"class":175},[165,1939,254],{"class":208},[165,1941,257],{"class":175},[165,1943,260],{"class":175},[165,1945,1946,1948,1950,1952,1954,1956,1958],{"class":167,"line":222},[165,1947,356],{"class":179},[165,1949,249],{"class":175},[165,1951,361],{"class":175},[165,1953,257],{"class":175},[165,1955,366],{"class":208},[165,1957,257],{"class":175},[165,1959,371],{"class":175},[165,1961,1962,1965,1967,1969,1972,1974,1976,1979,1981,1983,1986,1988,1990,1993,1995],{"class":167,"line":243},[165,1963,1964],{"class":179},"  layer",[165,1966,249],{"class":175},[165,1968,176],{"class":175},[165,1970,1971],{"class":179}," group",[165,1973,249],{"class":175},[165,1975,205],{"class":175},[165,1977,1978],{"class":208},"limits",[165,1980,257],{"class":175},[165,1982,183],{"class":175},[165,1984,1985],{"class":179}," scope",[165,1987,249],{"class":175},[165,1989,205],{"class":175},[165,1991,1992],{"class":208},"workspace",[165,1994,257],{"class":175},[165,1996,350],{"class":175},[165,1998,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2046],{"class":167,"line":263},[165,2000,377],{"class":179},[165,2002,249],{"class":175},[165,2004,176],{"class":175},[165,2006,1095],{"class":179},[165,2008,249],{"class":175},[165,2010,191],{"class":237},[165,2012,395],{"class":175},[165,2014,324],{"class":179},[165,2016,249],{"class":175},[165,2018,205],{"class":175},[165,2020,404],{"class":208},[165,2022,257],{"class":175},[165,2024,183],{"class":175},[165,2026,411],{"class":179},[165,2028,249],{"class":175},[165,2030,205],{"class":175},[165,2032,418],{"class":208},[165,2034,257],{"class":175},[165,2036,183],{"class":175},[165,2038,425],{"class":179},[165,2040,249],{"class":175},[165,2042,430],{"class":208},[165,2044,2045],{"class":175}," })",[165,2047,918],{"class":175},[165,2049,2050],{"class":167,"line":280},[165,2051,2052],{"class":1785},"  \u002F\u002F …\n",[165,2054,2055],{"class":167,"line":297},[165,2056,1227],{"class":175},[165,2058,2059],{"class":167,"line":314},[165,2060,219],{"emptyLinePlaceholder":218},[165,2062,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085,2087,2089,2092,2094,2096,2098,2100,2102,2104],{"class":167,"line":353},[165,2064,1504],{"class":171},[165,2066,1481],{"class":644},[165,2068,648],{"class":647},[165,2070,892],{"class":237},[165,2072,654],{"class":175},[165,2074,257],{"class":175},[165,2076,1978],{"class":208},[165,2078,257],{"class":175},[165,2080,183],{"class":175},[165,2082,176],{"class":175},[165,2084,1985],{"class":179},[165,2086,249],{"class":175},[165,2088,176],{"class":175},[165,2090,2091],{"class":179}," workspace",[165,2093,249],{"class":175},[165,2095,205],{"class":175},[165,2097,1755],{"class":208},[165,2099,257],{"class":175},[165,2101,1123],{"class":175},[165,2103,2045],{"class":175},[165,2105,2106],{"class":1785}," \u002F\u002F Pro's Projects, unless Acme sets its own\n",[133,2108,2109,2110,2112,2113,648],{},"The set's fields must be fields of the group, of the same kinds. The plan a\nworkspace is assigned in ",[162,2111,143],{}," (the first slot by default), or the slot's\ndefault, sits between the system values and the workspace's own. Editing a\nplan, or assigning another, is refused while a workspace's own value would end\nup outside its bound. See ",[1361,2114,40],{"href":2115},".\u002Fscopes#plans-as-a-layer",[150,2117,2119],{"id":2118},"seeding","Seeding",[133,2121,2122,2124,2125,2127],{},[162,2123,1377],{}," makes sure every slot has a default. For a slot without one, it creates\nthe presets ",[162,2126,1371],{}," lists for that slot (the first becomes the default), or,\nwithout a seed, one preset per slot keyed by the slot, labelled after it, at\nthe field defaults. A field newly declared on the set is added to every stored\npreset at its default, so a stored preset never lacks one.",[150,2129,2131],{"id":2130},"on-the-screens","On the screens",[133,2133,2134,2137,2138,2141,2142,648],{},[162,2135,2136],{},"TunablesPresets"," lists a set by slot, with each preset's default and how many\nare assigned it, and creates, edits, defaults and removes them.\n",[162,2139,2140],{},"TunablesAssign"," picks the preset one subject follows for one slot, such as a\nworkspace's plan. See\n",[1361,2143,69],{"href":2144},".\u002Fnuxt-layer",[2146,2147,2148],"style",{},"html pre.shiki code .sZ4mS, html code.shiki .sZ4mS{--shiki-light:#115E59;--shiki-default:#115E59;--shiki-dark:#5EEAD4}html pre.shiki code .sp9ci, html code.shiki .sp9ci{--shiki-light:#4F5D63;--shiki-default:#4F5D63;--shiki-dark:#A3AFB4}html pre.shiki code .sVz71, html code.shiki .sVz71{--shiki-light:#182025;--shiki-default:#182025;--shiki-dark:#E6EBEC}html pre.shiki code .sjCzm, html code.shiki .sjCzm{--shiki-light:#92400E;--shiki-default:#92400E;--shiki-dark:#FCD34D}html pre.shiki code .sOThN, html code.shiki .sOThN{--shiki-light:#2A3439;--shiki-light-font-weight:bold;--shiki-default:#2A3439;--shiki-default-font-weight:bold;--shiki-dark:#F6F8F8;--shiki-dark-font-weight:bold}html pre.shiki code .sq0K3, html code.shiki .sq0K3{--shiki-light:#182025;--shiki-light-font-weight:bold;--shiki-default:#182025;--shiki-default-font-weight:bold;--shiki-dark:#E6EBEC;--shiki-dark-font-weight:bold}html pre.shiki code .sBd0f, html code.shiki .sBd0f{--shiki-light:#4F5D63;--shiki-light-font-weight:bold;--shiki-default:#4F5D63;--shiki-default-font-weight:bold;--shiki-dark:#A3AFB4;--shiki-dark-font-weight:bold}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 .sKllz, html code.shiki .sKllz{--shiki-light:#4F5D63;--shiki-light-font-style:italic;--shiki-default:#4F5D63;--shiki-default-font-style:italic;--shiki-dark:#A3AFB4;--shiki-dark-font-style:italic}",{"title":160,"searchDepth":215,"depth":215,"links":2150},[2151,2152,2153,2154,2155,2156,2157,2158],{"id":152,"depth":215,"text":153},{"id":1346,"depth":215,"text":1381},{"id":1421,"depth":215,"text":1422},{"id":1457,"depth":215,"text":1458},{"id":1728,"depth":215,"text":1729},{"id":1914,"depth":215,"text":1364},{"id":2118,"depth":215,"text":2119},{"id":2130,"depth":215,"text":2131},"md",{},{"title":36,"description":37},"docs\u002Fpresets","I20E242q0NCi78JldIQweZEnvrmLRKH5s7b97n9HnyY",1792845119432]