[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6P8Q973J0PF1G9AZSRTA2BC":3,"skill-same:01M6P8Q973J0PF1G9AZSRTA2BC":74},{"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":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":51,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6P8Q973J0PF1G9AZSRTA2BC","loom-architecture",null,"Apply the repository-wide Loom Architecture—Log-Oriented Outcomes and Materializations—when designing, implementing, reviewing, debugging, or documenting NATS and JetStream event-sourced applications. Use for work involving NATS account boundaries, a primary event stream, optimistic concurrency control, projections and read-your-writes, snapshots or checkpoints, snapshot repositories, durable workers, or reliable external effects.","chattocorp\u002Fchatto","chattocorp","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F261891647?v=4","01M6P8ECJF78VVQ1TJBW2JAWQ8","ChattoCorp GmbH","01M6P8ECPWHQVQBB8XNCRR70B9",2972,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Floom-architecture\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"loom architecture","loom","architecture","projections","repositories","when","apply","effects","for","implementing","checkpoints","event","control","workers","snapshots","log","outcomes","use","work","applications","concurrency","debugging","2026-11-10 10:12:30",false,"---\nname: loom-architecture\ndescription: Apply the repository-wide Loom Architecture—Log-Oriented Outcomes and Materializations—when designing, implementing, reviewing, debugging, or documenting NATS and JetStream event-sourced applications. Use for work involving NATS account boundaries, a primary event stream, optimistic concurrency control, projections and read-your-writes, snapshots or checkpoints, snapshot repositories, durable workers, or reliable external effects.\n---\n\n# Loom Architecture\n\nLoom stands for **Log-Oriented Outcomes and Materializations**. It is an\narchitecture for building event-sourced applications on NATS and JetStream.\n\n```text\ncommands -> event log (EVT role) -> materializations\n                                 -> durable workers -> outcomes\n```\n\n## Log-oriented\n\nEach application runs in its own NATS account. Within that account, one primary\nJetStream stream holds the application's durable domain events. Loom calls the\nstream's logical role `EVT`; the application chooses its physical resource\nname.\n\nThe event log is the source of truth. Commands decide what should happen and\nappend new events only if the relevant history has not changed. This is\noptimistic concurrency control: concurrent changes cannot silently overwrite\neach other. Applications define their own events, subjects, and aggregate\nboundaries. Events may use Protobuf, but Loom does not require a particular\nencoding.\n\n## Materializations\n\nMaterializations are views of the event log built for a particular use. They\nare commonly called projections or read models. A materialization may live in\nRAM, in NATS, in a local database, or in an external system.\n\nMaterializations are derived state, not another source of truth. They can be\ndiscarded and rebuilt by replaying the event log. Snapshots and checkpoints can\nmake that rebuild faster, but they are still disposable and are not backups of\nthe event log.\n\nA Loom framework can provide reusable projection bases, especially for\nin-memory projections, plus snapshot repository interfaces and implementations\nfor storage such as NATS Object Store or S3-compatible object storage.\n\n## Outcomes\n\nOutcomes are reliable asynchronous work caused by committed events: sending an\nemail, calling a webhook, updating another system, or performing any other\nfollow-up that must survive a restart.\n\nDurable workers use named JetStream consumers so unfinished work remains\navailable after crashes or handoffs between processes. Delivery is at least\nonce, so outcome handlers must tolerate receiving the same event more than\nonce. Projections only derive state; durable workers perform external effects.\n\n## Storage conventions\n\n[ADR-114](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002FADR-114-jetstream-storage-conventions.md) gives\nthe storage rules for each Loom application:\n\n- Resource names, configurations, subjects, key shapes, value encodings, and\n  durable consumer names are persisted contracts. Change them only with a\n  migration that is safe when replicas of different versions run together.\n- Use an existing resource first. A new resource needs a lifecycle, retention,\n  storage type, or backup policy that no existing resource gives.\n- Declare each resource once: name, configuration, and backup policy. Pin the\n  configuration with a test.\n- Encode new records as protobuf from the package for their storage contract.\n- Build each key family in one place: prefix first, then owner identifiers\n  from the widest to the narrowest scope. Each application selects one key\n  style.\n- Classify OCC conflicts with `jetstreamutil.IsSequenceConflict`, and read the\n  key again after a `Create` conflict.\n- Report every durable consumer in the operator diagnostics.\n\n## Framework and application\n\nThe framework supplies the reusable mechanics for publishing events, replaying\nmaterializations, taking and restoring snapshots, and running durable workers.\nThe application supplies the domain: its event types, subjects, decisions,\nprojection logic, outcome handlers, and operational policy.\n\nIn short: events record what happened, materializations make those facts easy\nto use, and durable workers reliably turn them into external outcomes.\n","# Loom Architecture\n\nLoom stands for **Log-Oriented Outcomes and Materializations**. It is an\narchitecture for building event-sourced applications on NATS and JetStream.\n\n```text\ncommands -> event log (EVT role) -> materializations\n                                 -> durable workers -> outcomes\n```\n\n## Log-oriented\n\nEach application runs in its own NATS account. Within that account, one primary\nJetStream stream holds the application's durable domain events. Loom calls the\nstream's logical role `EVT`; the application chooses its physical resource\nname.\n\nThe event log is the source of truth. Commands decide what should happen and\nappend new events only if the relevant history has not changed. This is\noptimistic concurrency control: concurrent changes cannot silently overwrite\neach other. Applications define their own events, subjects, and aggregate\nboundaries. Events may use Protobuf, but Loom does not require a particular\nencoding.\n\n## Materializations\n\nMaterializations are views of the event log built for a particular use. They\nare commonly called projections or read models. A materialization may live in\nRAM, in NATS, in a local database, or in an external system.\n\nMaterializations are derived state, not another source of truth. They can be\ndiscarded and rebuilt by replaying the event log. Snapshots and checkpoints can\nmake that rebuild faster, but they are still disposable and are not backups of\nthe event log.\n\nA Loom framework can provide reusable projection bases, especially for\nin-memory projections, plus snapshot repository interfaces and implementations\nfor storage such as NATS Object Store or S3-compatible object storage.\n\n## Outcomes\n\nOutcomes are reliable asynchronous work caused by committed events: sending an\nemail, calling a webhook, updating another system, or performing any other\nfollow-up that must survive a restart.\n\nDurable workers use named JetStream consumers so unfinished work remains\navailable after crashes or handoffs between processes. Delivery is at least\nonce, so outcome handlers must tolerate receiving the same event more than\nonce. Projections only derive state; durable workers perform external effects.\n\n## Storage conventions\n\n[ADR-114](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002FADR-114-jetstream-storage-conventions.md) gives\nthe storage rules for each Loom application:\n\n- Resource names, configurations, subjects, key shapes, value encodings, and\n  durable consumer names are persisted contracts. Change them only with a\n  migration that is safe when replicas of different versions run together.\n- Use an existing resource first. A new resource needs a lifecycle, retention,\n  storage type, or backup policy that no existing resource gives.\n- Declare each resource once: name, configuration, and backup policy. Pin the\n  configuration with a test.\n- Encode new records as protobuf from the package for their storage contract.\n- Build each key family in one place: prefix first, then owner identifiers\n  from the widest to the narrowest scope. Each application selects one key\n  style.\n- Classify OCC conflicts with `jetstreamutil.IsSequenceConflict`, and read the\n  key again after a `Create` conflict.\n- Report every durable consumer in the operator diagnostics.\n\n## Framework and application\n\nThe framework supplies the reusable mechanics for publishing events, replaying\nmaterializations, taking and restoring snapshots, and running durable workers.\nThe application supplies the domain: its event types, subjects, decisions,\nprojection logic, outcome handlers, and operational policy.\n\nIn short: events record what happened, materializations make those facts easy\nto use, and durable workers reliably turn them into external outcomes.\n",{"name":5,"description":7},"main","d3d21f4a4fb6c1315aa62df97a6cb6617680af95",".agents\u002Fskills\u002Floom-architecture",152,"https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto","https:\u002F\u002Fchatto.run","https:\u002F\u002Fgithub.com\u002Fchattocorp","2026-11-15 04:17:01",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add chattocorp\u002Fchatto --skill loom-architecture",{"tool":60,"command":61},"bunx","bunx skills add chattocorp\u002Fchatto --skill loom-architecture",{"tool":63,"command":64},"pnpm","pnpm dlx skills add chattocorp\u002Fchatto --skill loom-architecture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Floom-architecture\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"agents\u002Fopenai.yaml","REFERENCE","参考文档",219,"https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Floom-architecture\u002Fagents\u002Fopenai.yaml",[75,96,115,131,154,180],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":91,"publishedAt":41},"01M6P8S7F1NYMKD9PW2RGZ0B2P","writing-tests","Instructions and hints for writing tests.","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-tests\u002FSKILL.md",[81,86],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[92,93,94,95,27],"writing","writing tests","tests","instructions",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":105,"publishedAt":41},"01M6P8S131Q068WC04FS0YW3RR","update-project-dependencies","Update Chatto Go and frontend dependencies within their compatible version ranges, then run tests.","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fupdate-project-dependencies\u002FSKILL.md",[102],{"categoryNo":103,"categoryName":104,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000009","前端开发",[106,107,108,109,110,111,112,113,114,94],"dependencies","update","project","update project dependencies","frontend","go","run tests","run","version",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":41},"01M6P8RERB7E3KYD4PW98D94SR","svelte-docs","Look up official Svelte, SvelteKit, and Svelte CLI documentation.","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsvelte-docs\u002FSKILL.md",[],[122,123,124,125,126,127,128,129,130],"svelte","svelte docs","docs","look","cli","official","documentation","sveltekit","up",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":41},"01M6P8RA0PS8DFAR8GXMB1CBFN","svelte-core-bestpractices","Guidance on writing fast, robust, modern Svelte code. Load this skill whenever in a Svelte project and asked to write\u002Fedit or analyze a Svelte component or module. Covers reactivity, event handling, styling, integration with libraries and more.","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsvelte-core-bestpractices\u002FSKILL.md",[],[122,138,139,140,30,141,108,142,143,144,145,146,147,148,149,150,151,152,92,153],"svelte core bestpractices","core","with","module","guidance","styling","edit","write","analyze","more","load","component","integration","code","libraries","fast",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":166,"publishedAt":41},"01M6P8R685PAMMR1DD530NGY40","svelte-code-writer","CLI tools for Svelte 5 documentation lookup and code analysis. MUST be used whenever creating, editing or analyzing any Svelte component (.svelte) or Svelte module (.svelte.ts\u002F.svelte.js). If possible, this skill should be executed within the svelte-file-editor agent for optimal results.","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsvelte-code-writer\u002FSKILL.md",[160,163],{"categoryNo":161,"categoryName":162,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":164,"categoryName":165,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000030","开发工程师",[151,167,122,168,149,169,126,128,170,27,171,141,172,173,174,175,176,177,178,179],"svelte code writer","writer","editor","svelte 5","code analysis","results","editing","js","documentation lookup","analysis","Tools","analyzing","file",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":41},"01M6P8QN03VSSHF538WV0E701T","session-wrap-up","Review a completed, paused, or blocked coding-agent session to identify friction, mistakes, near misses, missing context, and opportunities to improve future work. Use when the user asks to wrap up, run a retrospective, explain what issues the agent faced, capture lessons learned, or recommend improvements to repository instructions, documentation, skills, tooling, tests, or workflows. Produce an evidence-based, propose-only report; do not apply follow-up changes unless the user asks.","https:\u002F\u002Fgithub.com\u002Fchattocorp\u002Fchatto\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsession-wrap-up\u002FSKILL.md",[],[187,188,130,189,190,191,192,193,24,194,195,196,197,198,37,199,200,201,113,128,202,203],"wrap","session wrap","session","session wrap up","wrap up","Coding-Agent","agent session","recommend","near","follow-up","learned","only","improve","repository","issues","workflows","review"]