[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C0SJTH1M94EVN1HD58DV2F":3,"skill-same:01M6C0SJTH1M94EVN1HD58DV2F":83},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":14,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6C0SJTH1M94EVN1HD58DV2F","deprecation-and-migration",null,"Deprecate and remove old APIs, models, fields, or dependencies in AS v2 without breaking consumers. Use when replacing a lib\u002Fservice\u002Fmodel with a new one, consolidating duplicates, or deleting dead code — follow the ordered procedure and its completion gates before removing anything.","matheusnorjosa\u002Faprender_sistema","matheusnorjosa","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F117673804?v=4","01M6C0S19FG12BDFBTRWY9TTEQ","Matheus Norjosa","01M6C0S1DF0YB17TKGEYC70GSP",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdeprecation-and-migration\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"deprecation and migration","deprecation","migration","dependencies","new","when","fields","with","lib","as","service","gates","code","models","duplicates","use","remove","completion gates","dead code","model","2026-11-10 10:12:30",false,"---\nname: deprecation-and-migration\ndescription: Deprecate and remove old APIs, models, fields, or dependencies in AS v2 without breaking consumers. Use when replacing a lib\u002Fservice\u002Fmodel with a new one, consolidating duplicates, or deleting dead code — follow the ordered procedure and its completion gates before removing anything.\n---\n\n# Deprecation and Migration — Aprender Sistema\n\n**Code is a liability, not an asset.** Every line costs maintenance, security patches, and onboarding overhead. Deprecation removes code that no longer earns its keep — but only after a replacement exists and every consumer has moved.\n\n## The Procedure\n\nRun these phases in order. Each phase has a **gate**: do not advance until every box is checked. This is the whole skill — the rest of the document is supporting reference.\n\n### Phase 1 — Decide (gate: replacement is real)\n\n- [ ] **Replacement exists and is production-proven.** NEVER deprecate without an alternative; if it doesn't exist, build it first.\n- [ ] Confirmed this code provides no remaining unique value.\n- [ ] Consumer inventory documented (grep usage; write the list into an issue).\n- [ ] Decision recorded: advisory vs compulsory, with reasoning → `reference\u002Fadvisory-vs-compulsory.md`.\n- [ ] Ongoing cost of *keeping* it named (security risk? engineer time? dependency freeze?).\n\n**Gate:** a named replacement + a written consumer inventory exist. Stop here otherwise.\n\n### Phase 2 — Announce + tool (gate: migration is possible, not just declared)\n\n- [ ] Migration guide written, with before\u002Fafter examples.\n- [ ] Migration tooling (codemods, scripts) prepared if the change is non-trivial.\n- [ ] Epic + sub-issues created, one per migration phase.\n- [ ] Strategy chosen (strangler \u002F adapter \u002F two-phase migration) → `reference\u002Fmigration-patterns.md`.\n- [ ] Deprecation marked *in code* (docstring, `X-Deprecation`\u002F`X-Sunset` header, or nullable field) → `reference\u002Fmigration-patterns.md`.\n\n**Gate:** a consumer could migrate today using your guide\u002Ftooling. A deprecation notice without tooling is a Red Flag (`reference\u002Frationalizations.md`).\n\n### Phase 3 — Migrate consumers (gate: zero remaining usage)\n\n- [ ] Each consumer migrated and verified (tests green).\n- [ ] No new usages added during migration (grep guard in CI).\n- [ ] Metrics\u002Flogs show declining usage of the old system.\n\n**Gate:** zero active consumers, verified via grep + metrics\u002Flogs. **The Churn Rule:** if you own the deprecated code, *you* migrate the consumers — don't announce \"deprecated\" and expect users to move. You own both until the old one is gone.\n\n### Phase 4 — Remove (gate: no trace left)\n\n- [ ] No references in code, tests, docs, or config.\n- [ ] ADR\u002Fspec status updated (e.g. Accepted → Implemented).\n- [ ] `package.json` \u002F `requirements.txt` cleaned.\n- [ ] Deprecation warnings removed; old docs deleted or moved to `_archive\u002F`.\n- [ ] Epic closed with a summary PR description.\n\n**Gate:** removal is complete only when grep finds nothing across code, tests, docs, and config.\n\n## Worked example: Axios → fetch (Epic #1039)\n\nThe axios removal is the canonical run of the procedure above — read it as the template, then apply the phases to your own case.\n\n1. **Trigger (Phase 1):** supply-chain risk on the axios npm package (CVE-2025-27152). Replacement = native `fetch` wrapped in `src\u002Fapi\u002Fconfig.ts`.\n2. **Pin + plan (Phase 1-2):** axios pinned exact as the emergency stopgap; plan captured in `docs\u002Farchitecture\u002Fproject-decisions\u002FADR-013-axios-pinning-fetch-migration.md` (full plan archived at `v2\u002Fdocs\u002F_archive\u002Fplans\u002FPLAN_axios_to_fetch_migration.md`).\n3. **Tooling (Phase 2):** added `fetchBlob` and `fetchWithErrorMapping` to `config.ts` so clients had feature parity.\n4. **Migrate (Phase 3):** moved clients one PR at a time — `acoesNotificacao.ts` (simplest), `adminDAT.ts` (error mapping), `datModule.ts` (blob support) — then the hook\u002Fcomponent consumers.\n5. **Remove (Phase 4):** deleted the dead client layer and uninstalled axios from `package.json`.\n6. **Verify (Phase 4 gate):** ~40KB smaller bundle, zero axios imports, all tests green. There is no `src\u002Fapi.ts` or `httpClient.ts` — the single wrapper is `config.ts`.\n\n## Decision shortcut\n\n```\n1. Still provides unique value? ........ YES: maintain. NO: continue.\n2. How many consumers? ................. quantify via grep before anything else.\n3. Replacement exists? ................. NO: build it first. Never deprecate without one.\n4. Migration cost per consumer? ........ trivial → automate + migrate yourself.\n5. Cost of NOT deprecating? ............ security risk \u002F engineer time \u002F dependency freeze?\n```\n\n## When this skill applies\n\n- Replacing an old lib\u002FAPI\u002Fmodel\u002Ffield with a new one (e.g. axios → fetch).\n- Consolidating duplicate systems (e.g. multiple notification paths).\n- Removing zombie code — no owner, but still has consumers → `reference\u002Fzombie-code.md`.\n- Sunsetting unused features (check metrics first).\n\n## Reference\n\n- `reference\u002Fmigration-patterns.md` — strangler, adapter, two-phase Django migration, in-code deprecation markers.\n- `reference\u002Fadvisory-vs-compulsory.md` — choosing the deprecation mode.\n- `reference\u002Fzombie-code.md` — detecting ownerless code with live consumers.\n- `reference\u002Frationalizations.md` — counters to \"it still works\" + Red Flags list.\n- Epic #1039 — axios → fetch (worked example).\n- `docs\u002Farchitecture\u002Fproject-decisions\u002FADR-013-axios-pinning-fetch-migration.md` — axios pin + fetch migration.\n- `v2\u002Fdocs\u002Fspecs\u002Ffrontend\u002Fapi-clients.spec.md` — living index for the `src\u002Fapi\u002F` layer.\n- Memory `project_etl_removed.md` — `apps.dat_ingest` deletion (a completed compulsory removal).\n","# Deprecation and Migration — Aprender Sistema\n\n**Code is a liability, not an asset.** Every line costs maintenance, security patches, and onboarding overhead. Deprecation removes code that no longer earns its keep — but only after a replacement exists and every consumer has moved.\n\n## The Procedure\n\nRun these phases in order. Each phase has a **gate**: do not advance until every box is checked. This is the whole skill — the rest of the document is supporting reference.\n\n### Phase 1 — Decide (gate: replacement is real)\n\n- [ ] **Replacement exists and is production-proven.** NEVER deprecate without an alternative; if it doesn't exist, build it first.\n- [ ] Confirmed this code provides no remaining unique value.\n- [ ] Consumer inventory documented (grep usage; write the list into an issue).\n- [ ] Decision recorded: advisory vs compulsory, with reasoning → `reference\u002Fadvisory-vs-compulsory.md`.\n- [ ] Ongoing cost of *keeping* it named (security risk? engineer time? dependency freeze?).\n\n**Gate:** a named replacement + a written consumer inventory exist. Stop here otherwise.\n\n### Phase 2 — Announce + tool (gate: migration is possible, not just declared)\n\n- [ ] Migration guide written, with before\u002Fafter examples.\n- [ ] Migration tooling (codemods, scripts) prepared if the change is non-trivial.\n- [ ] Epic + sub-issues created, one per migration phase.\n- [ ] Strategy chosen (strangler \u002F adapter \u002F two-phase migration) → `reference\u002Fmigration-patterns.md`.\n- [ ] Deprecation marked *in code* (docstring, `X-Deprecation`\u002F`X-Sunset` header, or nullable field) → `reference\u002Fmigration-patterns.md`.\n\n**Gate:** a consumer could migrate today using your guide\u002Ftooling. A deprecation notice without tooling is a Red Flag (`reference\u002Frationalizations.md`).\n\n### Phase 3 — Migrate consumers (gate: zero remaining usage)\n\n- [ ] Each consumer migrated and verified (tests green).\n- [ ] No new usages added during migration (grep guard in CI).\n- [ ] Metrics\u002Flogs show declining usage of the old system.\n\n**Gate:** zero active consumers, verified via grep + metrics\u002Flogs. **The Churn Rule:** if you own the deprecated code, *you* migrate the consumers — don't announce \"deprecated\" and expect users to move. You own both until the old one is gone.\n\n### Phase 4 — Remove (gate: no trace left)\n\n- [ ] No references in code, tests, docs, or config.\n- [ ] ADR\u002Fspec status updated (e.g. Accepted → Implemented).\n- [ ] `package.json` \u002F `requirements.txt` cleaned.\n- [ ] Deprecation warnings removed; old docs deleted or moved to `_archive\u002F`.\n- [ ] Epic closed with a summary PR description.\n\n**Gate:** removal is complete only when grep finds nothing across code, tests, docs, and config.\n\n## Worked example: Axios → fetch (Epic #1039)\n\nThe axios removal is the canonical run of the procedure above — read it as the template, then apply the phases to your own case.\n\n1. **Trigger (Phase 1):** supply-chain risk on the axios npm package (CVE-2025-27152). Replacement = native `fetch` wrapped in `src\u002Fapi\u002Fconfig.ts`.\n2. **Pin + plan (Phase 1-2):** axios pinned exact as the emergency stopgap; plan captured in `docs\u002Farchitecture\u002Fproject-decisions\u002FADR-013-axios-pinning-fetch-migration.md` (full plan archived at `v2\u002Fdocs\u002F_archive\u002Fplans\u002FPLAN_axios_to_fetch_migration.md`).\n3. **Tooling (Phase 2):** added `fetchBlob` and `fetchWithErrorMapping` to `config.ts` so clients had feature parity.\n4. **Migrate (Phase 3):** moved clients one PR at a time — `acoesNotificacao.ts` (simplest), `adminDAT.ts` (error mapping), `datModule.ts` (blob support) — then the hook\u002Fcomponent consumers.\n5. **Remove (Phase 4):** deleted the dead client layer and uninstalled axios from `package.json`.\n6. **Verify (Phase 4 gate):** ~40KB smaller bundle, zero axios imports, all tests green. There is no `src\u002Fapi.ts` or `httpClient.ts` — the single wrapper is `config.ts`.\n\n## Decision shortcut\n\n```\n1. Still provides unique value? ........ YES: maintain. NO: continue.\n2. How many consumers? ................. quantify via grep before anything else.\n3. Replacement exists? ................. NO: build it first. Never deprecate without one.\n4. Migration cost per consumer? ........ trivial → automate + migrate yourself.\n5. Cost of NOT deprecating? ............ security risk \u002F engineer time \u002F dependency freeze?\n```\n\n## When this skill applies\n\n- Replacing an old lib\u002FAPI\u002Fmodel\u002Ffield with a new one (e.g. axios → fetch).\n- Consolidating duplicate systems (e.g. multiple notification paths).\n- Removing zombie code — no owner, but still has consumers → `reference\u002Fzombie-code.md`.\n- Sunsetting unused features (check metrics first).\n\n## Reference\n\n- `reference\u002Fmigration-patterns.md` — strangler, adapter, two-phase Django migration, in-code deprecation markers.\n- `reference\u002Fadvisory-vs-compulsory.md` — choosing the deprecation mode.\n- `reference\u002Fzombie-code.md` — detecting ownerless code with live consumers.\n- `reference\u002Frationalizations.md` — counters to \"it still works\" + Red Flags list.\n- Epic #1039 — axios → fetch (worked example).\n- `docs\u002Farchitecture\u002Fproject-decisions\u002FADR-013-axios-pinning-fetch-migration.md` — axios pin + fetch migration.\n- `v2\u002Fdocs\u002Fspecs\u002Ffrontend\u002Fapi-clients.spec.md` — living index for the `src\u002Fapi\u002F` layer.\n- Memory `project_etl_removed.md` — `apps.dat_ingest` deletion (a completed compulsory removal).\n",{"name":5,"description":7},"main","9e3a882d83e0853bdc570ae9d89c02d2a53bed82",".agents\u002Fskills\u002Fdeprecation-and-migration","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa","Dev Python | IA | Automation | HTML | CSS | Data | Process | Projects","2026-11-12 02:52:37",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add matheusnorjosa\u002Faprender_sistema --skill deprecation-and-migration",{"tool":57,"command":58},"bunx","bunx skills add matheusnorjosa\u002Faprender_sistema --skill deprecation-and-migration",{"tool":60,"command":61},"pnpm","pnpm dlx skills add matheusnorjosa\u002Faprender_sistema --skill deprecation-and-migration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdeprecation-and-migration\u002FSKILL.md",true,[65,71,75,79],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"reference\u002Fadvisory-vs-compulsory.md","REFERENCE","参考文档",919,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdeprecation-and-migration\u002Freference\u002Fadvisory-vs-compulsory.md",{"path":72,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":73,"sourceHtmlUrl":74},"reference\u002Fmigration-patterns.md",3220,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdeprecation-and-migration\u002Freference\u002Fmigration-patterns.md",{"path":76,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":77,"sourceHtmlUrl":78},"reference\u002Frationalizations.md",1030,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdeprecation-and-migration\u002Freference\u002Frationalizations.md",{"path":80,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":81,"sourceHtmlUrl":82},"reference\u002Fzombie-code.md",666,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdeprecation-and-migration\u002Freference\u002Fzombie-code.md",[84,121,144,165,177,208],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":100,"publishedAt":39},"01M6C0WHSP7S2QMJGGMQRXJ6PD","writing-standards","Apply AS v2 technical-writing standards (clarity, brevity, active voice, Python\u002FDjango conventions). Use when writing a README, a docstring (PEP 257), a commit message, a PR description, an error message, or any technical doc.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwriting-standards\u002FSKILL.md",[90,95],{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,28,117,118,119,120,24],"writing","writing standards","standards","python","commit","pr","pr description","commit message","doc","voice","clarity","django","technical","README","message","active","error","technical-writing","brevity","docstring",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":39},"01M6C0WG2SBP9PJG1YQFGGVJAR","verification-gate","Verify before claiming success. Use when about to say something works\u002Fis done, after implementing a feature, after a bugfix, or before pushing — run the proof command and confirm output first.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fverification-gate\u002FSKILL.md",[],[128,129,130,131,132,133,134,34,135,136,137,138,139,140,141,142,143,24],"verification","verification gate","gate","run","first","verify","command","verify before claiming","say","done","feature","proof","bugfix","output","about","implementing",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":153,"publishedAt":39},"01M6C0WE010G12KH45YZW6M7K5","test-driven-development","Write the failing test before the implementation in AS v2 (pytest + Django\u002FDRF). Use when implementing a feature or fixing a bug, before any production code is written.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-driven-development\u002FSKILL.md",[150],{"categoryNo":151,"categoryName":152,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000008","测试与质量",[154,155,156,157,31,158,112,159,34,160,161,162,138,28,163,143,24,164],"test","test driven development","development","driven","Production","write","bug","implementation","pytest","drf","failing",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":39},"01M6C0WC6Y81XRVBJQSTKA96XQ","subagent-development","Orquestra subagents no AS v2 — decompõe a tarefa em domínios independentes, paraleliza e revisa em 2 estágios. Use ao delegar exploração, implementação ou validação cross-arquivo para acelerar o trabalho e poupar o contexto principal.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsubagent-development\u002FSKILL.md",[],[156,172,173,174,175,34,176,28],"subagent","subagent development","para","subagents","ao",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":39},"01M6C0W9W8D6JJWXW28Q7ZHAC9","security-scan","Automated security scanning for AS v2. Use before commits or when reviewing changes for vulnerabilities. Runs dependency audit (pip-audit, npm audit), secret detection (grep patterns), and code pattern scanning (SQL injection, XSS, eval, pickle, hardcoded secrets). Integrates with project hooks system.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsecurity-scan\u002FSKILL.md",[],[184,185,186,187,188,31,189,190,191,192,193,194,195,196,197,198,199,200,34,201,202,203,28,26,204,205,206,207,24],"security","security scan","scan","vulnerabilities","sql","npm","audit","dependency audit","detection","injection","xss","secrets","pip-audit","commits","system","grep","eval","hooks","security scanning","project","true","pip","for","changes",{"skillNo":209,"name":210,"nameZh":6,"description":211,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":212,"categories":213,"keywords":217,"publishedAt":39},"01M6C0W7RE3G3C2852YXQKR5J9","resume-handoff","Resume work from a saved handoff document, validating its state against the current codebase before continuing. Use when resuming work from a saved handoff after a context clear or in a new session (path, session name, or GitHub issue).","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fresume-handoff\u002FSKILL.md",[214],{"categoryNo":215,"categoryName":216,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000038","人力资源",[218,219,220,221,222,223,224,225,226,34,227,228,229,230,231,232,233,234,24,23],"handoff","resume handoff","resume","github","state","new session","work","context","session","github issue","issue","document","clear","name","saved","codebase","resuming"]