[{"data":1,"prerenderedAt":4218},["ShallowReactive",2],{"navigation":3,"\u002Fservices\u002Fschema-update":927,"mdc-8bt02u-key":4178,"mdc--atieyc-key":4195},[4,40,114,446,474,498,596,903],{"title":5,"path":6,"stem":7,"children":8},"Architecture","\u002Farchitecture","architecture",[9,14,28,32,36],{"title":10,"path":6,"stem":11,"access":12,"icon":13},"Overview","architecture\u002Findex","public","i-lucide-network",{"title":10,"path":15,"stem":16,"children":17,"access":12,"icon":19},"\u002Farchitecture\u002Fkernel","architecture\u002F1.kernel\u002Findex",[18,20,24],{"title":10,"path":15,"stem":16,"access":12,"icon":19},"i-lucide-box",{"title":21,"path":22,"stem":23,"access":12},"Enclave","\u002Farchitecture\u002Fkernel\u002Fenclave","architecture\u002F1.kernel\u002Fenclave",{"title":25,"path":26,"stem":27,"access":12},"Forking the enclave","\u002Farchitecture\u002Fkernel\u002Fforking-the-enclave","architecture\u002F1.kernel\u002Fforking-the-enclave",{"title":29,"path":30,"stem":31,"access":12},"Ports","\u002Farchitecture\u002Fports","architecture\u002F2.ports",{"title":33,"path":34,"stem":35,"access":12},"Service layers","\u002Farchitecture\u002Fservice-layers","architecture\u002F3.service-layers",{"title":37,"path":38,"stem":39,"access":12},"Families","\u002Farchitecture\u002Ffamilies","architecture\u002F4.families",{"title":41,"path":42,"stem":43,"children":44},"Core","\u002Fcore","core",[45,47,50,53,56,88,97],{"title":10,"path":42,"stem":46,"access":12,"icon":19},"core\u002Findex",{"title":10,"path":48,"stem":49,"access":12},"\u002Fcore\u002F01-overview","core\u002F01-overview",{"title":10,"path":51,"stem":52,"access":12},"\u002Fcore\u002F05-stores","core\u002F05-stores",{"title":10,"path":54,"stem":55,"access":12},"\u002Fcore\u002F06-permissions-and-keyring","core\u002F06-permissions-and-keyring",{"title":10,"path":57,"stem":58,"children":59,"access":12},"\u002Fcore\u002Fnoydb","core\u002F2.noydb\u002Findex",[60,61,65,68,72,76,80,84],{"title":10,"path":57,"stem":58,"access":12},{"title":62,"path":63,"stem":64,"access":12},"Noydb","\u002Fcore\u002Fnoydb\u002Fmethods","core\u002F2.noydb\u002F1.methods",{"title":21,"path":66,"stem":67,"access":12},"\u002Fcore\u002Fnoydb\u002Fenclave","core\u002F2.noydb\u002F2.enclave",{"title":69,"path":70,"stem":71,"access":12},"Secret & keyring","\u002Fcore\u002Fnoydb\u002Fkeyring","core\u002F2.noydb\u002F3.keyring",{"title":73,"path":74,"stem":75,"access":12},"Authentication","\u002Fcore\u002Fnoydb\u002Fauthentication","core\u002F2.noydb\u002F4.authentication",{"title":77,"path":78,"stem":79,"access":12},"Auth recovery","\u002Fcore\u002Fnoydb\u002Frecovery","core\u002F2.noydb\u002F5.recovery",{"title":81,"path":82,"stem":83,"access":12},"Configuration","\u002Fcore\u002Fnoydb\u002Fconfiguration","core\u002F2.noydb\u002F6.configuration",{"title":85,"path":86,"stem":87,"access":12},"Strategies","\u002Fcore\u002Fnoydb\u002Fstrategies","core\u002F2.noydb\u002F7.strategies",{"title":10,"path":89,"stem":90,"children":91,"access":12},"\u002Fcore\u002Fvault","core\u002F3.vault\u002Findex",[92,93],{"title":10,"path":89,"stem":90,"access":12},{"title":94,"path":95,"stem":96,"access":12},"Vault","\u002Fcore\u002Fvault\u002Fmethods","core\u002F3.vault\u002F1.methods",{"title":10,"path":98,"stem":99,"children":100,"access":12},"\u002Fcore\u002Fcollection","core\u002F4.collection\u002Findex",[101,102,106,110],{"title":10,"path":98,"stem":99,"access":12},{"title":103,"path":104,"stem":105,"access":12},"Collection","\u002Fcore\u002Fcollection\u002Fmethods","core\u002F4.collection\u002F1.methods",{"title":107,"path":108,"stem":109,"access":12},"Querying","\u002Fcore\u002Fcollection\u002Fquerying","core\u002F4.collection\u002F2.querying",{"title":111,"path":112,"stem":113,"access":12},"Schema","\u002Fcore\u002Fcollection\u002Fschema","core\u002F4.collection\u002F3.schema",{"title":37,"path":115,"stem":116,"children":117},"\u002Ffamilies","families",[118,121,168,194,208,212,216,294,340],{"title":10,"path":115,"stem":119,"access":12,"icon":120},"families\u002Findex","i-lucide-plug",{"title":122,"path":123,"stem":124,"children":125,"access":12,"icon":127},"as-Exports","\u002Ffamilies\u002Fas","families\u002Fas\u002Findex",[126,128,132,136,140,144,148,152,156,160,164],{"title":122,"path":123,"stem":124,"access":12,"icon":127},"i-lucide-book-open",{"title":129,"path":130,"stem":131,"access":12},"aws-s3","\u002Ffamilies\u002Fas\u002Faws-s3","families\u002Fas\u002Faws-s3",{"title":133,"path":134,"stem":135,"access":12},"blob","\u002Ffamilies\u002Fas\u002Fblob","families\u002Fas\u002Fblob",{"title":137,"path":138,"stem":139,"access":12},"csv","\u002Ffamilies\u002Fas\u002Fcsv","families\u002Fas\u002Fcsv",{"title":141,"path":142,"stem":143,"access":12},"json","\u002Ffamilies\u002Fas\u002Fjson","families\u002Fas\u002Fjson",{"title":145,"path":146,"stem":147,"access":12},"ndjson","\u002Ffamilies\u002Fas\u002Fndjson","families\u002Fas\u002Fndjson",{"title":149,"path":150,"stem":151,"access":12},"noydb","\u002Ffamilies\u002Fas\u002Fnoydb","families\u002Fas\u002Fnoydb",{"title":153,"path":154,"stem":155,"access":12},"sql","\u002Ffamilies\u002Fas\u002Fsql","families\u002Fas\u002Fsql",{"title":157,"path":158,"stem":159,"access":12},"xlsx","\u002Ffamilies\u002Fas\u002Fxlsx","families\u002Fas\u002Fxlsx",{"title":161,"path":162,"stem":163,"access":12},"xml","\u002Ffamilies\u002Fas\u002Fxml","families\u002Fas\u002Fxml",{"title":165,"path":166,"stem":167,"access":12},"zip","\u002Ffamilies\u002Fas\u002Fzip","families\u002Fas\u002Fzip",{"title":169,"path":170,"stem":171,"children":172,"access":12,"icon":127},"at-Seals","\u002Ffamilies\u002Fat","families\u002Fat\u002Findex",[173,174,178,182,186,190],{"title":169,"path":170,"stem":171,"access":12,"icon":127},{"title":175,"path":176,"stem":177,"access":12},"aws-kms","\u002Ffamilies\u002Fat\u002Faws-kms","families\u002Fat\u002Faws-kms",{"title":179,"path":180,"stem":181,"access":12},"azure-keyvault","\u002Ffamilies\u002Fat\u002Fazure-keyvault","families\u002Fat\u002Fazure-keyvault",{"title":183,"path":184,"stem":185,"access":12},"env","\u002Ffamilies\u002Fat\u002Fenv","families\u002Fat\u002Fenv",{"title":187,"path":188,"stem":189,"access":12},"gcp-kms","\u002Ffamilies\u002Fat\u002Fgcp-kms","families\u002Fat\u002Fgcp-kms",{"title":191,"path":192,"stem":193,"access":12},"macos-keychain","\u002Ffamilies\u002Fat\u002Fmacos-keychain","families\u002Fat\u002Fmacos-keychain",{"title":195,"path":196,"stem":197,"children":198,"access":12,"icon":127},"by-Sessions","\u002Ffamilies\u002Fby","families\u002Fby\u002Findex",[199,200,204],{"title":195,"path":196,"stem":197,"access":12,"icon":127},{"title":201,"path":202,"stem":203,"access":12},"peer","\u002Ffamilies\u002Fby\u002Fpeer","families\u002Fby\u002Fpeer",{"title":205,"path":206,"stem":207,"access":12},"tabs","\u002Ffamilies\u002Fby\u002Ftabs","families\u002Fby\u002Ftabs",{"title":209,"path":210,"stem":211,"access":12},"Classifying a package","\u002Ffamilies\u002Fclassification","families\u002Fclassification",{"title":213,"path":214,"stem":215,"access":12},"Command-line tools","\u002Ffamilies\u002Fcli","families\u002Fcli",{"title":217,"path":218,"stem":219,"children":220,"access":12,"icon":127},"in-Frameworks","\u002Ffamilies\u002Fin","families\u002Fin\u002Findex",[221,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290],{"title":217,"path":218,"stem":219,"access":12,"icon":127},{"title":223,"path":224,"stem":225,"access":12},"ai","\u002Ffamilies\u002Fin\u002Fai","families\u002Fin\u002Fai",{"title":227,"path":228,"stem":229,"access":12},"devtools","\u002Ffamilies\u002Fin\u002Fdevtools","families\u002Fin\u002Fdevtools",{"title":231,"path":232,"stem":233,"access":12},"devtools-tui","\u002Ffamilies\u002Fin\u002Fdevtools-tui","families\u002Fin\u002Fdevtools-tui",{"title":235,"path":236,"stem":237,"access":12},"liff","\u002Ffamilies\u002Fin\u002Fliff","families\u002Fin\u002Fliff",{"title":239,"path":240,"stem":241,"access":12},"nextjs","\u002Ffamilies\u002Fin\u002Fnextjs","families\u002Fin\u002Fnextjs",{"title":243,"path":244,"stem":245,"access":12},"nuxt","\u002Ffamilies\u002Fin\u002Fnuxt","families\u002Fin\u002Fnuxt",{"title":247,"path":248,"stem":249,"access":12},"pinia","\u002Ffamilies\u002Fin\u002Fpinia","families\u002Fin\u002Fpinia",{"title":251,"path":252,"stem":253,"access":12},"pwa","\u002Ffamilies\u002Fin\u002Fpwa","families\u002Fin\u002Fpwa",{"title":255,"path":256,"stem":257,"access":12},"react","\u002Ffamilies\u002Fin\u002Freact","families\u002Fin\u002Freact",{"title":259,"path":260,"stem":261,"access":12},"relay","\u002Ffamilies\u002Fin\u002Frelay","families\u002Fin\u002Frelay",{"title":263,"path":264,"stem":265,"access":12},"rest","\u002Ffamilies\u002Fin\u002Frest","families\u002Fin\u002Frest",{"title":267,"path":268,"stem":269,"access":12},"solid","\u002Ffamilies\u002Fin\u002Fsolid","families\u002Fin\u002Fsolid",{"title":271,"path":272,"stem":273,"access":12},"svelte","\u002Ffamilies\u002Fin\u002Fsvelte","families\u002Fin\u002Fsvelte",{"title":275,"path":276,"stem":277,"access":12},"tanstack-query","\u002Ffamilies\u002Fin\u002Ftanstack-query","families\u002Fin\u002Ftanstack-query",{"title":279,"path":280,"stem":281,"access":12},"tanstack-table","\u002Ffamilies\u002Fin\u002Ftanstack-table","families\u002Fin\u002Ftanstack-table",{"title":283,"path":284,"stem":285,"access":12},"vue","\u002Ffamilies\u002Fin\u002Fvue","families\u002Fin\u002Fvue",{"title":287,"path":288,"stem":289,"access":12},"yjs","\u002Ffamilies\u002Fin\u002Fyjs","families\u002Fin\u002Fyjs",{"title":291,"path":292,"stem":293,"access":12},"zustand","\u002Ffamilies\u002Fin\u002Fzustand","families\u002Fin\u002Fzustand",{"title":295,"path":296,"stem":297,"children":298,"access":12,"icon":127},"on-Auth","\u002Ffamilies\u002Fon","families\u002Fon\u002Findex",[299,300,304,308,312,316,320,324,328,332,336],{"title":295,"path":296,"stem":297,"access":12,"icon":127},{"title":301,"path":302,"stem":303,"access":12},"email-otp","\u002Ffamilies\u002Fon\u002Femail-otp","families\u002Fon\u002Femail-otp",{"title":305,"path":306,"stem":307,"access":12},"magic-link","\u002Ffamilies\u002Fon\u002Fmagic-link","families\u002Fon\u002Fmagic-link",{"title":309,"path":310,"stem":311,"access":12},"oidc","\u002Ffamilies\u002Fon\u002Foidc","families\u002Fon\u002Foidc",{"title":313,"path":314,"stem":315,"access":12},"password","\u002Ffamilies\u002Fon\u002Fpassword","families\u002Fon\u002Fpassword",{"title":317,"path":318,"stem":319,"access":12},"pin","\u002Ffamilies\u002Fon\u002Fpin","families\u002Fon\u002Fpin",{"title":321,"path":322,"stem":323,"access":12},"recovery","\u002Ffamilies\u002Fon\u002Frecovery","families\u002Fon\u002Frecovery",{"title":325,"path":326,"stem":327,"access":12},"shamir","\u002Ffamilies\u002Fon\u002Fshamir","families\u002Fon\u002Fshamir",{"title":329,"path":330,"stem":331,"access":12},"threat","\u002Ffamilies\u002Fon\u002Fthreat","families\u002Fon\u002Fthreat",{"title":333,"path":334,"stem":335,"access":12},"totp","\u002Ffamilies\u002Fon\u002Ftotp","families\u002Fon\u002Ftotp",{"title":337,"path":338,"stem":339,"access":12},"webauthn","\u002Ffamilies\u002Fon\u002Fwebauthn","families\u002Fon\u002Fwebauthn",{"title":341,"path":342,"stem":343,"children":344,"access":12,"icon":127},"to-Stores","\u002Ffamilies\u002Fto","families\u002Fto\u002Findex",[345,346,350,353,357,361,365,370,374,378,382,386,390,394,398,402,406,410,414,417,421,425,429,434,438,442],{"title":341,"path":342,"stem":343,"access":12,"icon":127},{"title":347,"path":348,"stem":349,"access":12},"aws-dynamo","\u002Ffamilies\u002Fto\u002Faws-dynamo","families\u002Fto\u002Faws-dynamo",{"title":129,"path":351,"stem":352,"access":12},"\u002Ffamilies\u002Fto\u002Faws-s3","families\u002Fto\u002Faws-s3",{"title":354,"path":355,"stem":356,"access":12},"browser-fs","\u002Ffamilies\u002Fto\u002Fbrowser-fs","families\u002Fto\u002Fbrowser-fs",{"title":358,"path":359,"stem":360,"access":12},"browser-idb","\u002Ffamilies\u002Fto\u002Fbrowser-idb","families\u002Fto\u002Fbrowser-idb",{"title":362,"path":363,"stem":364,"access":12},"browser-local","\u002Ffamilies\u002Fto\u002Fbrowser-local","families\u002Fto\u002Fbrowser-local",{"title":366,"path":367,"stem":368,"access":12,"icon":369},"Choosing a store","\u002Ffamilies\u002Fto\u002Fchoosing-a-store","families\u002Fto\u002Fchoosing-a-store","i-lucide-split",{"title":371,"path":372,"stem":373,"access":12},"cloudflare-d1","\u002Ffamilies\u002Fto\u002Fcloudflare-d1","families\u002Fto\u002Fcloudflare-d1",{"title":375,"path":376,"stem":377,"access":12},"cloudflare-r2","\u002Ffamilies\u002Fto\u002Fcloudflare-r2","families\u002Fto\u002Fcloudflare-r2",{"title":379,"path":380,"stem":381,"access":12},"drive","\u002Ffamilies\u002Fto\u002Fdrive","families\u002Fto\u002Fdrive",{"title":383,"path":384,"stem":385,"access":12},"file","\u002Ffamilies\u002Fto\u002Ffile","families\u002Fto\u002Ffile",{"title":387,"path":388,"stem":389,"access":12},"icloud","\u002Ffamilies\u002Fto\u002Ficloud","families\u002Fto\u002Ficloud",{"title":391,"path":392,"stem":393,"access":12},"memory","\u002Ffamilies\u002Fto\u002Fmemory","families\u002Fto\u002Fmemory",{"title":395,"path":396,"stem":397,"access":12},"meter","\u002Ffamilies\u002Fto\u002Fmeter","families\u002Fto\u002Fmeter",{"title":399,"path":400,"stem":401,"access":12},"mysql","\u002Ffamilies\u002Fto\u002Fmysql","families\u002Fto\u002Fmysql",{"title":403,"path":404,"stem":405,"access":12},"nfs","\u002Ffamilies\u002Fto\u002Fnfs","families\u002Fto\u002Fnfs",{"title":407,"path":408,"stem":409,"access":12},"postgres","\u002Ffamilies\u002Fto\u002Fpostgres","families\u002Fto\u002Fpostgres",{"title":411,"path":412,"stem":413,"access":12},"probe","\u002Ffamilies\u002Fto\u002Fprobe","families\u002Fto\u002Fprobe",{"title":263,"path":415,"stem":416,"access":12},"\u002Ffamilies\u002Fto\u002Frest","families\u002Fto\u002Frest",{"title":418,"path":419,"stem":420,"access":12},"smb","\u002Ffamilies\u002Fto\u002Fsmb","families\u002Fto\u002Fsmb",{"title":422,"path":423,"stem":424,"access":12},"sqlite","\u002Ffamilies\u002Fto\u002Fsqlite","families\u002Fto\u002Fsqlite",{"title":426,"path":427,"stem":428,"access":12},"ssh","\u002Ffamilies\u002Fto\u002Fssh","families\u002Fto\u002Fssh",{"title":430,"path":431,"stem":432,"access":12,"icon":433},"Store-locator descriptors","\u002Ffamilies\u002Fto\u002Fstore-locator","families\u002Fto\u002Fstore-locator","i-lucide-map-pin",{"title":435,"path":436,"stem":437,"access":12},"supabase","\u002Ffamilies\u002Fto\u002Fsupabase","families\u002Fto\u002Fsupabase",{"title":439,"path":440,"stem":441,"access":12},"turso","\u002Ffamilies\u002Fto\u002Fturso","families\u002Fto\u002Fturso",{"title":443,"path":444,"stem":445,"access":12},"webdav","\u002Ffamilies\u002Fto\u002Fwebdav","families\u002Fto\u002Fwebdav",{"title":447,"path":448,"stem":449,"children":450},"Faq","\u002Ffaq","faq",[451,454,458,462,466,470],{"title":10,"path":448,"stem":452,"access":12,"icon":453},"faq\u002Findex","i-lucide-circle-help",{"title":455,"path":456,"stem":457,"access":12},"Where can noy-db run?","\u002Ffaq\u002Fwhere-can-noy-db-run","faq\u002F1.where-can-noy-db-run",{"title":459,"path":460,"stem":461,"access":12},"Native mobile & PWA","\u002Ffaq\u002Fmobile-and-pwa","faq\u002F2.mobile-and-pwa",{"title":463,"path":464,"stem":465,"access":12},"Threat model","\u002Ffaq\u002Fthreat-model","faq\u002F3.threat-model",{"title":467,"path":468,"stem":469,"access":12},"Community & ecosystem","\u002Ffaq\u002Fcommunity-and-ecosystem","faq\u002F4.community-and-ecosystem",{"title":471,"path":472,"stem":473,"access":12},"Licensing","\u002Ffaq\u002Flicensing","faq\u002F5.licensing",{"title":475,"path":476,"stem":477,"children":478},"Glossary","\u002Fglossary","glossary",[479,482,486,490,494],{"title":10,"path":476,"stem":480,"access":12,"icon":481},"glossary\u002Findex","i-lucide-book-a",{"title":483,"path":484,"stem":485,"access":12},"Core vocabulary","\u002Fglossary\u002Fcore-vocabulary","glossary\u002Fcore-vocabulary",{"title":487,"path":488,"stem":489,"access":12},"Deletion vocabulary","\u002Fglossary\u002Fdeletion","glossary\u002Fdeletion",{"title":491,"path":492,"stem":493,"access":12},"Satellite collection vocabulary","\u002Fglossary\u002Fsatellite-collections","glossary\u002Fsatellite-collections",{"title":495,"path":496,"stem":497,"access":12},"Schema migration vocabulary","\u002Fglossary\u002Fschema-migration","glossary\u002Fschema-migration",{"title":499,"path":500,"stem":501,"children":502},"Recipes","\u002Frecipes","recipes",[503,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,567,571,575,580,584,588,592],{"title":10,"path":500,"stem":504,"access":12,"icon":505},"recipes\u002Findex","i-lucide-play",{"title":507,"path":508,"stem":509,"access":12},"Accounting app","\u002Frecipes\u002Faccounting-app","recipes\u002Faccounting-app",{"title":511,"path":512,"stem":513,"access":12},"Analytics app","\u002Frecipes\u002Fanalytics-app","recipes\u002Fanalytics-app",{"title":515,"path":516,"stem":517,"access":12},"Attestation verifier","\u002Frecipes\u002Fattestation-verifier","recipes\u002Fattestation-verifier",{"title":519,"path":520,"stem":521,"access":12},"AWS-KMS attestation","\u002Frecipes\u002Faws-kms-pdf-attestation","recipes\u002Faws-kms-pdf-attestation",{"title":523,"path":524,"stem":525,"access":12},"Browser durability","\u002Frecipes\u002Fbrowser-durability","recipes\u002Fbrowser-durability",{"title":527,"path":528,"stem":529,"access":12},"Production cloud store","\u002Frecipes\u002Fcloud-store","recipes\u002Fcloud-store",{"title":531,"path":532,"stem":533,"access":12},"Compose your own setup","\u002Frecipes\u002Fcompose-your-own","recipes\u002Fcompose-your-own",{"title":535,"path":536,"stem":537,"access":12},"Confidential HR records","\u002Frecipes\u002Fconfidential-hr","recipes\u002Fconfidential-hr",{"title":539,"path":540,"stem":541,"access":12},"Composing an echo secret","\u002Frecipes\u002Fecho-secret-enrollment","recipes\u002Fecho-secret-enrollment",{"title":543,"path":544,"stem":545,"access":12},"Email archive","\u002Frecipes\u002Femail-archive","recipes\u002Femail-archive",{"title":547,"path":548,"stem":549,"access":12},"Email archive — threads & revisions","\u002Frecipes\u002Femail-archive-threads-revisions","recipes\u002Femail-archive-threads-revisions",{"title":551,"path":552,"stem":553,"access":12},"Export & portability","\u002Frecipes\u002Fexport-portability","recipes\u002Fexport-portability",{"title":555,"path":556,"stem":557,"access":12},"Passwordless OIDC (AWS Cognito)","\u002Frecipes\u002Fpasswordless-oidc","recipes\u002Fpasswordless-oidc",{"title":559,"path":560,"stem":561,"access":12},"Personal notebook","\u002Frecipes\u002Fpersonal-notebook","recipes\u002Fpersonal-notebook",{"title":563,"path":564,"stem":565,"access":12,"icon":566},"Playgrounds","\u002Frecipes\u002Fplaygrounds","recipes\u002Fplaygrounds","i-lucide-gamepad-2",{"title":568,"path":569,"stem":570,"access":12},"React invoice app","\u002Frecipes\u002Freact-invoices","recipes\u002Freact-invoices",{"title":572,"path":573,"stem":574,"access":12},"Collaborative app","\u002Frecipes\u002Frealtime-crdt-app","recipes\u002Frealtime-crdt-app",{"title":576,"path":577,"stem":578,"access":12,"icon":579},"Run the showcases","\u002Frecipes\u002Frun-the-showcases","recipes\u002Frun-the-showcases","i-lucide-flask-conical",{"title":581,"path":582,"stem":583,"access":12},"Search & RAG","\u002Frecipes\u002Fsearch-rag","recipes\u002Fsearch-rag",{"title":585,"path":586,"stem":587,"access":12},"Team vault topology","\u002Frecipes\u002Fteam-vault-topology","recipes\u002Fteam-vault-topology",{"title":589,"path":590,"stem":591,"access":12},"Unlock ceremonies","\u002Frecipes\u002Funlock-ceremonies","recipes\u002Funlock-ceremonies",{"title":593,"path":594,"stem":595,"access":12},"User preferences","\u002Frecipes\u002Fuser-preferences","recipes\u002Fuser-preferences",{"title":597,"path":598,"stem":599,"children":600},"Services","\u002Fservices","services",[601,604,608,612,616,620,624,628,632,636,640,644,648,652,656,660,664,668,672,676,680,684,688,692,696,700,704,710,714,718,722,726,730,734,738,742,746,750,755,759,763,767,771,775,779,783,787,791,795,799,803,807,811,815,819,823,827,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,899],{"title":10,"path":598,"stem":602,"access":12,"icon":603},"services\u002Findex","i-lucide-layers",{"title":605,"path":606,"stem":607,"access":12},"archive","\u002Fservices\u002Farchive","services\u002Farchive",{"title":609,"path":610,"stem":611,"access":12},"attestation","\u002Fservices\u002Fattestation","services\u002Fattestation",{"title":613,"path":614,"stem":615,"access":12},"auth-introspection","\u002Fservices\u002Fauth-introspection","services\u002Fauth-introspection",{"title":617,"path":618,"stem":619,"access":12},"auth-landscape","\u002Fservices\u002Fauth-landscape","services\u002Fauth-landscape",{"title":621,"path":622,"stem":623,"access":12},"blobs","\u002Fservices\u002Fblobs","services\u002Fblobs",{"title":625,"path":626,"stem":627,"access":12},"broker","\u002Fservices\u002Fbroker","services\u002Fbroker",{"title":629,"path":630,"stem":631,"access":12},"bundle","\u002Fservices\u002Fbundle","services\u002Fbundle",{"title":633,"path":634,"stem":635,"access":12},"classified","\u002Fservices\u002Fclassified","services\u002Fclassified",{"title":637,"path":638,"stem":639,"access":12},"computed","\u002Fservices\u002Fcomputed","services\u002Fcomputed",{"title":641,"path":642,"stem":643,"access":12},"consent","\u002Fservices\u002Fconsent","services\u002Fconsent",{"title":645,"path":646,"stem":647,"access":12},"cover","\u002Fservices\u002Fcover","services\u002Fcover",{"title":649,"path":650,"stem":651,"access":12},"coverage","\u002Fservices\u002Fcoverage","services\u002Fcoverage",{"title":653,"path":654,"stem":655,"access":12},"crdt","\u002Fservices\u002Fcrdt","services\u002Fcrdt",{"title":657,"path":658,"stem":659,"access":12},"cross-join","\u002Fservices\u002Fcross-join","services\u002Fcross-join",{"title":661,"path":662,"stem":663,"access":12},"custody","\u002Fservices\u002Fcustody","services\u002Fcustody",{"title":665,"path":666,"stem":667,"access":12},"derivations","\u002Fservices\u002Fderivations","services\u002Fderivations",{"title":669,"path":670,"stem":671,"access":12},"directory","\u002Fservices\u002Fdirectory","services\u002Fdirectory",{"title":673,"path":674,"stem":675,"access":12},"search — AI","\u002Fservices\u002Fembeddings","services\u002Fembeddings",{"title":677,"path":678,"stem":679,"access":12},"Field metadata","\u002Fservices\u002Ffield-metadata","services\u002Ffield-metadata",{"title":681,"path":682,"stem":683,"access":12},"Foreign refs","\u002Fservices\u002Fforeign-refs","services\u002Fforeign-refs",{"title":685,"path":686,"stem":687,"access":12},"forget","\u002Fservices\u002Fforget","services\u002Fforget",{"title":689,"path":690,"stem":691,"access":12},"governance","\u002Fservices\u002Fgovernance","services\u002Fgovernance",{"title":693,"path":694,"stem":695,"access":12},"guards","\u002Fservices\u002Fguards","services\u002Fguards",{"title":697,"path":698,"stem":699,"access":12},"history","\u002Fservices\u002Fhistory","services\u002Fhistory",{"title":701,"path":702,"stem":703,"access":12},"i18n","\u002Fservices\u002Fi18n","services\u002Fi18n",{"title":705,"path":706,"stem":707,"children":708,"access":12},"indexing","\u002Fservices\u002Findexing","services\u002Findexing",[709],{"title":705,"path":706,"stem":707,"access":12},{"title":711,"path":712,"stem":713,"access":12},"introspection","\u002Fservices\u002Fintrospection","services\u002Fintrospection",{"title":715,"path":716,"stem":717,"access":12},"joins","\u002Fservices\u002Fjoins","services\u002Fjoins",{"title":719,"path":720,"stem":721,"access":12},"lazy","\u002Fservices\u002Flazy","services\u002Flazy",{"title":723,"path":724,"stem":725,"access":12},"links","\u002Fservices\u002Flinks","services\u002Flinks",{"title":727,"path":728,"stem":729,"access":12},"live","\u002Fservices\u002Flive","services\u002Flive",{"title":731,"path":732,"stem":733,"access":12},"lookup","\u002Fservices\u002Flookup","services\u002Flookup",{"title":735,"path":736,"stem":737,"access":12},"manifest","\u002Fservices\u002Fmanifest","services\u002Fmanifest",{"title":739,"path":740,"stem":741,"access":12},"materialized-views","\u002Fservices\u002Fmaterialized-views","services\u002Fmaterialized-views",{"title":743,"path":744,"stem":745,"access":12},"Metadata ladder","\u002Fservices\u002Fmetadata-ladder","services\u002Fmetadata-ladder",{"title":747,"path":748,"stem":749,"access":12},"Metadata riders","\u002Fservices\u002Fmetadata-riders","services\u002Fmetadata-riders",{"title":751,"path":752,"stem":753,"access":12,"badge":754},"metrics","\u002Fservices\u002Fmetrics","services\u002Fmetrics","Planned",{"title":756,"path":757,"stem":758,"access":12,"badge":754},"migrations","\u002Fservices\u002Fmigrations","services\u002Fmigrations",{"title":760,"path":761,"stem":762,"access":12},"money","\u002Fservices\u002Fmoney","services\u002Fmoney",{"title":764,"path":765,"stem":766,"access":12},"numbering","\u002Fservices\u002Fnumbering","services\u002Fnumbering",{"title":768,"path":769,"stem":770,"access":12},"overlay-views","\u002Fservices\u002Foverlay-views","services\u002Foverlay-views",{"title":772,"path":773,"stem":774,"access":12,"badge":754},"partitioning","\u002Fservices\u002Fpartitioning","services\u002Fpartitioning",{"title":776,"path":777,"stem":778,"access":12},"periods","\u002Fservices\u002Fperiods","services\u002Fperiods",{"title":780,"path":781,"stem":782,"access":12},"persisted-schemas","\u002Fservices\u002Fpersisted-schemas","services\u002Fpersisted-schemas",{"title":784,"path":785,"stem":786,"access":12},"plaintext-bypass","\u002Fservices\u002Fplaintext-bypass","services\u002Fplaintext-bypass",{"title":788,"path":789,"stem":790,"access":12},"pod-redirect","\u002Fservices\u002Fpod-redirect","services\u002Fpod-redirect",{"title":792,"path":793,"stem":794,"access":12},"pod-signature","\u002Fservices\u002Fpod-signature","services\u002Fpod-signature",{"title":796,"path":797,"stem":798,"access":12},"policy","\u002Fservices\u002Fpolicy","services\u002Fpolicy",{"title":800,"path":801,"stem":802,"access":12},"portability","\u002Fservices\u002Fportability","services\u002Fportability",{"title":804,"path":805,"stem":806,"access":12},"reduce","\u002Fservices\u002Freduce","services\u002Freduce",{"title":808,"path":809,"stem":810,"access":12},"routing","\u002Fservices\u002Frouting","services\u002Frouting",{"title":812,"path":813,"stem":814,"access":12},"satellites","\u002Fservices\u002Fsatellites","services\u002Fsatellites",{"title":816,"path":817,"stem":818,"access":12},"schema-identifiers","\u002Fservices\u002Fschema-identifiers","services\u002Fschema-identifiers",{"title":820,"path":821,"stem":822,"access":12},"schema-update","\u002Fservices\u002Fschema-update","services\u002Fschema-update",{"title":824,"path":825,"stem":826,"access":12},"sealed-record","\u002Fservices\u002Fsealed-record","services\u002Fsealed-record",{"title":828,"path":829,"stem":830,"access":12},"sealing provider id","\u002Fservices\u002Fsealing-pid-stability","services\u002Fsealing-pid-stability",{"title":832,"path":833,"stem":834,"access":12},"search — full-text","\u002Fservices\u002Fsearch","services\u002Fsearch",{"title":836,"path":837,"stem":838,"access":12},"sequence","\u002Fservices\u002Fsequence","services\u002Fsequence",{"title":840,"path":841,"stem":842,"access":12},"session","\u002Fservices\u002Fsession","services\u002Fsession",{"title":844,"path":845,"stem":846,"access":12},"session-tiers","\u002Fservices\u002Fsession-tiers","services\u002Fsession-tiers",{"title":848,"path":849,"stem":850,"access":12},"shadow","\u002Fservices\u002Fshadow","services\u002Fshadow",{"title":852,"path":853,"stem":854,"access":12},"share-link","\u002Fservices\u002Fshare-link","services\u002Fshare-link",{"title":856,"path":857,"stem":858,"access":12},"snapshots","\u002Fservices\u002Fsnapshots","services\u002Fsnapshots",{"title":860,"path":861,"stem":862,"access":12},"store capabilities","\u002Fservices\u002Fstorage-capability-matrix","services\u002Fstorage-capability-matrix",{"title":864,"path":865,"stem":866,"access":12},"sync","\u002Fservices\u002Fsync","services\u002Fsync",{"title":868,"path":869,"stem":870,"access":12},"team","\u002Fservices\u002Fteam","services\u002Fteam",{"title":872,"path":873,"stem":874,"access":12},"tiers","\u002Fservices\u002Ftiers","services\u002Ftiers",{"title":876,"path":877,"stem":878,"access":12},"transactions","\u002Fservices\u002Ftransactions","services\u002Ftransactions",{"title":880,"path":881,"stem":882,"access":12},"partitions","\u002Fservices\u002Ftransferable-partitions","services\u002Ftransferable-partitions",{"title":884,"path":885,"stem":886,"access":12},"user-envelope","\u002Fservices\u002Fuser-envelope","services\u002Fuser-envelope",{"title":888,"path":889,"stem":890,"access":12,"badge":754},"validation","\u002Fservices\u002Fvalidation","services\u002Fvalidation",{"title":892,"path":893,"stem":894,"access":12},"vault-head","\u002Fservices\u002Fvault-head","services\u002Fvault-head",{"title":896,"path":897,"stem":898,"access":12},"via","\u002Fservices\u002Fvia","services\u002Fvia",{"title":900,"path":901,"stem":902,"access":12},"withdrawal","\u002Fservices\u002Fwithdrawal","services\u002Fwithdrawal",{"title":904,"path":905,"stem":906,"children":907},"Start","\u002Fstart","start",[908,911,915,919,923],{"title":10,"path":905,"stem":909,"access":12,"icon":910},"start\u002Findex","i-lucide-flag",{"title":912,"path":913,"stem":914,"access":12},"Install","\u002Fstart\u002Finstall","start\u002F1.install",{"title":916,"path":917,"stem":918,"access":12},"Your first vault","\u002Fstart\u002Ffirst-vault","start\u002F2.first-vault",{"title":920,"path":921,"stem":922,"access":12},"Your first service","\u002Fstart\u002Ffirst-service","start\u002F3.first-service",{"title":924,"path":925,"stem":926,"access":12},"See the ciphertext","\u002Fstart\u002Fsee-the-ciphertext","start\u002F4.see-the-ciphertext",{"id":928,"title":820,"access":12,"apiToc":929,"body":930,"category":4169,"description":4170,"extension":4171,"meta":4172,"navigation":4169,"nest":4173,"path":821,"seo":4174,"sinceVersion":4169,"status":4175,"stem":822,"subtitle":4169,"tier":4176,"tocExternal":4169,"__hash__":4177},"docs\u002Fservices\u002Fschema-update.md",false,{"type":931,"value":932,"toc":4143},"minimark",[933,936,940,945,964,979,983,1348,1360,1364,1393,1398,1401,1761,1765,1772,1985,1999,2003,2023,2262,2266,2277,3093,3104,3108,3114,3120,3139,3145,3150,3165,3172,3178,3219,3230,3236,3269,3300,3306,3383,3399,3409,3582,3606,3614,3740,3760,3766,3821,3834,3840,3860,3871,3877,3989,3992,3995,4094,4098,4139],[934,935,820],"h1",{"id":820},[937,938],"service-meta",{":rows":939},"[{\"label\":\"Subpath\",\"value\":\"`@noy-db\u002Fhub` (root export)\"},{\"label\":\"Type\",\"value\":\"Core feature — activated by the `schemaUpdate` collection option (needs `persistJsonSchema: true` as the baseline).\"}]",[941,942,944],"h2",{"id":943},"what-it-does","What it does",[946,947,948,949,953,954,958,959,963],"p",{},"Your application's schema evolves — a field gets added, renamed, or its type changes — but a vault's existing records were encrypted and stored under the ",[950,951,952],"em",{},"old"," shape. schema-update is how the hub reacts when it detects that drift: on every vault open it compares the freshly-derived schema against the one it persisted last time (see ",[955,956,780],"a",{"href":957},".\u002Fpersisted-schemas",", which this feature builds on and requires), classifies the difference, and runs it past an ordered list of strategies you register per collection. Each strategy either lets the change through, rejects it (blocking writes until fixed), or — for ",[960,961,962],"code",{},"coordinatedCutover"," — schedules a one-time bulk migration of the collection's existing records.",[946,965,966,967,970,971,974,975,978],{},"This is always on within its layer — there's no ",[960,968,969],{},"with*()"," factory to add. The opt-in is two collection options together: ",[960,972,973],{},"persistJsonSchema: true"," (the baseline to detect against) and ",[960,976,977],{},"schemaUpdate: [...]"," (the strategies to run when a change is detected).",[941,980,982],{"id":981},"setup","Setup",[984,985,990],"pre",{"className":986,"code":987,"language":988,"meta":989,"style":989},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { z } from 'zod'\nimport { createNoydb, additiveOnly } from '@noy-db\u002Fhub'\nimport { toMemory } from '@noy-db\u002Fto-memory'\n\nconst store = toMemory()\nconst db = await createNoydb({\n  store,\n  user: 'alice',\n  secret: 'a-strong-secret',\n})\n\nconst vault = await db.openVault('acme')\n\nconst invoices = vault.collection('invoices', {\n  schema: z.object({ id: z.string(), amount: z.number() }),\n  persistJsonSchema: true,\n  schemaUpdate: [additiveOnly()],\n})\n","ts","",[960,991,992,1025,1052,1073,1080,1099,1120,1129,1149,1166,1175,1180,1212,1217,1249,1308,1322,1341],{"__ignoreMap":989},[993,994,997,1001,1005,1009,1012,1015,1018,1022],"span",{"class":995,"line":996},"line",1,[993,998,1000],{"class":999},"s7zQu","import",[993,1002,1004],{"class":1003},"sMK4o"," {",[993,1006,1008],{"class":1007},"sTEyZ"," z",[993,1010,1011],{"class":1003}," }",[993,1013,1014],{"class":999}," from",[993,1016,1017],{"class":1003}," '",[993,1019,1021],{"class":1020},"sfazB","zod",[993,1023,1024],{"class":1003},"'\n",[993,1026,1028,1030,1032,1035,1038,1041,1043,1045,1047,1050],{"class":995,"line":1027},2,[993,1029,1000],{"class":999},[993,1031,1004],{"class":1003},[993,1033,1034],{"class":1007}," createNoydb",[993,1036,1037],{"class":1003},",",[993,1039,1040],{"class":1007}," additiveOnly",[993,1042,1011],{"class":1003},[993,1044,1014],{"class":999},[993,1046,1017],{"class":1003},[993,1048,1049],{"class":1020},"@noy-db\u002Fhub",[993,1051,1024],{"class":1003},[993,1053,1055,1057,1059,1062,1064,1066,1068,1071],{"class":995,"line":1054},3,[993,1056,1000],{"class":999},[993,1058,1004],{"class":1003},[993,1060,1061],{"class":1007}," toMemory",[993,1063,1011],{"class":1003},[993,1065,1014],{"class":999},[993,1067,1017],{"class":1003},[993,1069,1070],{"class":1020},"@noy-db\u002Fto-memory",[993,1072,1024],{"class":1003},[993,1074,1076],{"class":995,"line":1075},4,[993,1077,1079],{"emptyLinePlaceholder":1078},true,"\n",[993,1081,1083,1087,1090,1093,1096],{"class":995,"line":1082},5,[993,1084,1086],{"class":1085},"spNyl","const",[993,1088,1089],{"class":1007}," store ",[993,1091,1092],{"class":1003},"=",[993,1094,1061],{"class":1095},"s2Zo4",[993,1097,1098],{"class":1007},"()\n",[993,1100,1102,1104,1107,1109,1112,1114,1117],{"class":995,"line":1101},6,[993,1103,1086],{"class":1085},[993,1105,1106],{"class":1007}," db ",[993,1108,1092],{"class":1003},[993,1110,1111],{"class":999}," await",[993,1113,1034],{"class":1095},[993,1115,1116],{"class":1007},"(",[993,1118,1119],{"class":1003},"{\n",[993,1121,1123,1126],{"class":995,"line":1122},7,[993,1124,1125],{"class":1007},"  store",[993,1127,1128],{"class":1003},",\n",[993,1130,1132,1136,1139,1141,1144,1147],{"class":995,"line":1131},8,[993,1133,1135],{"class":1134},"swJcz","  user",[993,1137,1138],{"class":1003},":",[993,1140,1017],{"class":1003},[993,1142,1143],{"class":1020},"alice",[993,1145,1146],{"class":1003},"'",[993,1148,1128],{"class":1003},[993,1150,1152,1155,1157,1159,1162,1164],{"class":995,"line":1151},9,[993,1153,1154],{"class":1134},"  secret",[993,1156,1138],{"class":1003},[993,1158,1017],{"class":1003},[993,1160,1161],{"class":1020},"a-strong-secret",[993,1163,1146],{"class":1003},[993,1165,1128],{"class":1003},[993,1167,1169,1172],{"class":995,"line":1168},10,[993,1170,1171],{"class":1003},"}",[993,1173,1174],{"class":1007},")\n",[993,1176,1178],{"class":995,"line":1177},11,[993,1179,1079],{"emptyLinePlaceholder":1078},[993,1181,1183,1185,1188,1190,1192,1195,1198,1201,1203,1205,1208,1210],{"class":995,"line":1182},12,[993,1184,1086],{"class":1085},[993,1186,1187],{"class":1007}," vault ",[993,1189,1092],{"class":1003},[993,1191,1111],{"class":999},[993,1193,1194],{"class":1007}," db",[993,1196,1197],{"class":1003},".",[993,1199,1200],{"class":1095},"openVault",[993,1202,1116],{"class":1007},[993,1204,1146],{"class":1003},[993,1206,1207],{"class":1020},"acme",[993,1209,1146],{"class":1003},[993,1211,1174],{"class":1007},[993,1213,1215],{"class":995,"line":1214},13,[993,1216,1079],{"emptyLinePlaceholder":1078},[993,1218,1220,1222,1225,1227,1230,1232,1235,1237,1239,1242,1244,1246],{"class":995,"line":1219},14,[993,1221,1086],{"class":1085},[993,1223,1224],{"class":1007}," invoices ",[993,1226,1092],{"class":1003},[993,1228,1229],{"class":1007}," vault",[993,1231,1197],{"class":1003},[993,1233,1234],{"class":1095},"collection",[993,1236,1116],{"class":1007},[993,1238,1146],{"class":1003},[993,1240,1241],{"class":1020},"invoices",[993,1243,1146],{"class":1003},[993,1245,1037],{"class":1003},[993,1247,1248],{"class":1003}," {\n",[993,1250,1252,1255,1257,1259,1261,1264,1266,1269,1272,1274,1276,1278,1281,1284,1286,1289,1291,1293,1295,1298,1301,1303,1306],{"class":995,"line":1251},15,[993,1253,1254],{"class":1134},"  schema",[993,1256,1138],{"class":1003},[993,1258,1008],{"class":1007},[993,1260,1197],{"class":1003},[993,1262,1263],{"class":1095},"object",[993,1265,1116],{"class":1007},[993,1267,1268],{"class":1003},"{",[993,1270,1271],{"class":1134}," id",[993,1273,1138],{"class":1003},[993,1275,1008],{"class":1007},[993,1277,1197],{"class":1003},[993,1279,1280],{"class":1095},"string",[993,1282,1283],{"class":1007},"()",[993,1285,1037],{"class":1003},[993,1287,1288],{"class":1134}," amount",[993,1290,1138],{"class":1003},[993,1292,1008],{"class":1007},[993,1294,1197],{"class":1003},[993,1296,1297],{"class":1095},"number",[993,1299,1300],{"class":1007},"() ",[993,1302,1171],{"class":1003},[993,1304,1305],{"class":1007},")",[993,1307,1128],{"class":1003},[993,1309,1311,1314,1316,1320],{"class":995,"line":1310},16,[993,1312,1313],{"class":1134},"  persistJsonSchema",[993,1315,1138],{"class":1003},[993,1317,1319],{"class":1318},"sfNiH"," true",[993,1321,1128],{"class":1003},[993,1323,1325,1328,1330,1333,1336,1339],{"class":995,"line":1324},17,[993,1326,1327],{"class":1134},"  schemaUpdate",[993,1329,1138],{"class":1003},[993,1331,1332],{"class":1007}," [",[993,1334,1335],{"class":1095},"additiveOnly",[993,1337,1338],{"class":1007},"()]",[993,1340,1128],{"class":1003},[993,1342,1344,1346],{"class":995,"line":1343},18,[993,1345,1171],{"class":1003},[993,1347,1174],{"class":1007},[946,1349,1350,1353,1354,1356,1357,1359],{},[960,1351,1352],{},"schemaUpdate"," is ignored unless ",[960,1355,973],{}," is also set — detection needs the persisted baseline to compare against. With no ",[960,1358,1352],{}," strategies at all, schema changes are accepted silently (the pre-schema-update behavior): only registering strategies turns on enforcement.",[941,1361,1363],{"id":1362},"usage","Usage",[1365,1366,1368],"callout",{"color":1367,"icon":579},"neutral",[946,1369,1370,1374,1375,1378,1379,1382,1383,1385,1386,1389,1390,1392],{},[1371,1372,1373],"strong",{},"About these snippets."," Each one reopens the same vault twice in a row — ",[960,1376,1377],{},"gen 0"," then\n",[960,1380,1381],{},"gen 1"," — to simulate two separate application deployments seeing two versions of the\nschema, without needing two real processes. ",[960,1384,973],{}," writes the schema\nbaseline in the background, so the snippets call ",[960,1387,1388],{},"vault._drainPendingSchemaWrites()"," — a\ntest-only synchronization helper — to wait for that write before moving on to ",[960,1391,1381],{},". A\nreal deployment reopening a vault in a later process never needs to call it: by the time\nthat process starts, the previous write has long since finished.",[1394,1395,1397],"h3",{"id":1396},"an-additive-change-passes","An additive change passes",[946,1399,1400],{},"Adding a new optional field is the safe case — every registered strategy allows it by default.",[984,1402,1404],{"className":986,"code":1403,"language":988,"meta":989,"style":989},"\u002F\u002F gen 0: register with the original shape\nlet vault = await db.openVault('acme')\nvault.collection('invoices', {\n  schema: z.object({ id: z.string() }),\n  persistJsonSchema: true,\n  schemaUpdate: [additiveOnly()],\n})\nawait vault._drainPendingSchemaWrites() \u002F\u002F test-only: see note above\n\n\u002F\u002F gen 1 (a later process, or a reopened vault): a new optional field\nvault = await db.openVault('acme')\nconst invoices = vault.collection('invoices', {\n  schema: z.object({ id: z.string(), amount: z.number().optional() }), \u002F\u002F additive\n  persistJsonSchema: true,\n  schemaUpdate: [additiveOnly()],\n})\nawait vault._drainPendingSchemaWrites() \u002F\u002F test-only: see note above\n\nawait invoices.put('i1', { id: 'i1', amount: 10 }) \u002F\u002F → resolves\n",[960,1405,1406,1412,1439,1460,1494,1504,1518,1524,1541,1545,1550,1575,1601,1659,1669,1683,1689,1703,1707],{"__ignoreMap":989},[993,1407,1408],{"class":995,"line":996},[993,1409,1411],{"class":1410},"sHwdD","\u002F\u002F gen 0: register with the original shape\n",[993,1413,1414,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437],{"class":995,"line":1027},[993,1415,1416],{"class":1085},"let",[993,1418,1187],{"class":1007},[993,1420,1092],{"class":1003},[993,1422,1111],{"class":999},[993,1424,1194],{"class":1007},[993,1426,1197],{"class":1003},[993,1428,1200],{"class":1095},[993,1430,1116],{"class":1007},[993,1432,1146],{"class":1003},[993,1434,1207],{"class":1020},[993,1436,1146],{"class":1003},[993,1438,1174],{"class":1007},[993,1440,1441,1444,1446,1448,1450,1452,1454,1456,1458],{"class":995,"line":1054},[993,1442,1443],{"class":1007},"vault",[993,1445,1197],{"class":1003},[993,1447,1234],{"class":1095},[993,1449,1116],{"class":1007},[993,1451,1146],{"class":1003},[993,1453,1241],{"class":1020},[993,1455,1146],{"class":1003},[993,1457,1037],{"class":1003},[993,1459,1248],{"class":1003},[993,1461,1462,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1492],{"class":995,"line":1075},[993,1463,1254],{"class":1134},[993,1465,1138],{"class":1003},[993,1467,1008],{"class":1007},[993,1469,1197],{"class":1003},[993,1471,1263],{"class":1095},[993,1473,1116],{"class":1007},[993,1475,1268],{"class":1003},[993,1477,1271],{"class":1134},[993,1479,1138],{"class":1003},[993,1481,1008],{"class":1007},[993,1483,1197],{"class":1003},[993,1485,1280],{"class":1095},[993,1487,1300],{"class":1007},[993,1489,1171],{"class":1003},[993,1491,1305],{"class":1007},[993,1493,1128],{"class":1003},[993,1495,1496,1498,1500,1502],{"class":995,"line":1082},[993,1497,1313],{"class":1134},[993,1499,1138],{"class":1003},[993,1501,1319],{"class":1318},[993,1503,1128],{"class":1003},[993,1505,1506,1508,1510,1512,1514,1516],{"class":995,"line":1101},[993,1507,1327],{"class":1134},[993,1509,1138],{"class":1003},[993,1511,1332],{"class":1007},[993,1513,1335],{"class":1095},[993,1515,1338],{"class":1007},[993,1517,1128],{"class":1003},[993,1519,1520,1522],{"class":995,"line":1122},[993,1521,1171],{"class":1003},[993,1523,1174],{"class":1007},[993,1525,1526,1529,1531,1533,1536,1538],{"class":995,"line":1131},[993,1527,1528],{"class":999},"await",[993,1530,1229],{"class":1007},[993,1532,1197],{"class":1003},[993,1534,1535],{"class":1095},"_drainPendingSchemaWrites",[993,1537,1300],{"class":1007},[993,1539,1540],{"class":1410},"\u002F\u002F test-only: see note above\n",[993,1542,1543],{"class":995,"line":1151},[993,1544,1079],{"emptyLinePlaceholder":1078},[993,1546,1547],{"class":995,"line":1168},[993,1548,1549],{"class":1410},"\u002F\u002F gen 1 (a later process, or a reopened vault): a new optional field\n",[993,1551,1552,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573],{"class":995,"line":1177},[993,1553,1554],{"class":1007},"vault ",[993,1556,1092],{"class":1003},[993,1558,1111],{"class":999},[993,1560,1194],{"class":1007},[993,1562,1197],{"class":1003},[993,1564,1200],{"class":1095},[993,1566,1116],{"class":1007},[993,1568,1146],{"class":1003},[993,1570,1207],{"class":1020},[993,1572,1146],{"class":1003},[993,1574,1174],{"class":1007},[993,1576,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599],{"class":995,"line":1182},[993,1578,1086],{"class":1085},[993,1580,1224],{"class":1007},[993,1582,1092],{"class":1003},[993,1584,1229],{"class":1007},[993,1586,1197],{"class":1003},[993,1588,1234],{"class":1095},[993,1590,1116],{"class":1007},[993,1592,1146],{"class":1003},[993,1594,1241],{"class":1020},[993,1596,1146],{"class":1003},[993,1598,1037],{"class":1003},[993,1600,1248],{"class":1003},[993,1602,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1648,1650,1652,1654,1656],{"class":995,"line":1214},[993,1604,1254],{"class":1134},[993,1606,1138],{"class":1003},[993,1608,1008],{"class":1007},[993,1610,1197],{"class":1003},[993,1612,1263],{"class":1095},[993,1614,1116],{"class":1007},[993,1616,1268],{"class":1003},[993,1618,1271],{"class":1134},[993,1620,1138],{"class":1003},[993,1622,1008],{"class":1007},[993,1624,1197],{"class":1003},[993,1626,1280],{"class":1095},[993,1628,1283],{"class":1007},[993,1630,1037],{"class":1003},[993,1632,1288],{"class":1134},[993,1634,1138],{"class":1003},[993,1636,1008],{"class":1007},[993,1638,1197],{"class":1003},[993,1640,1297],{"class":1095},[993,1642,1283],{"class":1007},[993,1644,1197],{"class":1003},[993,1646,1647],{"class":1095},"optional",[993,1649,1300],{"class":1007},[993,1651,1171],{"class":1003},[993,1653,1305],{"class":1007},[993,1655,1037],{"class":1003},[993,1657,1658],{"class":1410}," \u002F\u002F additive\n",[993,1660,1661,1663,1665,1667],{"class":995,"line":1219},[993,1662,1313],{"class":1134},[993,1664,1138],{"class":1003},[993,1666,1319],{"class":1318},[993,1668,1128],{"class":1003},[993,1670,1671,1673,1675,1677,1679,1681],{"class":995,"line":1251},[993,1672,1327],{"class":1134},[993,1674,1138],{"class":1003},[993,1676,1332],{"class":1007},[993,1678,1335],{"class":1095},[993,1680,1338],{"class":1007},[993,1682,1128],{"class":1003},[993,1684,1685,1687],{"class":995,"line":1310},[993,1686,1171],{"class":1003},[993,1688,1174],{"class":1007},[993,1690,1691,1693,1695,1697,1699,1701],{"class":995,"line":1324},[993,1692,1528],{"class":999},[993,1694,1229],{"class":1007},[993,1696,1197],{"class":1003},[993,1698,1535],{"class":1095},[993,1700,1300],{"class":1007},[993,1702,1540],{"class":1410},[993,1704,1705],{"class":995,"line":1343},[993,1706,1079],{"emptyLinePlaceholder":1078},[993,1708,1710,1712,1715,1717,1720,1722,1724,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1753,1755,1758],{"class":995,"line":1709},19,[993,1711,1528],{"class":999},[993,1713,1714],{"class":1007}," invoices",[993,1716,1197],{"class":1003},[993,1718,1719],{"class":1095},"put",[993,1721,1116],{"class":1007},[993,1723,1146],{"class":1003},[993,1725,1726],{"class":1020},"i1",[993,1728,1146],{"class":1003},[993,1730,1037],{"class":1003},[993,1732,1004],{"class":1003},[993,1734,1271],{"class":1134},[993,1736,1138],{"class":1003},[993,1738,1017],{"class":1003},[993,1740,1726],{"class":1020},[993,1742,1146],{"class":1003},[993,1744,1037],{"class":1003},[993,1746,1288],{"class":1134},[993,1748,1138],{"class":1003},[993,1750,1752],{"class":1751},"sbssI"," 10",[993,1754,1011],{"class":1003},[993,1756,1757],{"class":1007},") ",[993,1759,1760],{"class":1410},"\u002F\u002F → resolves\n",[1394,1762,1764],{"id":1763},"a-non-additive-change-is-rejected","A non-additive change is rejected",[946,1766,1767,1768,1771],{},"Removing a field, changing a field's shape, or flipping required-ness is non-additive. ",[960,1769,1770],{},"additiveOnly()"," is the safety backstop — it rejects the change and every write throws until you fix the schema or add a migration strategy:",[984,1773,1775],{"className":986,"code":1774,"language":988,"meta":989,"style":989},"import { additiveOnly } from '@noy-db\u002Fhub'\n\n\u002F\u002F gen 1 removes 'amount' from the schema above — non-additive\nvault = await db.openVault('acme')\nconst invoices = vault.collection('invoices', {\n  schema: z.object({ id: z.string() }),\n  persistJsonSchema: true,\n  schemaUpdate: [additiveOnly()],\n})\nawait vault._drainPendingSchemaWrites()\n\nawait invoices.put('i1', { id: 'i1' })\n\u002F\u002F → throws NonAdditiveSchemaChangeError:\n\u002F\u002F 'Non-additive schema change to \"invoices\" (added: [], removed: [amount], changed: []).\n\u002F\u002F  Register a coordinatedCutover() strategy to migrate, or revert the change.'\n",[960,1776,1777,1795,1799,1804,1828,1854,1888,1898,1912,1918,1930,1934,1970,1975,1980],{"__ignoreMap":989},[993,1778,1779,1781,1783,1785,1787,1789,1791,1793],{"class":995,"line":996},[993,1780,1000],{"class":999},[993,1782,1004],{"class":1003},[993,1784,1040],{"class":1007},[993,1786,1011],{"class":1003},[993,1788,1014],{"class":999},[993,1790,1017],{"class":1003},[993,1792,1049],{"class":1020},[993,1794,1024],{"class":1003},[993,1796,1797],{"class":995,"line":1027},[993,1798,1079],{"emptyLinePlaceholder":1078},[993,1800,1801],{"class":995,"line":1054},[993,1802,1803],{"class":1410},"\u002F\u002F gen 1 removes 'amount' from the schema above — non-additive\n",[993,1805,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826],{"class":995,"line":1075},[993,1807,1554],{"class":1007},[993,1809,1092],{"class":1003},[993,1811,1111],{"class":999},[993,1813,1194],{"class":1007},[993,1815,1197],{"class":1003},[993,1817,1200],{"class":1095},[993,1819,1116],{"class":1007},[993,1821,1146],{"class":1003},[993,1823,1207],{"class":1020},[993,1825,1146],{"class":1003},[993,1827,1174],{"class":1007},[993,1829,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852],{"class":995,"line":1082},[993,1831,1086],{"class":1085},[993,1833,1224],{"class":1007},[993,1835,1092],{"class":1003},[993,1837,1229],{"class":1007},[993,1839,1197],{"class":1003},[993,1841,1234],{"class":1095},[993,1843,1116],{"class":1007},[993,1845,1146],{"class":1003},[993,1847,1241],{"class":1020},[993,1849,1146],{"class":1003},[993,1851,1037],{"class":1003},[993,1853,1248],{"class":1003},[993,1855,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886],{"class":995,"line":1101},[993,1857,1254],{"class":1134},[993,1859,1138],{"class":1003},[993,1861,1008],{"class":1007},[993,1863,1197],{"class":1003},[993,1865,1263],{"class":1095},[993,1867,1116],{"class":1007},[993,1869,1268],{"class":1003},[993,1871,1271],{"class":1134},[993,1873,1138],{"class":1003},[993,1875,1008],{"class":1007},[993,1877,1197],{"class":1003},[993,1879,1280],{"class":1095},[993,1881,1300],{"class":1007},[993,1883,1171],{"class":1003},[993,1885,1305],{"class":1007},[993,1887,1128],{"class":1003},[993,1889,1890,1892,1894,1896],{"class":995,"line":1122},[993,1891,1313],{"class":1134},[993,1893,1138],{"class":1003},[993,1895,1319],{"class":1318},[993,1897,1128],{"class":1003},[993,1899,1900,1902,1904,1906,1908,1910],{"class":995,"line":1131},[993,1901,1327],{"class":1134},[993,1903,1138],{"class":1003},[993,1905,1332],{"class":1007},[993,1907,1335],{"class":1095},[993,1909,1338],{"class":1007},[993,1911,1128],{"class":1003},[993,1913,1914,1916],{"class":995,"line":1151},[993,1915,1171],{"class":1003},[993,1917,1174],{"class":1007},[993,1919,1920,1922,1924,1926,1928],{"class":995,"line":1168},[993,1921,1528],{"class":999},[993,1923,1229],{"class":1007},[993,1925,1197],{"class":1003},[993,1927,1535],{"class":1095},[993,1929,1098],{"class":1007},[993,1931,1932],{"class":995,"line":1177},[993,1933,1079],{"emptyLinePlaceholder":1078},[993,1935,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968],{"class":995,"line":1182},[993,1937,1528],{"class":999},[993,1939,1714],{"class":1007},[993,1941,1197],{"class":1003},[993,1943,1719],{"class":1095},[993,1945,1116],{"class":1007},[993,1947,1146],{"class":1003},[993,1949,1726],{"class":1020},[993,1951,1146],{"class":1003},[993,1953,1037],{"class":1003},[993,1955,1004],{"class":1003},[993,1957,1271],{"class":1134},[993,1959,1138],{"class":1003},[993,1961,1017],{"class":1003},[993,1963,1726],{"class":1020},[993,1965,1146],{"class":1003},[993,1967,1011],{"class":1003},[993,1969,1174],{"class":1007},[993,1971,1972],{"class":995,"line":1214},[993,1973,1974],{"class":1410},"\u002F\u002F → throws NonAdditiveSchemaChangeError:\n",[993,1976,1977],{"class":995,"line":1219},[993,1978,1979],{"class":1410},"\u002F\u002F 'Non-additive schema change to \"invoices\" (added: [], removed: [amount], changed: []).\n",[993,1981,1982],{"class":995,"line":1251},[993,1983,1984],{"class":1410},"\u002F\u002F  Register a coordinatedCutover() strategy to migrate, or revert the change.'\n",[946,1986,1987,1988,1990,1991,1994,1995,1998],{},"The rejection happens at write time (",[960,1989,1719],{},"\u002F",[960,1992,1993],{},"delete","), not at ",[960,1996,1997],{},"vault.collection()"," — registering a collection with a rejected schema change never throws; only the next write does.",[1394,2000,2002],{"id":2001},"locking-a-collection-outright","Locking a collection outright",[946,2004,2005,2008,2009,2012,2013,2016,2017,2019,2020,2022],{},[960,2006,2007],{},"lockSchema()"," refuses any schema change (or, with ",[960,2010,2011],{},"fields",", only changes that touch specific fields) regardless of whether the change would otherwise be additive. Strategies run in order and the first non-",[960,2014,2015],{},"allow"," decision wins, so putting ",[960,2018,2007],{}," before ",[960,2021,1770],{}," makes the lock take precedence:",[984,2024,2026],{"className":986,"code":2025,"language":988,"meta":989,"style":989},"import { lockSchema, additiveOnly } from '@noy-db\u002Fhub'\n\nvault = await db.openVault('acme')\nconst invoices = vault.collection('invoices', {\n  schema: z.object({ id: z.string(), note: z.string().optional() }), \u002F\u002F additive, but locked\n  persistJsonSchema: true,\n  schemaUpdate: [lockSchema(), additiveOnly()],\n})\nawait vault._drainPendingSchemaWrites()\n\nawait invoices.put('i1', { id: 'i1' })\n\u002F\u002F → throws SchemaLockedError:\n\u002F\u002F 'Schema for \"invoices\" is locked; the change was refused.'\n",[960,2027,2028,2051,2055,2079,2105,2163,2173,2194,2200,2212,2216,2252,2257],{"__ignoreMap":989},[993,2029,2030,2032,2034,2037,2039,2041,2043,2045,2047,2049],{"class":995,"line":996},[993,2031,1000],{"class":999},[993,2033,1004],{"class":1003},[993,2035,2036],{"class":1007}," lockSchema",[993,2038,1037],{"class":1003},[993,2040,1040],{"class":1007},[993,2042,1011],{"class":1003},[993,2044,1014],{"class":999},[993,2046,1017],{"class":1003},[993,2048,1049],{"class":1020},[993,2050,1024],{"class":1003},[993,2052,2053],{"class":995,"line":1027},[993,2054,1079],{"emptyLinePlaceholder":1078},[993,2056,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077],{"class":995,"line":1054},[993,2058,1554],{"class":1007},[993,2060,1092],{"class":1003},[993,2062,1111],{"class":999},[993,2064,1194],{"class":1007},[993,2066,1197],{"class":1003},[993,2068,1200],{"class":1095},[993,2070,1116],{"class":1007},[993,2072,1146],{"class":1003},[993,2074,1207],{"class":1020},[993,2076,1146],{"class":1003},[993,2078,1174],{"class":1007},[993,2080,2081,2083,2085,2087,2089,2091,2093,2095,2097,2099,2101,2103],{"class":995,"line":1075},[993,2082,1086],{"class":1085},[993,2084,1224],{"class":1007},[993,2086,1092],{"class":1003},[993,2088,1229],{"class":1007},[993,2090,1197],{"class":1003},[993,2092,1234],{"class":1095},[993,2094,1116],{"class":1007},[993,2096,1146],{"class":1003},[993,2098,1241],{"class":1020},[993,2100,1146],{"class":1003},[993,2102,1037],{"class":1003},[993,2104,1248],{"class":1003},[993,2106,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2135,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160],{"class":995,"line":1082},[993,2108,1254],{"class":1134},[993,2110,1138],{"class":1003},[993,2112,1008],{"class":1007},[993,2114,1197],{"class":1003},[993,2116,1263],{"class":1095},[993,2118,1116],{"class":1007},[993,2120,1268],{"class":1003},[993,2122,1271],{"class":1134},[993,2124,1138],{"class":1003},[993,2126,1008],{"class":1007},[993,2128,1197],{"class":1003},[993,2130,1280],{"class":1095},[993,2132,1283],{"class":1007},[993,2134,1037],{"class":1003},[993,2136,2137],{"class":1134}," note",[993,2139,1138],{"class":1003},[993,2141,1008],{"class":1007},[993,2143,1197],{"class":1003},[993,2145,1280],{"class":1095},[993,2147,1283],{"class":1007},[993,2149,1197],{"class":1003},[993,2151,1647],{"class":1095},[993,2153,1300],{"class":1007},[993,2155,1171],{"class":1003},[993,2157,1305],{"class":1007},[993,2159,1037],{"class":1003},[993,2161,2162],{"class":1410}," \u002F\u002F additive, but locked\n",[993,2164,2165,2167,2169,2171],{"class":995,"line":1101},[993,2166,1313],{"class":1134},[993,2168,1138],{"class":1003},[993,2170,1319],{"class":1318},[993,2172,1128],{"class":1003},[993,2174,2175,2177,2179,2181,2184,2186,2188,2190,2192],{"class":995,"line":1122},[993,2176,1327],{"class":1134},[993,2178,1138],{"class":1003},[993,2180,1332],{"class":1007},[993,2182,2183],{"class":1095},"lockSchema",[993,2185,1283],{"class":1007},[993,2187,1037],{"class":1003},[993,2189,1040],{"class":1095},[993,2191,1338],{"class":1007},[993,2193,1128],{"class":1003},[993,2195,2196,2198],{"class":995,"line":1131},[993,2197,1171],{"class":1003},[993,2199,1174],{"class":1007},[993,2201,2202,2204,2206,2208,2210],{"class":995,"line":1151},[993,2203,1528],{"class":999},[993,2205,1229],{"class":1007},[993,2207,1197],{"class":1003},[993,2209,1535],{"class":1095},[993,2211,1098],{"class":1007},[993,2213,2214],{"class":995,"line":1168},[993,2215,1079],{"emptyLinePlaceholder":1078},[993,2217,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250],{"class":995,"line":1177},[993,2219,1528],{"class":999},[993,2221,1714],{"class":1007},[993,2223,1197],{"class":1003},[993,2225,1719],{"class":1095},[993,2227,1116],{"class":1007},[993,2229,1146],{"class":1003},[993,2231,1726],{"class":1020},[993,2233,1146],{"class":1003},[993,2235,1037],{"class":1003},[993,2237,1004],{"class":1003},[993,2239,1271],{"class":1134},[993,2241,1138],{"class":1003},[993,2243,1017],{"class":1003},[993,2245,1726],{"class":1020},[993,2247,1146],{"class":1003},[993,2249,1011],{"class":1003},[993,2251,1174],{"class":1007},[993,2253,2254],{"class":995,"line":1182},[993,2255,2256],{"class":1410},"\u002F\u002F → throws SchemaLockedError:\n",[993,2258,2259],{"class":995,"line":1214},[993,2260,2261],{"class":1410},"\u002F\u002F 'Schema for \"invoices\" is locked; the change was refused.'\n",[1394,2263,2265],{"id":2264},"a-coordinated-cutover-migrates-existing-records","A coordinated cutover migrates existing records",[946,2267,2268,2269,2272,2273,2276],{},"Some non-additive changes are legitimate — a field is being reshaped, not dropped. ",[960,2270,2271],{},"coordinatedCutover()"," accepts the change but defers it: it registers a pending migration (a ",[960,2274,2275],{},"transform"," function run over every existing record) and fences the collection's writes until you explicitly run the cutover.",[984,2278,2280],{"className":986,"code":2279,"language":988,"meta":989,"style":989},"import { coordinatedCutover, additiveOnly } from '@noy-db\u002Fhub'\n\ninterface InvOld extends Record\u003Cstring, unknown> { id: string; total: number }\ninterface InvNew extends Record\u003Cstring, unknown> { id: string; amount: { gross: number } }\n\n\u002F\u002F gen 0: old shape, one record\nlet vault = await db.openVault('acme')\nconst oldInvoices = vault.collection\u003CInvOld>('invoices', {\n  schema: z.object({ id: z.string(), total: z.number() }),\n  persistJsonSchema: true,\n})\nawait vault._drainPendingSchemaWrites()\nawait oldInvoices.put('i1', { id: 'i1', total: 100 })\n\n\u002F\u002F gen 1: reshape `total` into `amount.gross` — non-additive\nvault = await db.openVault('acme')\nconst invoices = vault.collection\u003CInvNew>('invoices', {\n  schema: z.object({ id: z.string(), amount: z.object({ gross: z.number() }) }),\n  persistJsonSchema: true,\n  schemaUpdate: [\n    coordinatedCutover({ transform: (d) => ({ id: d['id'], amount: { gross: d['total'] } }) }),\n    additiveOnly(),\n  ],\n})\nawait vault._drainPendingSchemaWrites()\n\nawait invoices.put('i2', { id: 'i2', amount: { gross: 5 } })\n\u002F\u002F → throws SchemaFenceError: writes are blocked while the cutover is pending\n\nconst result = await vault.runSchemaCutover()\nresult.migrated \u002F\u002F → 1  (i1 rewritten in place through the transform)\n\nconst i1 = await invoices.get('i1')\ni1?.amount.gross \u002F\u002F → 100\n\nawait invoices.put('i2', { id: 'i2', amount: { gross: 5 } }) \u002F\u002F → resolves — the fence is clear\n",[960,2281,2282,2305,2309,2360,2408,2412,2417,2443,2477,2525,2535,2541,2553,2599,2603,2608,2632,2665,2731,2741,2751,2835,2845,2853,2860,2873,2878,2933,2939,2944,2965,2979,2984,3013,3032,3037],{"__ignoreMap":989},[993,2283,2284,2286,2288,2291,2293,2295,2297,2299,2301,2303],{"class":995,"line":996},[993,2285,1000],{"class":999},[993,2287,1004],{"class":1003},[993,2289,2290],{"class":1007}," coordinatedCutover",[993,2292,1037],{"class":1003},[993,2294,1040],{"class":1007},[993,2296,1011],{"class":1003},[993,2298,1014],{"class":999},[993,2300,1017],{"class":1003},[993,2302,1049],{"class":1020},[993,2304,1024],{"class":1003},[993,2306,2307],{"class":995,"line":1027},[993,2308,1079],{"emptyLinePlaceholder":1078},[993,2310,2311,2314,2318,2321,2324,2327,2329,2331,2334,2337,2339,2341,2343,2346,2349,2352,2354,2357],{"class":995,"line":1054},[993,2312,2313],{"class":1085},"interface",[993,2315,2317],{"class":2316},"sBMFI"," InvOld",[993,2319,2320],{"class":1085}," extends",[993,2322,2323],{"class":2316}," Record",[993,2325,2326],{"class":1003},"\u003C",[993,2328,1280],{"class":2316},[993,2330,1037],{"class":1003},[993,2332,2333],{"class":2316}," unknown",[993,2335,2336],{"class":1003},">",[993,2338,1004],{"class":1003},[993,2340,1271],{"class":1134},[993,2342,1138],{"class":1003},[993,2344,2345],{"class":2316}," string",[993,2347,2348],{"class":1003},";",[993,2350,2351],{"class":1134}," total",[993,2353,1138],{"class":1003},[993,2355,2356],{"class":2316}," number",[993,2358,2359],{"class":1003}," }\n",[993,2361,2362,2364,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397,2400,2402,2404,2406],{"class":995,"line":1075},[993,2363,2313],{"class":1085},[993,2365,2366],{"class":2316}," InvNew",[993,2368,2320],{"class":1085},[993,2370,2323],{"class":2316},[993,2372,2326],{"class":1003},[993,2374,1280],{"class":2316},[993,2376,1037],{"class":1003},[993,2378,2333],{"class":2316},[993,2380,2336],{"class":1003},[993,2382,1004],{"class":1003},[993,2384,1271],{"class":1134},[993,2386,1138],{"class":1003},[993,2388,2345],{"class":2316},[993,2390,2348],{"class":1003},[993,2392,1288],{"class":1134},[993,2394,1138],{"class":1003},[993,2396,1004],{"class":1003},[993,2398,2399],{"class":1134}," gross",[993,2401,1138],{"class":1003},[993,2403,2356],{"class":2316},[993,2405,1011],{"class":1003},[993,2407,2359],{"class":1003},[993,2409,2410],{"class":995,"line":1082},[993,2411,1079],{"emptyLinePlaceholder":1078},[993,2413,2414],{"class":995,"line":1101},[993,2415,2416],{"class":1410},"\u002F\u002F gen 0: old shape, one record\n",[993,2418,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441],{"class":995,"line":1122},[993,2420,1416],{"class":1085},[993,2422,1187],{"class":1007},[993,2424,1092],{"class":1003},[993,2426,1111],{"class":999},[993,2428,1194],{"class":1007},[993,2430,1197],{"class":1003},[993,2432,1200],{"class":1095},[993,2434,1116],{"class":1007},[993,2436,1146],{"class":1003},[993,2438,1207],{"class":1020},[993,2440,1146],{"class":1003},[993,2442,1174],{"class":1007},[993,2444,2445,2447,2450,2452,2454,2456,2458,2460,2463,2465,2467,2469,2471,2473,2475],{"class":995,"line":1131},[993,2446,1086],{"class":1085},[993,2448,2449],{"class":1007}," oldInvoices ",[993,2451,1092],{"class":1003},[993,2453,1229],{"class":1007},[993,2455,1197],{"class":1003},[993,2457,1234],{"class":1095},[993,2459,2326],{"class":1003},[993,2461,2462],{"class":2316},"InvOld",[993,2464,2336],{"class":1003},[993,2466,1116],{"class":1007},[993,2468,1146],{"class":1003},[993,2470,1241],{"class":1020},[993,2472,1146],{"class":1003},[993,2474,1037],{"class":1003},[993,2476,1248],{"class":1003},[993,2478,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523],{"class":995,"line":1151},[993,2480,1254],{"class":1134},[993,2482,1138],{"class":1003},[993,2484,1008],{"class":1007},[993,2486,1197],{"class":1003},[993,2488,1263],{"class":1095},[993,2490,1116],{"class":1007},[993,2492,1268],{"class":1003},[993,2494,1271],{"class":1134},[993,2496,1138],{"class":1003},[993,2498,1008],{"class":1007},[993,2500,1197],{"class":1003},[993,2502,1280],{"class":1095},[993,2504,1283],{"class":1007},[993,2506,1037],{"class":1003},[993,2508,2351],{"class":1134},[993,2510,1138],{"class":1003},[993,2512,1008],{"class":1007},[993,2514,1197],{"class":1003},[993,2516,1297],{"class":1095},[993,2518,1300],{"class":1007},[993,2520,1171],{"class":1003},[993,2522,1305],{"class":1007},[993,2524,1128],{"class":1003},[993,2526,2527,2529,2531,2533],{"class":995,"line":1168},[993,2528,1313],{"class":1134},[993,2530,1138],{"class":1003},[993,2532,1319],{"class":1318},[993,2534,1128],{"class":1003},[993,2536,2537,2539],{"class":995,"line":1177},[993,2538,1171],{"class":1003},[993,2540,1174],{"class":1007},[993,2542,2543,2545,2547,2549,2551],{"class":995,"line":1182},[993,2544,1528],{"class":999},[993,2546,1229],{"class":1007},[993,2548,1197],{"class":1003},[993,2550,1535],{"class":1095},[993,2552,1098],{"class":1007},[993,2554,2555,2557,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2595,2597],{"class":995,"line":1214},[993,2556,1528],{"class":999},[993,2558,2559],{"class":1007}," oldInvoices",[993,2561,1197],{"class":1003},[993,2563,1719],{"class":1095},[993,2565,1116],{"class":1007},[993,2567,1146],{"class":1003},[993,2569,1726],{"class":1020},[993,2571,1146],{"class":1003},[993,2573,1037],{"class":1003},[993,2575,1004],{"class":1003},[993,2577,1271],{"class":1134},[993,2579,1138],{"class":1003},[993,2581,1017],{"class":1003},[993,2583,1726],{"class":1020},[993,2585,1146],{"class":1003},[993,2587,1037],{"class":1003},[993,2589,2351],{"class":1134},[993,2591,1138],{"class":1003},[993,2593,2594],{"class":1751}," 100",[993,2596,1011],{"class":1003},[993,2598,1174],{"class":1007},[993,2600,2601],{"class":995,"line":1219},[993,2602,1079],{"emptyLinePlaceholder":1078},[993,2604,2605],{"class":995,"line":1251},[993,2606,2607],{"class":1410},"\u002F\u002F gen 1: reshape `total` into `amount.gross` — non-additive\n",[993,2609,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630],{"class":995,"line":1310},[993,2611,1554],{"class":1007},[993,2613,1092],{"class":1003},[993,2615,1111],{"class":999},[993,2617,1194],{"class":1007},[993,2619,1197],{"class":1003},[993,2621,1200],{"class":1095},[993,2623,1116],{"class":1007},[993,2625,1146],{"class":1003},[993,2627,1207],{"class":1020},[993,2629,1146],{"class":1003},[993,2631,1174],{"class":1007},[993,2633,2634,2636,2638,2640,2642,2644,2646,2648,2651,2653,2655,2657,2659,2661,2663],{"class":995,"line":1324},[993,2635,1086],{"class":1085},[993,2637,1224],{"class":1007},[993,2639,1092],{"class":1003},[993,2641,1229],{"class":1007},[993,2643,1197],{"class":1003},[993,2645,1234],{"class":1095},[993,2647,2326],{"class":1003},[993,2649,2650],{"class":2316},"InvNew",[993,2652,2336],{"class":1003},[993,2654,1116],{"class":1007},[993,2656,1146],{"class":1003},[993,2658,1241],{"class":1020},[993,2660,1146],{"class":1003},[993,2662,1037],{"class":1003},[993,2664,1248],{"class":1003},[993,2666,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729],{"class":995,"line":1343},[993,2668,1254],{"class":1134},[993,2670,1138],{"class":1003},[993,2672,1008],{"class":1007},[993,2674,1197],{"class":1003},[993,2676,1263],{"class":1095},[993,2678,1116],{"class":1007},[993,2680,1268],{"class":1003},[993,2682,1271],{"class":1134},[993,2684,1138],{"class":1003},[993,2686,1008],{"class":1007},[993,2688,1197],{"class":1003},[993,2690,1280],{"class":1095},[993,2692,1283],{"class":1007},[993,2694,1037],{"class":1003},[993,2696,1288],{"class":1134},[993,2698,1138],{"class":1003},[993,2700,1008],{"class":1007},[993,2702,1197],{"class":1003},[993,2704,1263],{"class":1095},[993,2706,1116],{"class":1007},[993,2708,1268],{"class":1003},[993,2710,2399],{"class":1134},[993,2712,1138],{"class":1003},[993,2714,1008],{"class":1007},[993,2716,1197],{"class":1003},[993,2718,1297],{"class":1095},[993,2720,1300],{"class":1007},[993,2722,1171],{"class":1003},[993,2724,1757],{"class":1007},[993,2726,1171],{"class":1003},[993,2728,1305],{"class":1007},[993,2730,1128],{"class":1003},[993,2732,2733,2735,2737,2739],{"class":995,"line":1709},[993,2734,1313],{"class":1134},[993,2736,1138],{"class":1003},[993,2738,1319],{"class":1318},[993,2740,1128],{"class":1003},[993,2742,2744,2746,2748],{"class":995,"line":2743},20,[993,2745,1327],{"class":1134},[993,2747,1138],{"class":1003},[993,2749,2750],{"class":1007}," [\n",[993,2752,2754,2757,2759,2761,2764,2766,2769,2773,2775,2778,2780,2782,2784,2786,2789,2791,2794,2796,2799,2801,2803,2805,2807,2809,2811,2813,2815,2818,2820,2823,2825,2827,2829,2831,2833],{"class":995,"line":2753},21,[993,2755,2756],{"class":1095},"    coordinatedCutover",[993,2758,1116],{"class":1007},[993,2760,1268],{"class":1003},[993,2762,2763],{"class":1095}," transform",[993,2765,1138],{"class":1003},[993,2767,2768],{"class":1003}," (",[993,2770,2772],{"class":2771},"sHdIc","d",[993,2774,1305],{"class":1003},[993,2776,2777],{"class":1085}," =>",[993,2779,2768],{"class":1007},[993,2781,1268],{"class":1003},[993,2783,1271],{"class":1134},[993,2785,1138],{"class":1003},[993,2787,2788],{"class":1007}," d[",[993,2790,1146],{"class":1003},[993,2792,2793],{"class":1020},"id",[993,2795,1146],{"class":1003},[993,2797,2798],{"class":1007},"]",[993,2800,1037],{"class":1003},[993,2802,1288],{"class":1134},[993,2804,1138],{"class":1003},[993,2806,1004],{"class":1003},[993,2808,2399],{"class":1134},[993,2810,1138],{"class":1003},[993,2812,2788],{"class":1007},[993,2814,1146],{"class":1003},[993,2816,2817],{"class":1020},"total",[993,2819,1146],{"class":1003},[993,2821,2822],{"class":1007},"] ",[993,2824,1171],{"class":1003},[993,2826,1011],{"class":1003},[993,2828,1757],{"class":1007},[993,2830,1171],{"class":1003},[993,2832,1305],{"class":1007},[993,2834,1128],{"class":1003},[993,2836,2838,2841,2843],{"class":995,"line":2837},22,[993,2839,2840],{"class":1095},"    additiveOnly",[993,2842,1283],{"class":1007},[993,2844,1128],{"class":1003},[993,2846,2848,2851],{"class":995,"line":2847},23,[993,2849,2850],{"class":1007},"  ]",[993,2852,1128],{"class":1003},[993,2854,2856,2858],{"class":995,"line":2855},24,[993,2857,1171],{"class":1003},[993,2859,1174],{"class":1007},[993,2861,2863,2865,2867,2869,2871],{"class":995,"line":2862},25,[993,2864,1528],{"class":999},[993,2866,1229],{"class":1007},[993,2868,1197],{"class":1003},[993,2870,1535],{"class":1095},[993,2872,1098],{"class":1007},[993,2874,2876],{"class":995,"line":2875},26,[993,2877,1079],{"emptyLinePlaceholder":1078},[993,2879,2881,2883,2885,2887,2889,2891,2893,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2927,2929,2931],{"class":995,"line":2880},27,[993,2882,1528],{"class":999},[993,2884,1714],{"class":1007},[993,2886,1197],{"class":1003},[993,2888,1719],{"class":1095},[993,2890,1116],{"class":1007},[993,2892,1146],{"class":1003},[993,2894,2895],{"class":1020},"i2",[993,2897,1146],{"class":1003},[993,2899,1037],{"class":1003},[993,2901,1004],{"class":1003},[993,2903,1271],{"class":1134},[993,2905,1138],{"class":1003},[993,2907,1017],{"class":1003},[993,2909,2895],{"class":1020},[993,2911,1146],{"class":1003},[993,2913,1037],{"class":1003},[993,2915,1288],{"class":1134},[993,2917,1138],{"class":1003},[993,2919,1004],{"class":1003},[993,2921,2399],{"class":1134},[993,2923,1138],{"class":1003},[993,2925,2926],{"class":1751}," 5",[993,2928,1011],{"class":1003},[993,2930,1011],{"class":1003},[993,2932,1174],{"class":1007},[993,2934,2936],{"class":995,"line":2935},28,[993,2937,2938],{"class":1410},"\u002F\u002F → throws SchemaFenceError: writes are blocked while the cutover is pending\n",[993,2940,2942],{"class":995,"line":2941},29,[993,2943,1079],{"emptyLinePlaceholder":1078},[993,2945,2947,2949,2952,2954,2956,2958,2960,2963],{"class":995,"line":2946},30,[993,2948,1086],{"class":1085},[993,2950,2951],{"class":1007}," result ",[993,2953,1092],{"class":1003},[993,2955,1111],{"class":999},[993,2957,1229],{"class":1007},[993,2959,1197],{"class":1003},[993,2961,2962],{"class":1095},"runSchemaCutover",[993,2964,1098],{"class":1007},[993,2966,2968,2971,2973,2976],{"class":995,"line":2967},31,[993,2969,2970],{"class":1007},"result",[993,2972,1197],{"class":1003},[993,2974,2975],{"class":1007},"migrated ",[993,2977,2978],{"class":1410},"\u002F\u002F → 1  (i1 rewritten in place through the transform)\n",[993,2980,2982],{"class":995,"line":2981},32,[993,2983,1079],{"emptyLinePlaceholder":1078},[993,2985,2987,2989,2992,2994,2996,2998,3000,3003,3005,3007,3009,3011],{"class":995,"line":2986},33,[993,2988,1086],{"class":1085},[993,2990,2991],{"class":1007}," i1 ",[993,2993,1092],{"class":1003},[993,2995,1111],{"class":999},[993,2997,1714],{"class":1007},[993,2999,1197],{"class":1003},[993,3001,3002],{"class":1095},"get",[993,3004,1116],{"class":1007},[993,3006,1146],{"class":1003},[993,3008,1726],{"class":1020},[993,3010,1146],{"class":1003},[993,3012,1174],{"class":1007},[993,3014,3016,3018,3021,3024,3026,3029],{"class":995,"line":3015},34,[993,3017,1726],{"class":1007},[993,3019,3020],{"class":1003},"?.",[993,3022,3023],{"class":1007},"amount",[993,3025,1197],{"class":1003},[993,3027,3028],{"class":1007},"gross ",[993,3030,3031],{"class":1410},"\u002F\u002F → 100\n",[993,3033,3035],{"class":995,"line":3034},35,[993,3036,1079],{"emptyLinePlaceholder":1078},[993,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090],{"class":995,"line":3039},36,[993,3041,1528],{"class":999},[993,3043,1714],{"class":1007},[993,3045,1197],{"class":1003},[993,3047,1719],{"class":1095},[993,3049,1116],{"class":1007},[993,3051,1146],{"class":1003},[993,3053,2895],{"class":1020},[993,3055,1146],{"class":1003},[993,3057,1037],{"class":1003},[993,3059,1004],{"class":1003},[993,3061,1271],{"class":1134},[993,3063,1138],{"class":1003},[993,3065,1017],{"class":1003},[993,3067,2895],{"class":1020},[993,3069,1146],{"class":1003},[993,3071,1037],{"class":1003},[993,3073,1288],{"class":1134},[993,3075,1138],{"class":1003},[993,3077,1004],{"class":1003},[993,3079,2399],{"class":1134},[993,3081,1138],{"class":1003},[993,3083,2926],{"class":1751},[993,3085,1011],{"class":1003},[993,3087,1011],{"class":1003},[993,3089,1757],{"class":1007},[993,3091,3092],{"class":1410},"\u002F\u002F → resolves — the fence is clear\n",[946,3094,3095,3098,3099,3103],{},[960,3096,3097],{},"runSchemaCutover()"," waits for every other active client on the vault to acknowledge the pending schema generation (a drain barrier) before it rewrites records and clears the fence — see ",[955,3100,3102],{"href":3101},"#limits-gotchas","Limits & gotchas"," for the timeout and stale-client behavior.",[941,3105,3107],{"id":3106},"api-reference","API reference",[946,3109,3110,3111,3113],{},"All exports below come from the ",[960,3112,1049],{}," root.",[1394,3115,3117],{"id":3116},"blindupdate",[960,3118,3119],{},"blindUpdate()",[984,3121,3123],{"className":986,"code":3122,"language":988,"meta":989,"style":989},"function blindUpdate(): SchemaUpdateStrategy\n",[960,3124,3125],{"__ignoreMap":989},[993,3126,3127,3130,3133,3136],{"class":995,"line":996},[993,3128,3129],{"class":1085},"function",[993,3131,3132],{"class":1095}," blindUpdate",[993,3134,3135],{"class":1003},"():",[993,3137,3138],{"class":2316}," SchemaUpdateStrategy\n",[946,3140,3141,3142,3144],{},"Allows every schema change unconditionally. Explicit opt-in to the pre-schema-update, back-compat behavior — useful as a documented no-op strategy rather than omitting ",[960,3143,1352],{}," entirely.",[1394,3146,3148],{"id":3147},"additiveonly",[960,3149,1770],{},[984,3151,3153],{"className":986,"code":3152,"language":988,"meta":989,"style":989},"function additiveOnly(): SchemaUpdateStrategy\n",[960,3154,3155],{"__ignoreMap":989},[993,3156,3157,3159,3161,3163],{"class":995,"line":996},[993,3158,3129],{"class":1085},[993,3160,1040],{"class":1095},[993,3162,3135],{"class":1003},[993,3164,3138],{"class":2316},[946,3166,3167,3168,3171],{},"Allows additive changes (new optional fields only); rejects anything else with ",[960,3169,3170],{},"NonAdditiveSchemaChangeError",". The recommended default safety backstop.",[1394,3173,3175],{"id":3174},"lockschemaopts",[960,3176,3177],{},"lockSchema(opts?)",[984,3179,3181],{"className":986,"code":3180,"language":988,"meta":989,"style":989},"function lockSchema(opts?: { readonly fields?: readonly string[] }): SchemaUpdateStrategy\n",[960,3182,3183],{"__ignoreMap":989},[993,3184,3185,3187,3189,3191,3194,3197,3199,3202,3205,3207,3209,3211,3214,3217],{"class":995,"line":996},[993,3186,3129],{"class":1085},[993,3188,2036],{"class":1095},[993,3190,1116],{"class":1003},[993,3192,3193],{"class":2771},"opts",[993,3195,3196],{"class":1003},"?:",[993,3198,1004],{"class":1003},[993,3200,3201],{"class":1085}," readonly",[993,3203,3204],{"class":1134}," fields",[993,3206,3196],{"class":1003},[993,3208,3201],{"class":1085},[993,3210,2345],{"class":2316},[993,3212,3213],{"class":1007},"[] ",[993,3215,3216],{"class":1003},"}):",[993,3218,3138],{"class":2316},[946,3220,3221,3222,3225,3226,3229],{},"Rejects any schema change with ",[960,3223,3224],{},"SchemaLockedError",". With ",[960,3227,3228],{},"opts.fields",", only rejects when one of the listed fields was added, removed, or changed — changes to other fields are allowed through to the next strategy.",[1394,3231,3233],{"id":3232},"coordinatedcutoveropts",[960,3234,3235],{},"coordinatedCutover(opts)",[984,3237,3239],{"className":986,"code":3238,"language":988,"meta":989,"style":989},"function coordinatedCutover(opts: { readonly transform: TransformFn }): SchemaUpdateStrategy\n",[960,3240,3241],{"__ignoreMap":989},[993,3242,3243,3245,3247,3249,3251,3253,3255,3257,3259,3261,3264,3267],{"class":995,"line":996},[993,3244,3129],{"class":1085},[993,3246,2290],{"class":1095},[993,3248,1116],{"class":1003},[993,3250,3193],{"class":2771},[993,3252,1138],{"class":1003},[993,3254,1004],{"class":1003},[993,3256,3201],{"class":1085},[993,3258,2763],{"class":1134},[993,3260,1138],{"class":1003},[993,3262,3263],{"class":2316}," TransformFn",[993,3265,3266],{"class":1003}," }):",[993,3268,3138],{"class":2316},[946,3270,3271,3274,3275,3278,3279,3282,3283,3285,3286,3288,3289,3292,3293,3299],{},[960,3272,3273],{},"opts.transform"," has the shape ",[960,3276,3277],{},"(doc: Record\u003Cstring, unknown>) => Record\u003Cstring, unknown>"," (its ",[960,3280,3281],{},"TransformFn"," type alias is internal, not exported from ",[960,3284,1049],{},"). On a non-additive delta, ",[960,3287,2271],{}," returns a ",[960,3290,3291],{},"cutover"," decision carrying that transform instead of rejecting. The transform runs once per existing record when ",[955,3294,3296],{"href":3295},"#vaultrunschemacutoveropts",[960,3297,3298],{},"vault.runSchemaCutover()"," executes; additive and unchanged deltas are allowed through untouched.",[1394,3301,3303],{"id":3302},"schemaupdatestrategy",[960,3304,3305],{},"SchemaUpdateStrategy",[984,3307,3309],{"className":986,"code":3308,"language":988,"meta":989,"style":989},"interface SchemaUpdateStrategy {\n  readonly name: string\n  onSchemaDelta(delta: SchemaDelta, ctx: UpdateContext): UpdateDecision | Promise\u003CUpdateDecision>\n}\n",[960,3310,3311,3320,3333,3378],{"__ignoreMap":989},[993,3312,3313,3315,3318],{"class":995,"line":996},[993,3314,2313],{"class":1085},[993,3316,3317],{"class":2316}," SchemaUpdateStrategy",[993,3319,1248],{"class":1003},[993,3321,3322,3325,3328,3330],{"class":995,"line":1027},[993,3323,3324],{"class":1085},"  readonly",[993,3326,3327],{"class":1134}," name",[993,3329,1138],{"class":1003},[993,3331,3332],{"class":2316}," string\n",[993,3334,3335,3338,3340,3343,3345,3348,3350,3353,3355,3358,3361,3364,3367,3370,3372,3375],{"class":995,"line":1054},[993,3336,3337],{"class":1134},"  onSchemaDelta",[993,3339,1116],{"class":1003},[993,3341,3342],{"class":2771},"delta",[993,3344,1138],{"class":1003},[993,3346,3347],{"class":2316}," SchemaDelta",[993,3349,1037],{"class":1003},[993,3351,3352],{"class":2771}," ctx",[993,3354,1138],{"class":1003},[993,3356,3357],{"class":2316}," UpdateContext",[993,3359,3360],{"class":1003},"):",[993,3362,3363],{"class":2316}," UpdateDecision",[993,3365,3366],{"class":1003}," |",[993,3368,3369],{"class":2316}," Promise",[993,3371,2326],{"class":1003},[993,3373,3374],{"class":2316},"UpdateDecision",[993,3376,3377],{"class":1003},">\n",[993,3379,3380],{"class":995,"line":1075},[993,3381,3382],{"class":1003},"}\n",[946,3384,3385,3386,3389,3390,3393,3394,3396,3397,1197],{},"The shape every strategy — built-in or your own — implements. ",[960,3387,3388],{},"evaluateStrategies"," (internal) runs a collection's strategy list in order against the detected ",[960,3391,3392],{},"SchemaDelta"," and returns the first non-",[960,3395,2015],{}," ",[960,3398,3374],{},[1394,3400,3402,3404,3405,3408],{"id":3401},"schemadelta-fieldchange-types",[960,3403,3392],{}," \u002F ",[960,3406,3407],{},"FieldChange"," (types)",[984,3410,3412],{"className":986,"code":3411,"language":988,"meta":989,"style":989},"interface SchemaDelta {\n  readonly collection: string\n  readonly kind: 'none' | 'additive' | 'non-additive'\n  readonly added: readonly string[]     \u002F\u002F new top-level properties\n  readonly removed: readonly string[]   \u002F\u002F removed top-level properties\n  readonly changed: readonly FieldChange[]\n}\n\ninterface FieldChange {\n  readonly field: string\n  readonly requiredChanged: boolean  \u002F\u002F required-ness flipped\n  readonly shapeChanged: boolean     \u002F\u002F subschema shape changed\n}\n",[960,3413,3414,3422,3433,3467,3486,3505,3522,3526,3530,3538,3549,3564,3578],{"__ignoreMap":989},[993,3415,3416,3418,3420],{"class":995,"line":996},[993,3417,2313],{"class":1085},[993,3419,3347],{"class":2316},[993,3421,1248],{"class":1003},[993,3423,3424,3426,3429,3431],{"class":995,"line":1027},[993,3425,3324],{"class":1085},[993,3427,3428],{"class":1134}," collection",[993,3430,1138],{"class":1003},[993,3432,3332],{"class":2316},[993,3434,3435,3437,3440,3442,3444,3447,3449,3451,3453,3456,3458,3460,3462,3465],{"class":995,"line":1054},[993,3436,3324],{"class":1085},[993,3438,3439],{"class":1134}," kind",[993,3441,1138],{"class":1003},[993,3443,1017],{"class":1003},[993,3445,3446],{"class":1020},"none",[993,3448,1146],{"class":1003},[993,3450,3366],{"class":1003},[993,3452,1017],{"class":1003},[993,3454,3455],{"class":1020},"additive",[993,3457,1146],{"class":1003},[993,3459,3366],{"class":1003},[993,3461,1017],{"class":1003},[993,3463,3464],{"class":1020},"non-additive",[993,3466,1024],{"class":1003},[993,3468,3469,3471,3474,3476,3478,3480,3483],{"class":995,"line":1075},[993,3470,3324],{"class":1085},[993,3472,3473],{"class":1134}," added",[993,3475,1138],{"class":1003},[993,3477,3201],{"class":1085},[993,3479,2345],{"class":2316},[993,3481,3482],{"class":1007},"[]     ",[993,3484,3485],{"class":1410},"\u002F\u002F new top-level properties\n",[993,3487,3488,3490,3493,3495,3497,3499,3502],{"class":995,"line":1082},[993,3489,3324],{"class":1085},[993,3491,3492],{"class":1134}," removed",[993,3494,1138],{"class":1003},[993,3496,3201],{"class":1085},[993,3498,2345],{"class":2316},[993,3500,3501],{"class":1007},"[]   ",[993,3503,3504],{"class":1410},"\u002F\u002F removed top-level properties\n",[993,3506,3507,3509,3512,3514,3516,3519],{"class":995,"line":1101},[993,3508,3324],{"class":1085},[993,3510,3511],{"class":1134}," changed",[993,3513,1138],{"class":1003},[993,3515,3201],{"class":1085},[993,3517,3518],{"class":2316}," FieldChange",[993,3520,3521],{"class":1007},"[]\n",[993,3523,3524],{"class":995,"line":1122},[993,3525,3382],{"class":1003},[993,3527,3528],{"class":995,"line":1131},[993,3529,1079],{"emptyLinePlaceholder":1078},[993,3531,3532,3534,3536],{"class":995,"line":1151},[993,3533,2313],{"class":1085},[993,3535,3518],{"class":2316},[993,3537,1248],{"class":1003},[993,3539,3540,3542,3545,3547],{"class":995,"line":1168},[993,3541,3324],{"class":1085},[993,3543,3544],{"class":1134}," field",[993,3546,1138],{"class":1003},[993,3548,3332],{"class":2316},[993,3550,3551,3553,3556,3558,3561],{"class":995,"line":1177},[993,3552,3324],{"class":1085},[993,3554,3555],{"class":1134}," requiredChanged",[993,3557,1138],{"class":1003},[993,3559,3560],{"class":2316}," boolean",[993,3562,3563],{"class":1410},"  \u002F\u002F required-ness flipped\n",[993,3565,3566,3568,3571,3573,3575],{"class":995,"line":1182},[993,3567,3324],{"class":1085},[993,3569,3570],{"class":1134}," shapeChanged",[993,3572,1138],{"class":1003},[993,3574,3560],{"class":2316},[993,3576,3577],{"class":1410},"     \u002F\u002F subschema shape changed\n",[993,3579,3580],{"class":995,"line":1214},[993,3581,3382],{"class":1003},[946,3583,3584,3585,3588,3589,3592,3593,3595,3596,3599,3600,3603,3604,1197],{},"The classified difference between the previously-persisted JSON Schema and the freshly-derived one, computed internally on every vault open. ",[960,3586,3587],{},"kind"," is ",[960,3590,3591],{},"'additive'"," only when every change is a new ",[950,3594,1647],{}," top-level property — any removal, shape change, required-ness flip, or new ",[950,3597,3598],{},"required"," property makes it ",[960,3601,3602],{},"'non-additive'",". Nested-object and union-level changes are not yet classified individually; see ",[955,3605,3102],{"href":3101},[1394,3607,3609,3404,3612,3408],{"id":3608},"updatecontext-updatedecision-types",[960,3610,3611],{},"UpdateContext",[960,3613,3374],{},[984,3615,3617],{"className":986,"code":3616,"language":988,"meta":989,"style":989},"interface UpdateContext {\n  readonly collection: string\n}\n\ntype UpdateDecision =\n  | { readonly action: 'allow' }\n  | { readonly action: 'reject'; readonly error: Error }\n  | { readonly action: 'cutover'; readonly transform: TransformFn }\n",[960,3618,3619,3627,3637,3641,3645,3655,3677,3710],{"__ignoreMap":989},[993,3620,3621,3623,3625],{"class":995,"line":996},[993,3622,2313],{"class":1085},[993,3624,3357],{"class":2316},[993,3626,1248],{"class":1003},[993,3628,3629,3631,3633,3635],{"class":995,"line":1027},[993,3630,3324],{"class":1085},[993,3632,3428],{"class":1134},[993,3634,1138],{"class":1003},[993,3636,3332],{"class":2316},[993,3638,3639],{"class":995,"line":1054},[993,3640,3382],{"class":1003},[993,3642,3643],{"class":995,"line":1075},[993,3644,1079],{"emptyLinePlaceholder":1078},[993,3646,3647,3650,3652],{"class":995,"line":1082},[993,3648,3649],{"class":1085},"type",[993,3651,3363],{"class":2316},[993,3653,3654],{"class":1003}," =\n",[993,3656,3657,3660,3662,3664,3667,3669,3671,3673,3675],{"class":995,"line":1101},[993,3658,3659],{"class":1003},"  |",[993,3661,1004],{"class":1003},[993,3663,3201],{"class":1085},[993,3665,3666],{"class":1134}," action",[993,3668,1138],{"class":1003},[993,3670,1017],{"class":1003},[993,3672,2015],{"class":1020},[993,3674,1146],{"class":1003},[993,3676,2359],{"class":1003},[993,3678,3679,3681,3683,3685,3687,3689,3691,3694,3696,3698,3700,3703,3705,3708],{"class":995,"line":1122},[993,3680,3659],{"class":1003},[993,3682,1004],{"class":1003},[993,3684,3201],{"class":1085},[993,3686,3666],{"class":1134},[993,3688,1138],{"class":1003},[993,3690,1017],{"class":1003},[993,3692,3693],{"class":1020},"reject",[993,3695,1146],{"class":1003},[993,3697,2348],{"class":1003},[993,3699,3201],{"class":1085},[993,3701,3702],{"class":1134}," error",[993,3704,1138],{"class":1003},[993,3706,3707],{"class":2316}," Error",[993,3709,2359],{"class":1003},[993,3711,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738],{"class":995,"line":1131},[993,3713,3659],{"class":1003},[993,3715,1004],{"class":1003},[993,3717,3201],{"class":1085},[993,3719,3666],{"class":1134},[993,3721,1138],{"class":1003},[993,3723,1017],{"class":1003},[993,3725,3291],{"class":1020},[993,3727,1146],{"class":1003},[993,3729,2348],{"class":1003},[993,3731,3201],{"class":1085},[993,3733,2763],{"class":1134},[993,3735,1138],{"class":1003},[993,3737,3263],{"class":2316},[993,3739,2359],{"class":1003},[946,3741,3742,3744,3745,3748,3749,3751,3752,3754,3755,1990,3757,3759],{},[960,3743,3611],{}," is what a strategy's ",[960,3746,3747],{},"onSchemaDelta"," receives alongside the delta. ",[960,3750,3374],{}," is its verdict: ",[960,3753,2015],{}," falls through to the next strategy, ",[960,3756,3693],{},[960,3758,3291],{}," are terminal.",[1394,3761,3763],{"id":3762},"vaultrunschemacutoveropts",[960,3764,3765],{},"vault.runSchemaCutover(opts?)",[984,3767,3769],{"className":986,"code":3768,"language":988,"meta":989,"style":989},"async runSchemaCutover(opts?: { onPoll?: () => Promise\u003Cvoid> }): Promise\u003C{ migrated: number }>\n",[960,3770,3771],{"__ignoreMap":989},[993,3772,3773,3776,3778,3781,3783,3785,3788,3790,3793,3795,3797,3800,3802,3805,3808,3811,3814,3816,3818],{"class":995,"line":996},[993,3774,3775],{"class":1007},"async ",[993,3777,2962],{"class":1095},[993,3779,3780],{"class":1007},"(opts",[993,3782,3196],{"class":1003},[993,3784,1004],{"class":1003},[993,3786,3787],{"class":1007}," onPoll?",[993,3789,1138],{"class":1003},[993,3791,3792],{"class":1003}," ()",[993,3794,2777],{"class":1085},[993,3796,3369],{"class":2316},[993,3798,3799],{"class":1003},"\u003Cvoid>",[993,3801,1011],{"class":1003},[993,3803,3804],{"class":1007},"): ",[993,3806,3807],{"class":2316},"Promise",[993,3809,3810],{"class":1003},"\u003C{",[993,3812,3813],{"class":2316}," migrated",[993,3815,1138],{"class":1003},[993,3817,2356],{"class":1007},[993,3819,3820],{"class":1003}," }>\n",[946,3822,3823,3824,3826,3827,3829,3830,3833],{},"Runs every pending ",[960,3825,962],{}," for this vault: waits for the active client set to quiesce (see ",[955,3828,3102],{"href":3101},"), applies each collection's transform to every existing record, bumps the vault's schema generation, and clears the fence. Returns how many collections were migrated. ",[960,3831,3832],{},"opts.onPoll"," is a test hook for advancing other simulated clients between barrier checks.",[1394,3835,3837],{"id":3836},"vaultabortschemacutover",[960,3838,3839],{},"vault.abortSchemaCutover()",[984,3841,3843],{"className":986,"code":3842,"language":988,"meta":989,"style":989},"async abortSchemaCutover(): Promise\u003Cvoid>\n",[960,3844,3845],{"__ignoreMap":989},[993,3846,3847,3849,3852,3855,3857],{"class":995,"line":996},[993,3848,3775],{"class":1007},[993,3850,3851],{"class":1095},"abortSchemaCutover",[993,3853,3854],{"class":1007},"(): ",[993,3856,3807],{"class":2316},[993,3858,3859],{"class":1003},"\u003Cvoid>\n",[946,3861,3862,3863,3866,3867,3870],{},"Resets a stuck fence back to ",[960,3864,3865],{},"'normal'"," without migrating or bumping the generation — a manual recovery escape hatch (for example, after a ",[960,3868,3869],{},"QuiesceTimeoutError",").",[1394,3872,3874],{"id":3873},"vaultschemafencestate",[960,3875,3876],{},"vault.schemaFenceState()",[984,3878,3880],{"className":986,"code":3879,"language":988,"meta":989,"style":989},"async schemaFenceState(): Promise\u003CFenceDoc>\n\ntype FenceState = 'normal' | 'draining' | 'migrating' | 'complete'\n\ninterface FenceDoc {\n  readonly currentSchemaVersion: number\n  readonly fenceState: FenceState\n}\n",[960,3881,3882,3900,3904,3948,3952,3961,3973,3985],{"__ignoreMap":989},[993,3883,3884,3886,3889,3891,3893,3895,3898],{"class":995,"line":996},[993,3885,3775],{"class":1007},[993,3887,3888],{"class":1095},"schemaFenceState",[993,3890,3854],{"class":1007},[993,3892,3807],{"class":2316},[993,3894,2326],{"class":1003},[993,3896,3897],{"class":1007},"FenceDoc",[993,3899,3377],{"class":1003},[993,3901,3902],{"class":995,"line":1027},[993,3903,1079],{"emptyLinePlaceholder":1078},[993,3905,3906,3908,3911,3914,3916,3919,3921,3923,3925,3928,3930,3932,3934,3937,3939,3941,3943,3946],{"class":995,"line":1054},[993,3907,3649],{"class":1085},[993,3909,3910],{"class":2316}," FenceState",[993,3912,3913],{"class":1003}," =",[993,3915,1017],{"class":1003},[993,3917,3918],{"class":1020},"normal",[993,3920,1146],{"class":1003},[993,3922,3366],{"class":1003},[993,3924,1017],{"class":1003},[993,3926,3927],{"class":1020},"draining",[993,3929,1146],{"class":1003},[993,3931,3366],{"class":1003},[993,3933,1017],{"class":1003},[993,3935,3936],{"class":1020},"migrating",[993,3938,1146],{"class":1003},[993,3940,3366],{"class":1003},[993,3942,1017],{"class":1003},[993,3944,3945],{"class":1020},"complete",[993,3947,1024],{"class":1003},[993,3949,3950],{"class":995,"line":1075},[993,3951,1079],{"emptyLinePlaceholder":1078},[993,3953,3954,3956,3959],{"class":995,"line":1082},[993,3955,2313],{"class":1085},[993,3957,3958],{"class":2316}," FenceDoc",[993,3960,1248],{"class":1003},[993,3962,3963,3965,3968,3970],{"class":995,"line":1101},[993,3964,3324],{"class":1085},[993,3966,3967],{"class":1134}," currentSchemaVersion",[993,3969,1138],{"class":1003},[993,3971,3972],{"class":2316}," number\n",[993,3974,3975,3977,3980,3982],{"class":995,"line":1122},[993,3976,3324],{"class":1085},[993,3978,3979],{"class":1134}," fenceState",[993,3981,1138],{"class":1003},[993,3983,3984],{"class":2316}," FenceState\n",[993,3986,3987],{"class":995,"line":1131},[993,3988,3382],{"class":1003},[946,3990,3991],{},"A thin, uncached read of the vault's current cutover state — useful for a status UI or a health check without holding a reference to the client that started the cutover.",[941,3993,3102],{"id":3994},"limits-gotchas",[3996,3997,3998,4009,4022,4031,4046,4071,4080],"ul",{},[3999,4000,4001,4008],"li",{},[1371,4002,4003,4005,4006,1197],{},[960,4004,1352],{}," requires ",[960,4007,973],{}," Without a persisted baseline there's nothing to diff against, so strategies never run and changes pass through silently.",[3999,4010,4011,4014,4015,4017,4018,4021],{},[1371,4012,4013],{},"Detection is top-level only."," v0's ",[960,4016,3392],{}," classifies top-level object properties and their required-ness; a shape change nested two levels deep is reported as ",[960,4019,4020],{},"shapeChanged"," on the outer field, not decomposed further.",[3999,4023,4024,4027,4028,4030],{},[1371,4025,4026],{},"A detection failure never blocks writes."," If computing the delta itself throws (a storage error, a corrupt persisted-schema record), that failure is swallowed — schema-update is a safety net on top of normal writes, not a correctness gate that can wedge the collection. Only an explicit ",[960,4029,3693],{}," decision from a strategy blocks writes.",[3999,4032,4033,4036,4037,4039,4040,4042,4043,4045],{},[1371,4034,4035],{},"Order matters."," Strategies run in array order and the first non-",[960,4038,2015],{}," decision wins — put the strictest strategy (",[960,4041,2007],{},") before a permissive one (",[960,4044,1770],{},") if you want the lock to take precedence.",[3999,4047,4048,4058,4059,4061,4062,1990,4064,4066,4067,4070],{},[1371,4049,4050,4051,4053,4054,4057],{},"A pending ",[960,4052,962],{}," blocks ",[950,4055,4056],{},"all"," writes to that collection",", not just ones touching the changed fields, until ",[960,4060,3298],{}," completes — ",[960,4063,1719],{},[960,4065,1993],{}," throw ",[960,4068,4069],{},"SchemaFenceError"," in the meantime.",[3999,4072,4073,4079],{},[1371,4074,4075,4076],{},"A stale client that already opened the vault before a cutover ran gets ",[960,4077,4078],{},"MigrationRequiredError"," on its next write once the generation counter has bumped — it must reopen the vault to pick up the new schema.",[3999,4081,4082,4087,4088,4090,4091,4093],{},[1371,4083,4084,4086],{},[960,4085,3097],{}," can time out."," If another connected client never quiesces, it throws ",[960,4089,3869],{},"; recover with ",[960,4092,3839],{}," and retry once the holdout client is closed or upgraded.",[941,4095,4097],{"id":4096},"see-also","See also",[3996,4099,4100,4105,4115,4123,4129],{},[3999,4101,4102,4104],{},[955,4103,780],{"href":957}," — the persisted JSON Schema baseline schema-update detects drift against",[3999,4106,4107,4110,4111,4114],{},[955,4108,711],{"href":4109},".\u002Fintrospection"," — ",[960,4112,4113],{},"vault.introspect()"," reports each collection's registered strategy names",[3999,4116,4117,4119,4120,4122],{},[955,4118,756],{"href":757}," — planned broader migration surface (collection renames, cross-version moves); ",[960,4121,2271],{}," here already covers the field-level backfill case",[3999,4124,4125,4128],{},[955,4126,21],{"href":4127},"..\u002Fcore\u002Fnoydb\u002Fenclave"," — the DEK and envelope format the persisted schema (and vault metadata) reuse",[3999,4130,4131,4134,4135],{},[955,4132,4133],{"href":598},"Services overview"," · ",[955,4136,4138],{"href":4137},"\u002Forientation","Orientation map",[4140,4141,4142],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":989,"searchDepth":1054,"depth":1054,"links":4144},[4145,4146,4147,4153,4167,4168],{"id":943,"depth":1027,"text":944},{"id":981,"depth":1027,"text":982},{"id":1362,"depth":1027,"text":1363,"children":4148},[4149,4150,4151,4152],{"id":1396,"depth":1054,"text":1397},{"id":1763,"depth":1054,"text":1764},{"id":2001,"depth":1054,"text":2002},{"id":2264,"depth":1054,"text":2265},{"id":3106,"depth":1027,"text":3107,"children":4154},[4155,4156,4157,4158,4159,4160,4162,4164,4165,4166],{"id":3116,"depth":1054,"text":3119},{"id":3147,"depth":1054,"text":1770},{"id":3174,"depth":1054,"text":3177},{"id":3232,"depth":1054,"text":3235},{"id":3302,"depth":1054,"text":3305},{"id":3401,"depth":1054,"text":4161},"SchemaDelta \u002F FieldChange (types)",{"id":3608,"depth":1054,"text":4163},"UpdateContext \u002F UpdateDecision (types)",{"id":3762,"depth":1054,"text":3765},{"id":3836,"depth":1054,"text":3839},{"id":3873,"depth":1054,"text":3876},{"id":3994,"depth":1027,"text":3102},{"id":4096,"depth":1027,"text":4097},null,"Detect a collection's schema changing between vault opens — allow, reject, lock, or run a coordinated cutover that migrates records before unblocking writes.","md",{},"service",{"title":820,"description":4170},"stable","important","YV1Ps_957CLqRCFkZJbc4YmrwPJKDGBjO53ftY_KRdw",{"data":4179,"body":4180},{},{"type":4181,"children":4182},"root",[4183],{"type":4184,"tag":946,"props":4185,"children":4186},"element",{},[4187,4193],{"type":4184,"tag":960,"props":4188,"children":4190},{"className":4189},[],[4191],{"type":4192,"value":1049},"text",{"type":4192,"value":4194}," (root export)",{"data":4196,"body":4197},{},{"type":4181,"children":4198},[4199],{"type":4184,"tag":946,"props":4200,"children":4201},{},[4202,4204,4209,4211,4216],{"type":4192,"value":4203},"Core feature — activated by the ",{"type":4184,"tag":960,"props":4205,"children":4207},{"className":4206},[],[4208],{"type":4192,"value":1352},{"type":4192,"value":4210}," collection option (needs ",{"type":4184,"tag":960,"props":4212,"children":4214},{"className":4213},[],[4215],{"type":4192,"value":973},{"type":4192,"value":4217}," as the baseline).",1791896581127]