[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7828QY61418MS775XTAP50P":3,"skill-same:01M7828QY61418MS775XTAP50P":47},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":30,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M7828QY61418MS775XTAP50P","product-tenets",null,"The product north-star — four tenets (open & agnostic, composable primitives, production-grade, predictable & type-safe) distilled from TanStack's ethos\u002Ftenets. Use when making a design, API, or architecture decision, evaluating a trade-off, justifying a feature, or writing\u002Freviewing a docs\u002Fplans entry.","stainless-code\u002Fpersist","stainless-code","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F188862219?v=4","01M7826VYMCF2NTQWQZRWQ454T","STAINLESS CODE","01M7826VZKNC149Y9ZNK0F93N7",5,"MIT","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fproduct-tenets\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: product-tenets\ndescription: The product north-star — four tenets (open & agnostic, composable primitives, production-grade, predictable & type-safe) distilled from TanStack's ethos\u002Ftenets. Use when making a design, API, or architecture decision, evaluating a trade-off, justifying a feature, or writing\u002Freviewing a docs\u002Fplans entry.\n---\n\n# Product tenets (north-star)\n\nDistilled from [TanStack's ethos](https:\u002F\u002Ftanstack.com\u002Fethos) and [product tenets](https:\u002F\u002Ftanstack.com\u002Ftenets) — a great inspiration whose work we respect and learn from. These four tenets are the design north-star for `@stainless-code\u002Fpersist`; reach for them whenever a decision needs justifying. Adopted and adapted to a single-package, zero-dep-core, seam-layered persistence middleware.\n\n## 1. Open, independent, technology-agnostic\n\nA store-agnostic core; integrations layered on top as optional adapters — never the foundation. Swapping a store library, storage backend, or serializer is a subpath swap, not a rewrite; framework-specific hydration lives in `.\u002Fframeworks\u002F*`.\n\n- Rules out: store-biased APIs or peer deps in `src\u002Fcore\u002F` (the zero-dep gate); \"all-in on zustand\u002FTanStack Store\" assumptions; lock-in that forces a rewrite when the app changes stores.\n- Persist shape: one package, subpath exports per seam (backends \u002F codecs \u002F sources \u002F frameworks \u002F transport), optional peers, structural `PersistableSource`.\n\n## 2. Composable, platform-aligned primitives\n\nFocused, composable building blocks that embrace the web platform rather than hiding it. Adoptable one piece at a time — no rewrites, no hard coupling. Escape hatches by design: always possible to drop down a level (`persistSource` + hand-rolled `StateStorage` \u002F `StorageCodec`).\n\n- Rules out: designs requiring full rewrites or \"all-in\" commitments; heavy global singletons; abstractions that hide `localStorage` \u002F IndexedDB \u002F WebCrypto without escape routes.\n- Persist shape: three seams — backend (`StateStorage`), codec (`StorageCodec`), source (`PersistableSource`); `createStorage(backend, codec)` composition; wrappers (`encrypted`, `compressed`) stack; `PersistRegistry` is opt-in clear-all, not required.\n\n## 3. Pragmatic, production-grade quality\n\nDesigned around real-world workloads, edge cases, and long-lived apps — not happy-path demos. Features are not done until we'd run them in our own revenue-critical apps. Performance and reliability are requirements, not nice-to-haves.\n\n- Rules out: demo-only features; magic that's impossible to debug; changes that optimize for benchmarks over real-world reliability (quota, multi-tab, schema evolution, hydrate flash).\n- Persist shape: first-class `HydrationSignal`; versioned `migrate`; `crossTab` + `onCrossTabRemove`; `retryWrite` with write-generation guard; `throttleMs` \u002F `maxAge` \u002F `buster`; `onError` with phase.\n\n## 4. Predictable, explicit, type-safe behavior\n\nMinimal magic, maximum clarity. State, side effects, and data flow understandable from code, not hidden behavior. Type safety guides correct use without drowning users in generics. Evolve carefully with clear migration paths.\n\n- Rules out: hidden global state or surprising side effects; API churn without migration docs; type signatures technically correct but unusable in practice.\n- Persist shape: explicit options bag; structural options (`registry`, `crossTab`, …) fixed at create time; SSR policy documented (`hydrated = true` on server); pre-1.0 — prefer the cleanest correct design, document breaks in minors.\n\n## Using the tenets\n\nWhen a proposal conflicts with a tenet, explicitly address why and how the conflict is justified (a `docs\u002Fplans\u002F` entry for new surface, inline for a line-level change). Maintainers use these as a PR checklist; partners may not bias core toward a store or framework.\n\n## Competitor framing (docs)\n\nPeers for comparison \u002F migration are **store persist middlewares** (zustand-persist, redux-persist, pinia-persist). Query-cache persisters are a different problem space — do not treat them as Persist competitors.\n\n## Reference\n\n- [TanStack ethos](https:\u002F\u002Ftanstack.com\u002Fethos) · [TanStack product tenets](https:\u002F\u002Ftanstack.com\u002Ftenets) — inspiration, with respect.\n- [`architecture-priming`](..\u002F..\u002Frules\u002Farchitecture-priming.md) — STOP signals for structurally significant changes.\n- [`improve-codebase-architecture`](..\u002Fimprove-codebase-architecture\u002FSKILL.md) · [`docs\u002Farchitecture.md`](..\u002F..\u002F..\u002Fdocs\u002Farchitecture.md)\n- [`docs-voice`](..\u002Fdocs-voice\u002FSKILL.md) — public docs tone.\n","# Product tenets (north-star)\n\nDistilled from [TanStack's ethos](https:\u002F\u002Ftanstack.com\u002Fethos) and [product tenets](https:\u002F\u002Ftanstack.com\u002Ftenets) — a great inspiration whose work we respect and learn from. These four tenets are the design north-star for `@stainless-code\u002Fpersist`; reach for them whenever a decision needs justifying. Adopted and adapted to a single-package, zero-dep-core, seam-layered persistence middleware.\n\n## 1. Open, independent, technology-agnostic\n\nA store-agnostic core; integrations layered on top as optional adapters — never the foundation. Swapping a store library, storage backend, or serializer is a subpath swap, not a rewrite; framework-specific hydration lives in `.\u002Fframeworks\u002F*`.\n\n- Rules out: store-biased APIs or peer deps in `src\u002Fcore\u002F` (the zero-dep gate); \"all-in on zustand\u002FTanStack Store\" assumptions; lock-in that forces a rewrite when the app changes stores.\n- Persist shape: one package, subpath exports per seam (backends \u002F codecs \u002F sources \u002F frameworks \u002F transport), optional peers, structural `PersistableSource`.\n\n## 2. Composable, platform-aligned primitives\n\nFocused, composable building blocks that embrace the web platform rather than hiding it. Adoptable one piece at a time — no rewrites, no hard coupling. Escape hatches by design: always possible to drop down a level (`persistSource` + hand-rolled `StateStorage` \u002F `StorageCodec`).\n\n- Rules out: designs requiring full rewrites or \"all-in\" commitments; heavy global singletons; abstractions that hide `localStorage` \u002F IndexedDB \u002F WebCrypto without escape routes.\n- Persist shape: three seams — backend (`StateStorage`), codec (`StorageCodec`), source (`PersistableSource`); `createStorage(backend, codec)` composition; wrappers (`encrypted`, `compressed`) stack; `PersistRegistry` is opt-in clear-all, not required.\n\n## 3. Pragmatic, production-grade quality\n\nDesigned around real-world workloads, edge cases, and long-lived apps — not happy-path demos. Features are not done until we'd run them in our own revenue-critical apps. Performance and reliability are requirements, not nice-to-haves.\n\n- Rules out: demo-only features; magic that's impossible to debug; changes that optimize for benchmarks over real-world reliability (quota, multi-tab, schema evolution, hydrate flash).\n- Persist shape: first-class `HydrationSignal`; versioned `migrate`; `crossTab` + `onCrossTabRemove`; `retryWrite` with write-generation guard; `throttleMs` \u002F `maxAge` \u002F `buster`; `onError` with phase.\n\n## 4. Predictable, explicit, type-safe behavior\n\nMinimal magic, maximum clarity. State, side effects, and data flow understandable from code, not hidden behavior. Type safety guides correct use without drowning users in generics. Evolve carefully with clear migration paths.\n\n- Rules out: hidden global state or surprising side effects; API churn without migration docs; type signatures technically correct but unusable in practice.\n- Persist shape: explicit options bag; structural options (`registry`, `crossTab`, …) fixed at create time; SSR policy documented (`hydrated = true` on server); pre-1.0 — prefer the cleanest correct design, document breaks in minors.\n\n## Using the tenets\n\nWhen a proposal conflicts with a tenet, explicitly address why and how the conflict is justified (a `docs\u002Fplans\u002F` entry for new surface, inline for a line-level change). Maintainers use these as a PR checklist; partners may not bias core toward a store or framework.\n\n## Competitor framing (docs)\n\nPeers for comparison \u002F migration are **store persist middlewares** (zustand-persist, redux-persist, pinia-persist). Query-cache persisters are a different problem space — do not treat them as Persist competitors.\n\n## Reference\n\n- [TanStack ethos](https:\u002F\u002Ftanstack.com\u002Fethos) · [TanStack product tenets](https:\u002F\u002Ftanstack.com\u002Ftenets) — inspiration, with respect.\n- [`architecture-priming`](..\u002F..\u002Frules\u002Farchitecture-priming.md) — STOP signals for structurally significant changes.\n- [`improve-codebase-architecture`](..\u002Fimprove-codebase-architecture\u002FSKILL.md) · [`docs\u002Farchitecture.md`](..\u002F..\u002F..\u002Fdocs\u002Farchitecture.md)\n- [`docs-voice`](..\u002Fdocs-voice\u002FSKILL.md) — public docs tone.\n",{"name":5,"description":7},"main","29ca2183c92cd13e04ce6c14fb431fd6993862cd",".agents\u002Fskills\u002Fproduct-tenets",0,"https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist","https:\u002F\u002Fgithub.com\u002Fstainless-code","https:\u002F\u002Fstainless-code.com\u002F","Open-source tooling for JS\u002FTS and AI agents.","2026-11-01 20:56:20",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add stainless-code\u002Fpersist --skill product-tenets",{"tool":39,"command":40},"bunx","bunx skills add stainless-code\u002Fpersist --skill product-tenets",{"tool":42,"command":43},"pnpm","pnpm dlx skills add stainless-code\u002Fpersist --skill product-tenets","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fproduct-tenets\u002FSKILL.md",true,[],[48,55,62,69,76,83],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":54,"publishedAt":19},"01M782D4ZQGJPNT470FSKDB6A8","vue-persist","Gate Vue 3 UI on Persist hydration with useHydrated (shallowRef). Use in setup\u002FeffectScope when avoiding flash of default state on async backends.","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002Fskills\u002Fvue-persist\u002FSKILL.md",[],[],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":61,"publishedAt":19},"01M782D1GJRWNQ3458F3H1FK2F","svelte-store-persist","Gate Svelte store-based UI on Persist hydration with hydratedStore (Readable). Use for Svelte 3–4 or Svelte 5 apps that still use stores; runes UI → svelte-persist.","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002Fskills\u002Fsvelte-store-persist\u002FSKILL.md",[],[],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":19},"01M782CWBTRWAQ52TBNQ8665CC","svelte-persist","Gate Svelte 5 runes UI on Persist hydration with hydratedRune (.current). Use for Svelte 5; for stores \u002F Svelte 3–4 use svelte-store-persist.","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002Fskills\u002Fsvelte-persist\u002FSKILL.md",[],[],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":19},"01M782CR8Z2V3SJW661RTMWY2F","solid-persist","Gate Solid UI on Persist hydration with useHydrated (Accessor). Use when avoiding flash of default state on async backends; read hydrated() in reactive scopes.","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002Fskills\u002Fsolid-persist\u002FSKILL.md",[],[],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":19},"01M782CJQGP7739WA9BS801HZP","react-persist","Gate React UI on Persist hydration with useHydrated + toHydrationSignal. Use when avoiding flash of default state on async backends (IndexedDB), SSR snapshot true, or wiring HydrationSignal into React 18\u002F19.","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002Fskills\u002Freact-persist\u002FSKILL.md",[],[],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":19},"01M782CF96RMXCDETM5TF2JDRV","preact-persist","Gate Preact UI on Persist hydration with useHydrated (preact\u002Fcompat useSyncExternalStore). Use when avoiding flash of default state on async backends or wiring HydrationSignal into Preact.","https:\u002F\u002Fgithub.com\u002Fstainless-code\u002Fpersist\u002Fblob\u002Fmain\u002Fskills\u002Fpreact-persist\u002FSKILL.md",[],[]]