[{"data":1,"prerenderedAt":354},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fskill-adopt":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":104,"body":125,"description":105,"extension":347,"group":101,"meta":348,"navigation":349,"order":350,"path":103,"seo":351,"stem":352,"__hash__":353},"docs\u002Fdocs\u002Fskill-adopt.md",{"type":126,"value":127,"toc":340},"minimark",[128,131,151,156,291,295,325,329,335],[129,130,104],"h1",{"id":104},[132,133,134,137,138,144,145,150],"p",{},[135,136,104],"code",{}," takes an app from values scattered through code, environment\nvariables and its own settings tables to one home per value. Use it once per\napp, when tunables is not yet a dependency. For one change in an app that\nalready uses tunables, use ",[139,140,142],"a",{"href":141},".\u002Fskill-define",[135,143,108],{},"; to audit an\nadoption, ",[139,146,148],{"href":147},".\u002Fskill-verify",[135,149,112],{},".",[152,153,155],"h2",{"id":154},"what-it-does","What it does",[157,158,159,175,181,200,210,216,245,263,281],"ol",{},[160,161,162,166,167,170,171,174],"li",{},[163,164,165],"strong",{},"Learns the situation."," It reads your agent instructions, ADRs and README,\nand learns your stack: the Postgres client (",[135,168,169],{},"pg",", ",[135,172,173],{},"postgres",", or Drizzle\nover one), the server, the UI, how sign-in works and who an administrator\nis, where migrations run, and how tests and screenshots work. It notes\nwhether a pdd-kit Product Model exists.",[160,176,177,180],{},[163,178,179],{},"Inventories every value."," Hard-coded limits, intervals, timeouts, sizes,\nretry counts, thresholds and budgets; every environment read; settings\ntables, files and their seeds; admin forms that edit them; feature switches;\nnamed configurations the app keeps several of, such as plans; and values\nkept per workspace or per person beside a global one, with the code that\npicks between them. For each, where it is\ndefined, every read, its value, any per-environment override, and what\ndepends on it.",[160,182,183,186,187,191,192,195,196,199],{},[163,184,185],{},"Classifies each into one home",": a setting in a group, a preset set, a\ncatalog, a deployment value, the app's own user data, or code. For a\nsetting a workspace or a person may set for themselves, it declares the\napp's ",[139,188,190],{"href":189},".\u002Fscopes","scopes"," and the field's ",[135,193,194],{},"override","; plans that set a\ngroup's values per workspace become a preset set that is a ",[135,197,198],{},"layer"," of it. When the\nevidence does not settle it, it asks you rather than guessing.",[160,201,202,205,206,209],{},[163,203,204],{},"Designs the definitions",": groups by what they govern and who tunes them,\neach field's kind, unit, default, bounds, section and effects, and the\nrules, guards, ",[135,207,208],{},"within"," checks and confirmations that keep lowering a limit\nfrom breaking anything.",[160,211,212,215],{},[163,213,214],{},"Proposes, and stops."," It presents the whole proposal, with every open\nquestion in one batch, and writes nothing until you explicitly approve.",[160,217,218,221,222,225,226,229,230,233,234,237,238,240,241,244],{},[163,219,220],{},"Wires it."," The dependency and its peers; the definitions module; your\napp's tunables over your own client, created so boot never connects; the\ntables; ",[135,223,224],{},"tunables.config.ts","; the API with ",[135,227,228],{},"actor"," and ",[135,231,232],{},"authorize"," from your\nown sign-in; the screens beside what each group affects, and All settings;\n",[135,235,236],{},"tunables sync"," in the deploy step; every read replaced, and every old\nconstant, default and fallback deleted as its read moves. With scopes,\n",[135,239,232],{}," lets an owner or a member change only their own ",[135,242,243],{},"target.scope",",\nand their own settings pages use the scoped form.",[160,246,247,250,251,254,255,258,259,262],{},[163,248,249],{},"Moves existing values across."," In each environment it can reach, ",[135,252,253],{},"sync","\nseeds the defaults, then ",[135,256,257],{},"tunables set … --reason \"Moved from \u003Cold home>\"","\nrecords each value that differed, at its scope with ",[135,260,261],{},"--scope"," for a\nworkspace's or a person's own. For the rest, it hands you the exact\ncommands. Then it removes the old homes.",[160,264,265,268,269,272,273,276,277,280],{},[163,266,267],{},"Settles the Product Model",", when there is one: ",[135,270,271],{},"tunables model draft","\ndrafts the facts, ",[135,274,275],{},"\u002Fpdd-ideate"," decides them with you, and\n",[135,278,279],{},"tunables explain"," generates the explanations.",[160,282,283,286,287,290],{},[163,284,285],{},"Checks and reports",": ",[135,288,289],{},"tunables check",", your typecheck, lint and tests,\nand a report of what was adopted, what stayed in code and why, what moved,\nand what is still open.",[152,292,294],{"id":293},"what-it-never-does","What it never does",[296,297,298,301,304,307,313,322],"ul",{},[160,299,300],{},"write anything before you approve the proposal;",[160,302,303],{},"leave a value in two homes, or keep a fallback default at a read;",[160,305,306],{},"write tunables' tables with SQL, or move a value in without a revision;",[160,308,309,310,312],{},"make boot connect to the database, or run ",[135,311,253],{}," at boot;",[160,314,315,316,318,319,321],{},"ship a route without ",[135,317,232],{},", or an ",[135,320,232],{}," that allows everyone;",[160,323,324],{},"invent a stack your app does not already have.",[152,326,328],{"id":327},"ask-for-it","Ask for it",[330,331,332],"blockquote",{},[132,333,334],{},"Adopt tunables in this app.",[330,336,337],{},[132,338,339],{},"Move our hard-coded limits and the settings table into tunables.",{"title":341,"searchDepth":342,"depth":342,"links":343},"",2,[344,345,346],{"id":154,"depth":342,"text":155},{"id":293,"depth":342,"text":294},{"id":327,"depth":342,"text":328},"md",{},true,24,{"title":104,"description":105},"docs\u002Fskill-adopt","DljBZDJWDzGzj0G3px5iyAJWPfECCvw7GTwrfEabKR8",1792845119506]