[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X6WWHTK2SWXRCDYBQFT09G":3,"skill-same:01M6X6WWHTK2SWXRCDYBQFT09G":68},{"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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":51,"ownerHtmlUrl":52,"ownerBlogUrl":51,"ownerDescription":53,"updatedAt":54,"install":55,"resources":67},"01M6X6WWHTK2SWXRCDYBQFT09G","jobs-events",null,"Use when creating Laravel jobs, queued workflows, events, or listeners. Covers clear responsibilities, safe serialization, and retry\u002Ffailure handling.","event4u-app\u002Fagent-config","event4u-app","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F199339632?v=4","01M6X5TWBNCQCE1VDKT4E9KF7N","event4u.app","01M6X5TWF4HRM266RG2Q5VVH1X",19,"MIT","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fjobs-events\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"jobs","events","jobs events","safe","workflows","serialization","engineering","laravel","use","clear","false","professional","retry","true","listeners","when","2026-11-10 10:12:30",false,"---\nmodel_tier: medium\nname: jobs-events\ndescription: \"Use when creating Laravel jobs, queued workflows, events, or listeners. Covers clear responsibilities, safe serialization, and retry\u002Ffailure handling.\"\ndomain: engineering\nworkspaces:\n  - engineering\npacks:\n  - laravel\ntrust:\n  level: professional\ninstall:\n  default: false\n  removable: true\n---\n\n# jobs-events\n\n## When to use\n\nUse when creating jobs, events, listeners, or queued workflows.\n\nDo NOT use when:\n- Artisan commands (use `artisan-commands` skill)\n- Scheduling configuration (use `laravel-scheduling` skill)\n\n## Procedure: Create a Job\n\n### Step 0: Inspect\n\n1. Check existing jobs — match naming, queue config, retry strategy, failure handling.\n2. Determine sync vs. async — only queue work that is slow, retryable, or non-blocking.\n3. Check queue driver: `.env` \u002F `config\u002Fqueue.php` (Redis, database, sync).\n4. Check Horizon: `config\u002Fhorizon.php` for queue names, supervisors, balancing.\n\n### Step 1: Create the job class\n\n1. Pass IDs or compact DTOs in constructor — not full models with relations.\n2. Set queue via `$this->onQueue(Queue::NAME->value)`.\n3. Add `tags()` for Horizon filtering.\n4. Set `$maxExceptions`, `backoff()`, `$uniqueFor` as needed.\n\n### Step 2: Implement handle()\n\n1. Keep focused and readable.\n2. Delegate complex logic to services\u002Factions.\n3. Design for idempotency — retries must not create duplicates.\n\n### Step 3: Test\n\n- `Bus::fake()`, `Queue::fake()`, `Event::fake()`.\n- Test side effects, not just dispatch assertions.\n\n## Procedure: Create an Event + Listener\n\n### Step 1: Create event\n\n- Past-tense naming: `OrderPlaced`, `ImportCompleted`.\n- Keep payload focused.\n- Laravel 11+: automatic discovery — no manual registration.\n\n### Step 2: Create listener\n\n- One responsibility per listener.\n- Delegate large logic to services.\n- Use `ShouldQueue` on listeners that do heavy work.\n\n## Conventions\n\n→ See guideline `php\u002Fjobs.md` for full conventions (serialization, idempotency, events, dispatching).\n\n## Output format\n\n1. Job\u002FEvent\u002FListener class(es) with proper serialization and retry config\n2. Event registration in EventServiceProvider if needed\n\n## Gotcha\n\n- Without `ShouldQueue`, jobs run synchronously.\n- Queued jobs serialize constructor args — don't pass loaded models.\n- Listener exceptions block the event chain — queue heavy listeners.\n- Set `$tries` and `$backoff` — unlimited retries overwhelm the queue.\n\n## Do NOT\n\n- Do NOT serialize Eloquent models with loaded relations into queued jobs.\n- Do NOT ignore idempotency — retries must not create duplicates.\n- Do NOT hide critical business flows behind deep listener chains.\n\n## Auto-trigger keywords\n\n- Laravel job\n- queue\n- event\n- listener\n- dispatch\n- serialization\n","# jobs-events\n\n## When to use\n\nUse when creating jobs, events, listeners, or queued workflows.\n\nDo NOT use when:\n- Artisan commands (use `artisan-commands` skill)\n- Scheduling configuration (use `laravel-scheduling` skill)\n\n## Procedure: Create a Job\n\n### Step 0: Inspect\n\n1. Check existing jobs — match naming, queue config, retry strategy, failure handling.\n2. Determine sync vs. async — only queue work that is slow, retryable, or non-blocking.\n3. Check queue driver: `.env` \u002F `config\u002Fqueue.php` (Redis, database, sync).\n4. Check Horizon: `config\u002Fhorizon.php` for queue names, supervisors, balancing.\n\n### Step 1: Create the job class\n\n1. Pass IDs or compact DTOs in constructor — not full models with relations.\n2. Set queue via `$this->onQueue(Queue::NAME->value)`.\n3. Add `tags()` for Horizon filtering.\n4. Set `$maxExceptions`, `backoff()`, `$uniqueFor` as needed.\n\n### Step 2: Implement handle()\n\n1. Keep focused and readable.\n2. Delegate complex logic to services\u002Factions.\n3. Design for idempotency — retries must not create duplicates.\n\n### Step 3: Test\n\n- `Bus::fake()`, `Queue::fake()`, `Event::fake()`.\n- Test side effects, not just dispatch assertions.\n\n## Procedure: Create an Event + Listener\n\n### Step 1: Create event\n\n- Past-tense naming: `OrderPlaced`, `ImportCompleted`.\n- Keep payload focused.\n- Laravel 11+: automatic discovery — no manual registration.\n\n### Step 2: Create listener\n\n- One responsibility per listener.\n- Delegate large logic to services.\n- Use `ShouldQueue` on listeners that do heavy work.\n\n## Conventions\n\n→ See guideline `php\u002Fjobs.md` for full conventions (serialization, idempotency, events, dispatching).\n\n## Output format\n\n1. Job\u002FEvent\u002FListener class(es) with proper serialization and retry config\n2. Event registration in EventServiceProvider if needed\n\n## Gotcha\n\n- Without `ShouldQueue`, jobs run synchronously.\n- Queued jobs serialize constructor args — don't pass loaded models.\n- Listener exceptions block the event chain — queue heavy listeners.\n- Set `$tries` and `$backoff` — unlimited retries overwhelm the queue.\n\n## Do NOT\n\n- Do NOT serialize Eloquent models with loaded relations into queued jobs.\n- Do NOT ignore idempotency — retries must not create duplicates.\n- Do NOT hide critical business flows behind deep listener chains.\n\n## Auto-trigger keywords\n\n- Laravel job\n- queue\n- event\n- listener\n- dispatch\n- serialization\n",{"name":5,"packs":40,"trust":41,"domain":25,"install":42,"model_tier":44,"workspaces":45,"description":7},[26],{"level":30},{"default":36,"removable":43},true,"medium",[25],"main","12bd765ce1d800501d45dfb8232102793af01290","src\u002Fskills\u002Fjobs-events",1,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config","https:\u002F\u002Fevent4u.app","https:\u002F\u002Fgithub.com\u002Fevent4u-app","Your events in your hand","2026-11-11 06:19:40",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":43},[57,60,63],{"tool":58,"command":59},"npx","npx skills add event4u-app\u002Fagent-config --skill jobs-events",{"tool":61,"command":62},"bunx","bunx skills add event4u-app\u002Fagent-config --skill jobs-events",{"tool":64,"command":65},"pnpm","pnpm dlx skills add event4u-app\u002Fagent-config --skill jobs-events","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fjobs-events\u002FSKILL.md",[],[69,87,100,112,124,134],{"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":80,"publishedAt":35},"01M6X84PK96XBPENXH66JCTSD1","unknown-key-fixture","Declares a key the schema does not know.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Funknown-key\u002FSKILL.md",[75],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[81,82,83,84,85,86],"unknown key fixture","Unknown key","fixture","unknown","schema","package",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":35},"01M6X84HW7NAHZ7GZMQ9RXK1XJ","portable-fixture","Declares only semantics the MCP-lite carrier transports whole.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fportable\u002FSKILL.md",[93],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[83,95,96,97,98,86,99],"portable","portable fixture","engineer","only","MCP",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":107,"publishedAt":35},"01M6X84F29FE0RGGZ1ZTFGZTX2","non-portable-fixture","Declares a runtime semantic the carrier drops.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fnon-portable\u002FSKILL.md",[106],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[96,108,95,83,109,110,111,86],"non portable fixture","semantic","high","runtime",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":119,"publishedAt":35},"01M6X848F706PT9MDCX75JKJ6B","candidate-zero-width","A candidate whose prose carries an invisible joiner.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fzero-width-injection\u002FSKILL.md",[118],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[120,121,122,123],"candidate zero width","candidate","ZeRO","prose",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":131,"publishedAt":35},"01M6X841SSC2T31VDF41SA6DG1","candidate-disclosure-suppression","A candidate whose prose tells the agent to withhold from the user.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdisclosure-suppression\u002FSKILL.md",[130],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[132,121,123,133],"candidate disclosure suppression","user",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":141,"publishedAt":35},"01M6X83TFS5AGPBPVTQNWP0BB3","candidate-dangerous-frontmatter","A candidate claiming an unscoped tool grant and a permission bypass.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdangerous-frontmatter\u002FSKILL.md",[140],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[142,121,143,144,145,146],"candidate dangerous frontmatter","frontmatter","shell","permission","tool"]