{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "Nishikanta Ray",
  "title_listed": "AI Skills Are Not Just Prompts: A Practical Architecture for Building, Evaluating, Shipping, and Maintaining Agent Skills",
  "keywords": "",
  "domain": "大模型算法",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://dev.to/nishikantaray/ai-skills-are-not-just-prompts-a-practical-architecture-for-building-evaluating-shipping-and-540h",
  "publish_date": "2026-09-03",
  "corpus_stage": "",
  "notes": "",
  "id": "6cb2f363fd73",
  "collected_at": "2026-10-02T14:04:38",
  "title": "AI Skills Are Not Just Prompts: A Practical Architecture for Building, Evaluating, Shipping, and Maintaining Agent Skills - DEV Community",
  "body_markdown": "The current generation of AI coding agents makes it surprisingly easy to create a \"skill.\"\nWrite a Markdown file. Add instructions. Give it a name. Put it inside\n.claude/skills/\n. Done.\nExcept it isn't.\nAs soon as you build more than a handful of skills, a different set of problems appears:\nWhich skill should activate?\nWhy did two skills activate at the same time?\nWhy did the agent ignore an important instruction?\nWhat belongs in a skill versus a rule, agent, hook, or script?\nHow much context should the skill load?\nHow do you test whether the skill actually works?\nWhat happens when the underlying framework changes?\nHow do you distribute skills?\nHow do you retire obsolete skills?\nHow do you prevent dozens of skills from becoming an unmaintainable mess?\nAt that point,\nAI skills stop looking like prompts and start looking like software systems\n.\nA production-grade AI skill is not merely a Markdown prompt. It is a versioned, testable, routable, enforceable software component with a defined lifecycle.\n1. The Skill Lifecycle\nA useful way to understand an AI skill is to look at its entire lifecycle:\nRuntime\n   ↓\nScope / Fit\n   ↓\nTriggers\n   ↓\nArchitecture\n   ↓\nAnatomy\n   ↓\nContent\n   ↓\nEnforcement\n   ↓\nMeasurement\n   ↓\nShipping\n   ↓\nMaintenance\n   ↓\nPortfolio\nEnter fullscreen mode\nExit fullscreen mode\nEach stage answers a different question:\nStage\nCore question\nRuntime\nHow does the skill load and execute?\nFit & scope\nShould this be a skill at all?\nTyping & triggers\nWhen should it activate?\nArchitecture\nHow should the workflow operate?\nAnatomy\nWhat files make up the skill?\nContent\nHow should instructions be written?\nEnforcement\nWhat can be enforced mechanically?\nMeasurement\nHow do we know it works?\nShipping\nHow do users receive it?\nMaintenance\nHow does it survive change?\nPortfolio\nHow do many skills coexist?\nThe important insight is that\nskill engineering covers the entire lifecycle, not just the writing of\nSKILL.md\n.\n2. Chapter 00 — How Skills Load and Run\nBefore designing a skill, understand the runtime.\nA skill may look simple on disk:\n.claude/\n└── skills/\n    └── code-review/\n        └── SKILL.md\nEnter fullscreen mode\nExit fullscreen mode\nBut conceptually the runtime does something like:\nUser request\n     ↓\nSkill discovery\n     ↓\nTrigger evaluation\n     ↓\nSkill activation\n     ↓\nInstruction loading\n     ↓\nReference/tool loading\n     ↓\nAgent execution\n     ↓\nResult\nEnter fullscreen mode\nExit fullscreen mode\nThe important question is:\nWhat does the agent actually see, and when does it see it?\nThis matters because context is limited.\nA skill might contain:\nSKILL.md\nreferences/\n    database.md\n    security.md\n    examples.md\n    architecture.md\nscripts/\n    validate.js\n    check.sh\ntemplates/\n    report.md\nEnter fullscreen mode\nExit fullscreen mode\nYou usually don't want every file loaded for every request.\nInstead:\nRequest\n   ↓\nSKILL.md\n   ↓\nDetermine relevant task\n   ↓\nLoad relevant reference\n   ↓\nExecute required script\nEnter fullscreen mode\nExit fullscreen mode\nThis is\nprogressive context loading\n.\nThe main skill file acts as an entry point rather than a giant knowledge dump.\nContext Is a Resource\nOne of the biggest mistakes in AI skill design is treating context as free.\nIt isn't.\nDesign A — Everything in one file\nSKILL.md\n──────────────\n3000 lines\n50 examples\n20 rules\n10 workflows\n15 edge cases\nEnter fullscreen mode\nExit fullscreen mode\nDesign B — Layered knowledge\nSKILL.md\n   ↓\nRouting\n   ↓\nreferences/\n   ├── workflow.md\n   ├── security.md\n   └── examples.md\nEnter fullscreen mode\nExit fullscreen mode\nThe second design gives you more control over what enters the model's context.\nDesign skills around context boundaries, not just file boundaries.\n3. Chapter 01 — Fit and Scope\nThe next question is:\nShould this behavior be implemented as a skill?\nAI development environments often provide multiple primitives:\nSkill\nRule\nAgent\nHook\nScript\nPlugin\nEnter fullscreen mode\nExit fullscreen mode\nThey are not interchangeable.\nSkill\nA skill describes\nhow to perform a class of task\n.\nExample:\ndatabase-migration\nEnter fullscreen mode\nExit fullscreen mode\nIt might define:\n1. Inspect schema\n2. Inspect migration history\n3. Design migration\n4. Implement migration\n5. Validate migration\n6. Test rollback\nEnter fullscreen mode\nExit fullscreen mode\nRule\nA rule is a constraint:\nNever modify production data directly.\nEnter fullscreen mode\nExit fullscreen mode\nThat is policy, not a workflow.\nAgent\nAn agent is useful when you need a distinct reasoning or execution role:\nMain Agent\n   ├── Research Agent\n   ├── Security Agent\n   └── Testing Agent\nEnter fullscreen mode\nExit fullscreen mode\nHook\nA hook responds to an event:\nBefore tool call\n      ↓\nSecurity check\nEnter fullscreen mode\nExit fullscreen mode\nor:\nAfter file modification\n      ↓\nFormatter\nEnter fullscreen mode\nExit fullscreen mode\nScript\nA script performs deterministic computation:\nvalidate-schema.js\nEnter fullscreen mode\nExit fullscreen mode\nThe AI may decide\nwhen\nto run it. The script determines\nhow\nvalidation works.\n4. The Boundary Is More Important Than the Skill\nA good skill should explicitly state what it does not do.\nFor example:\nThis skill handles:\n-\nPostgreSQL schema migrations\n-\nMigration generation\n-\nMigration validation\n-\nRollback testing\n\nThis skill does not handle:\n-\nApplication architecture\n-\nProduction deployment\n-\nDatabase backups\n-\nInfrastructure provisioning\nEnter fullscreen mode\nExit fullscreen mode\nWhy?\nBecause skills tend to grow.\nA developer starts with:\ndatabase migration\nEnter fullscreen mode\nExit fullscreen mode\nThen adds:\ndatabase design\nquery optimization\nbackup strategy\nproduction deployment\nEnter fullscreen mode\nExit fullscreen mode\nEventually the skill becomes:\ndatabase-engineering-everything\nEnter fullscreen mode\nExit fullscreen mode\nand becomes difficult to reason about.\nScope is a defense against skill inflation.\n5. Chapter 02 — Typing and Triggers\nOnce you know what a skill does, you need to answer:\nWhen should it activate?\nImagine:\nfrontend-review\nbackend-review\nsecurity-review\nperformance-review\ndatabase-review\nEnter fullscreen mode\nExit fullscreen mode\nThe user says:\n\"Review my authentication API.\"\nMultiple skills may be relevant.\nYou now have a routing problem:\nUser request\n                      │\n        ┌─────────────┼─────────────┐\n        ↓             ↓             ↓\n    Backend       Security       Performance\nEnter fullscreen mode\nExit fullscreen mode\nIf everything activates, the system becomes noisy.\nIf nothing activates, the skill is useless.\nActivation Is a Classification Problem\nThink of activation as:\nUser request\n      ↓\nIntent classification\n      ↓\nSkill candidates\n      ↓\nRelevance evaluation\n      ↓\nActivation\nEnter fullscreen mode\nExit fullscreen mode\nExample:\nRequest\nExpected skill\n\"Create a PostgreSQL migration\"\nDatabase migration\n\"Fix this React component\"\nFrontend\n\"Audit authentication\"\nSecurity\n\"Why is this query slow?\"\nDatabase performance\n\"Write a technical article\"\nDocumentation\nA good skill therefore needs a clear\nactivation signature\n.\nFalse Positives and False Negatives\nFalse positive\n\"Write a blog about PostgreSQL\"\n\n→ security skill activates\nEnter fullscreen mode\nExit fullscreen mode\nFalse negative\n\"Why is my PostgreSQL migration failing?\"\n\n→ database migration skill does not activate\nEnter fullscreen mode\nExit fullscreen mode\nBoth are important.\nTherefore, evaluate\nactivation separately from execution\n.\n6. Chapter 03 — Shape and Architecture\nOnce a skill activates, what does it actually do?\nThere are several useful workflow shapes.\nRoute\nA route chooses a path:\nRequest\n                    ↓\n                 classify\n              /     |                   /      |                  Bug    Feature   Refactor\n            ↓        ↓         ↓\n         Debug    Implement  Refactor\nEnter fullscreen mode\nExit fullscreen mode\nPipeline\nA pipeline is sequential:\nResearch\n   ↓\nAnalyze\n   ↓\nPlan\n   ↓\nImplement\n   ↓\nTest\n   ↓\nReview\n   ↓\nReport\nEnter fullscreen mode\nExit fullscreen mode\nThis is particularly useful for engineering skills.\nLoop\nA loop supports iteration:\nImplement\n    ↓\nTest\n    ↓\nFailed?\n  /    Yes     No\n ↓       ↓\nFix    Complete\n ↓\nTest again\nEnter fullscreen mode\nExit fullscreen mode\nFor coding agents, this is natural:\nWrite implementation\n        ↓\nRun tests\n        ↓\nRead failure\n        ↓\nModify implementation\n        ↓\nRun tests again\nEnter fullscreen mode\nExit fullscreen mode\nFailure becomes an expected workflow state rather than an exceptional event.\nMap\nA map splits a problem into independent pieces:\nResearch repository\n                        │\n          ┌─────────────┼─────────────┐\n          ↓             ↓             ↓\n       Frontend      Backend       Database\n          ↓             ↓             ↓\n       Findings      Findings      Findings\n          └─────────────┼─────────────┘\n                        ↓\n                     Synthesis\nEnter fullscreen mode\nExit fullscreen mode\nCombining Shapes\nReal skills often combine these patterns:\nRoute\n  ↓\nPipeline\n  ↓\nMap\n  ↓\nLoop\n  ↓\nFinal report\nEnter fullscreen mode\nExit fullscreen mode\nThis is where AI skills start looking like\nworkflow engines rather than prompts\n.\n7. Chapter 04 — Anatomy\nA mature skill might look like:\nskills/\n└── deep-research/\n    │\n    ├── SKILL.md\n    │\n    ├── references/\n    │   ├── research-methodology.md\n    │   ├── source-evaluation.md\n    │   └── evidence.md\n    │\n    ├── scripts/\n    │   ├── validate-sources.js\n    │   └── generate-report.js\n    │\n    ├── templates/\n    │   └── report.md\n    │\n    └── examples/\n        ├── example-1.md\n        └── example-2.md\nEnter fullscreen mode\nExit fullscreen mode\nEach part has a job.\nSKILL.md\nIs the Hub\nThink of\nSKILL.md\nas the router and operating manual.\nIt should explain:\nWhat this skill does\nWhen it activates\nWhat it must accomplish\nWhat references to load\nWhat workflow to follow\nWhat constraints apply\nHow to validate the result\nEnter fullscreen mode\nExit fullscreen mode\nIt should not necessarily contain every piece of knowledge.\nHub-and-Spoke Architecture\nSKILL.md\n                  /   |                    /    |                    ↓     ↓     ↓\n          References Scripts Templates\nEnter fullscreen mode\nExit fullscreen mode\nThe hub provides orchestration.\nThe spokes provide specialized resources.\nData vs Instructions vs Code\nSeparate them:\nInstructions\nSKILL.md\nEnter fullscreen mode\nExit fullscreen mode\nTell the agent what to do.\nData\nreferences/\nEnter fullscreen mode\nExit fullscreen mode\nProvide knowledge.\nCode\nscripts/\nEnter fullscreen mode\nExit fullscreen mode\nPerform deterministic operations.\nThis separation makes skills easier to maintain and test.\n8. Chapter 05 — Writing the Content\nNow we reach the instruction layer.\nCompare:\nWeak\nYou might want to check whether tests pass.\nStrong\nRun the test suite before declaring the task complete.\nStronger\nDo not declare the task complete until the test suite passes.\nThe difference is\nbinding strength\n.\nInstructions Have Different Authority\nPreference\nPrefer TypeScript.\nEnter fullscreen mode\nExit fullscreen mode\nRequirement\nUse TypeScript for new files.\nEnter fullscreen mode\nExit fullscreen mode\nHard constraint\nDo not create JavaScript files. New implementation files must use TypeScript.\nEnter fullscreen mode\nExit fullscreen mode\nImportant rules should be unambiguous.\nPresent-Tense Instructions\nInstead of:\nThe agent should inspect the repository.\nEnter fullscreen mode\nExit fullscreen mode\nwrite:\nInspect the repository before making changes.\nEnter fullscreen mode\nExit fullscreen mode\nInstead of:\nThe agent will run the tests after implementation.\nEnter fullscreen mode\nExit fullscreen mode\nwrite:\nRun the tests after implementation.\nEnter fullscreen mode\nExit fullscreen mode\nDirect instructions are easier to interpret.\nDon't Overload the Skill With Philosophy\nAvoid thousands of words explaining philosophy.\nPrefer operational instructions:\n1. Inspect X.\n2. Determine Y.\n3. Run Z.\n4. If Z fails, investigate.\n5. Do not proceed until Y is verified.\nEnter fullscreen mode\nExit fullscreen mode\nThe skill should be\noperational\n.\n9. Chapter 06 — Enforcement\nThis is one of the most important ideas.\nDon't rely on the model to enforce something that software can enforce.\nSuppose your skill says:\nAlways run Prettier.\nEnter fullscreen mode\nExit fullscreen mode\nThe agent might comply.\nBut it might also forget.\nA stronger design is:\nAI modifies file\n      ↓\nHook\n      ↓\nPrettier\n      ↓\nFormatted file\nEnter fullscreen mode\nExit fullscreen mode\nFormatting no longer depends entirely on model memory.\nAI Instructions vs Mechanical Enforcement\nConsider:\nNever commit secrets.\nA prompt can say:\nRULE:\nNever commit API keys.\nEnter fullscreen mode\nExit fullscreen mode\nBut a stronger architecture is:\nAgent\n  ↓\ngit commit\n  ↓\nsecret scanner\n  ↓\nSecret found?\n  ├── Yes → Block commit\n  └── No  → Continue\nEnter fullscreen mode\nExit fullscreen mode\nEnforcement Hierarchy\nA useful model is:\nHuman judgment\n      ↓\nAI instruction\n      ↓\nAutomated validation\n      ↓\nMechanical enforcement\nEnter fullscreen mode\nExit fullscreen mode\nThe further down the stack you go, the less you rely on model compliance.\nExamples of good candidates for automation:\nFormatting\nLinting\nType checking\nSchema validation\nTests\nSecret detection\nFile naming\nGenerated artifacts\nSQL safety\nPermission boundaries\nEnter fullscreen mode\nExit fullscreen mode\nThe AI should focus on tasks requiring judgment.\n10. Chapter 07 — Measurement\nNow ask:\nHow do we know the skill works?\nA skill should ideally be evaluated, not merely read and trusted.\nThere are two major dimensions.\nActivation Evaluation\nDid the correct skill activate?\nExample:\nPrompt:\n\"Create a PostgreSQL migration for the users table.\"\n\nExpected:\ndatabase-migration → activated\nEnter fullscreen mode\nExit fullscreen mode\nYou can maintain an evaluation set:\n┌────────────────────────────────────┐\n│ Activation Evaluation              │\n├────────────────────────────────────┤\n│ Prompt                             │\n│ Expected skill                     │\n│ Should activate?                   │\n│ Actual skill                       │\n│ Result                             │\n└────────────────────────────────────┘\nEnter fullscreen mode\nExit fullscreen mode\nBehavior Evaluation\nOnce activated, did the skill behave correctly?\nSuppose the migration skill requires:\nInspect schema\nCheck migration history\nCreate migration\nValidate SQL\nTest migration\nTest rollback\nEnter fullscreen mode\nExit fullscreen mode\nBehavior evaluation checks those requirements.\nSkill\n                      ↓\n             ┌────────┴────────┐\n             ↓                 ↓\n       Activation          Behavior\n             ↓                 ↓\n        Correct skill?    Correct workflow?\nEnter fullscreen mode\nExit fullscreen mode\nA skill could have:\n90% activation accuracy\n40% behavior accuracy\nEnter fullscreen mode\nExit fullscreen mode\nand still be a poor skill.\nMeasuring Skills Like Software\nUseful metrics include:\nActivation accuracy\ncorrect activations / total activation tests\nEnter fullscreen mode\nExit fullscreen mode\nFalse positive rate\nincorrect activations / total tests\nEnter fullscreen mode\nExit fullscreen mode\nFalse negative rate\nmissed activations / applicable tests\nEnter fullscreen mode\nExit fullscreen mode\nTask success rate\nsuccessful executions / total executions\nEnter fullscreen mode\nExit fullscreen mode\nRule compliance\nrequired behaviors satisfied / required behaviors\nEnter fullscreen mode\nExit fullscreen mode\nRegression rate\npreviously passing cases now failing\nEnter fullscreen mode\nExit fullscreen mode\nThis turns skill development into an engineering discipline.\n11. Auditing Against Prior Art\nAnother useful activity is comparing your skill against existing approaches.\nSuppose you create:\ndeep-research\nEnter fullscreen mode\nExit fullscreen mode\nBefore declaring it complete, ask:\nWhat existing research workflows already exist?\n\nWhat evaluation techniques do they use?\n\nWhat source-quality rules are common?\n\nWhat am I missing?\n\nWhich practices are unnecessarily complicated?\nEnter fullscreen mode\nExit fullscreen mode\nThis is\nprior-art auditing\n.\nYou don't need to reinvent every workflow.\n12. Chapter 08 — Shipping\nA skill isn't useful if nobody can install it.\nA typical flow is:\nDevelopment\n    ↓\nRepository\n    ↓\nPackage / Plugin\n    ↓\nDistribution\n    ↓\nInstallation\n    ↓\nSkill available\nEnter fullscreen mode\nExit fullscreen mode\nPlugin Binding\nA plugin can act as a distribution container:\nPlugin\n│\n├── Skills\n│   ├── research\n│   ├── testing\n│   └── code-review\n│\n├── Hooks\n├── Commands\n└── Configuration\nEnter fullscreen mode\nExit fullscreen mode\nThis lets users install a cohesive collection rather than manually copying individual files.\nVersioning\nOnce users depend on a skill, versioning matters:\nresearch-skill@1.0.0\nresearch-skill@1.1.0\nresearch-skill@2.0.0\nEnter fullscreen mode\nExit fullscreen mode\nChanging:\n\"prefer X\"\nEnter fullscreen mode\nExit fullscreen mode\nto:\n\"must use X\"\nEnter fullscreen mode\nExit fullscreen mode\ncan change agent behavior significantly.\nTherefore skill versions should be treated as meaningful behavioral versions.\nDormancy\nA skill may sit unused for months.\nThen:\nDeveloper\n   ↓\ninvokes old skill\n   ↓\nframework changed\n   ↓\nskill behaves differently\nEnter fullscreen mode\nExit fullscreen mode\nThis is\nskill dormancy\n.\nSkills need lifecycle states and maintenance expectations.\n13. Chapter 09 — Maintenance\nAI skills exist inside rapidly changing ecosystems.\nThings change:\nAI models\nAgent runtimes\nAPIs\nCLI tools\nFrameworks\nRepository structures\nTool interfaces\nBest practices\nSecurity requirements\nEnter fullscreen mode\nExit fullscreen mode\nTherefore:\nA skill is software, and software drifts.\nDrift\nSuppose:\nTool v1\n ↓\nSkill v1\nEnter fullscreen mode\nExit fullscreen mode\nLater:\nTool v2\n ↓\nbehavior changed\nEnter fullscreen mode\nExit fullscreen mode\nYour skill still assumes the old behavior.\nThat is drift.\nVendored Knowledge\nSuppose your skill contains a copy of external documentation:\nexternal methodology\n       ↓\ncopy\n       ↓\nyour skill\nEnter fullscreen mode\nExit fullscreen mode\nThe external source changes.\nYour copy doesn't.\nNow:\nUpstream\n   ↓\nVersion 3\n\nYour skill\n   ↓\nVersion 1\nEnter fullscreen mode\nExit fullscreen mode\nYou have a maintenance obligation.\nReview Gate\nA good update flow is:\nUpstream changes\n       ↓\nDetect change\n       ↓\nReview\n       ↓\nUpdate skill\n       ↓\nRun evaluation suite\n       ↓\nCheck regressions\n       ↓\nRelease\nEnter fullscreen mode\nExit fullscreen mode\nNot:\nUpstream changed\n       ↓\nblindly copy everything\nEnter fullscreen mode\nExit fullscreen mode\n14. Chapter 10 — The Skill Portfolio\nOne skill is easy.\nTwo are manageable.\nTen are interesting.\nFifty become an architecture problem.\nYou may eventually have:\nskills/\n├── research/\n├── frontend/\n├── backend/\n├── database/\n├── security/\n├── testing/\n├── performance/\n├── deployment/\n├── documentation/\n├── architecture/\n├── debugging/\n└── code-review/\nEnter fullscreen mode\nExit fullscreen mode\nNow you need portfolio management.\nSkill Collision\nSuppose the user says:\n\"Review my API.\"\nPotential matches:\napi-review\nbackend-review\nsecurity-review\nperformance-review\nEnter fullscreen mode\nExit fullscreen mode\nWhich one activates?\nThis is a\ncollision\n.\nIf multiple skills activate, their instructions may conflict.\nFor example:\nSkill A:\n\"Keep the implementation minimal.\"\n\nSkill B:\n\"Add extensive validation.\"\n\nSkill C:\n\"Refactor the architecture.\"\nEnter fullscreen mode\nExit fullscreen mode\nA skill portfolio therefore needs routing and priority policies.\nSkill Granularity\nHow large should a skill be?\nToo broad:\nsoftware-engineering\nEnter fullscreen mode\nExit fullscreen mode\nwith everything inside it.\nToo narrow:\nread-file\nwrite-file\ncheck-import\ncheck-variable\nrun-test\nEnter fullscreen mode\nExit fullscreen mode\nYou don't want hundreds of microscopic skills.\nA better structure might be:\nEngineering\n│\n├── Research\n├── Implementation\n├── Testing\n├── Security\n└── Deployment\nEnter fullscreen mode\nExit fullscreen mode\nEach skill owns a meaningful capability.\nRouter Families\nA router can first identify the broad family:\nUser request\n                       ↓\n                  Main Router\n                       ↓\n       ┌───────────────┼───────────────┐\n       ↓               ↓               ↓\n   Research        Engineering      Operations\n       ↓               ↓               ↓\n   Research        Backend         Deployment\n   skill           Security        Monitoring\n                   Testing\nEnter fullscreen mode\nExit fullscreen mode\nInstead of asking:\n\"Which of these 100 skills should run?\"\nyou ask:\nWhich family?\n     ↓\nWhich subcategory?\n     ↓\nWhich skill?\nEnter fullscreen mode\nExit fullscreen mode\nRetirement\nA healthy portfolio needs a retirement policy.\nA skill may become obsolete because:\nthe underlying tool disappeared\nthe workflow became part of another skill\nthe framework changed\nthe skill is redundant\nanother skill superseded it\nnobody uses it anymore\nA lifecycle might be:\nExperimental\n     ↓\nActive\n     ↓\nStable\n     ↓\nDeprecated\n     ↓\nRetired\nEnter fullscreen mode\nExit fullscreen mode\nThis prevents the skill directory from becoming a graveyard.\n15. The Deeper Architecture: Instructions + Tools + Enforcement + Evaluation\nA mature skill can be viewed as four major layers:\n┌──────────────────────────────────────┐\n│              SKILL                   │\n│                                      │\n│  ┌────────────────────────────────┐  │\n│  │ Instructions                    │  │\n│  │ What the agent should do       │  │\n│  └────────────────────────────────┘  │\n│                  ↓                   │\n│  ┌────────────────────────────────┐  │\n│  │ Workflow                       │  │\n│  │ Route / Pipeline / Loop / Map │  │\n│  └────────────────────────────────┘  │\n│                  ↓                   │\n│  ┌────────────────────────────────┐  │\n│  │ Enforcement                    │  │\n│  │ Hooks / Scripts / Tests       │  │\n│  └────────────────────────────────┘  │\n│                  ↓                   │\n│  ┌────────────────────────────────┐  │\n│  │ Evaluation                     │  │\n│  │ Activation / Behavior / QA    │  │\n│  └────────────────────────────────┘  │\n└──────────────────────────────────────┘\nEnter fullscreen mode\nExit fullscreen mode\nThis is the important shift in thinking.\nA skill is not merely:\nprompt → answer\nEnter fullscreen mode\nExit fullscreen mode\nIt is closer to:\nintent\n  ↓\nrouting\n  ↓\ncontext\n  ↓\nworkflow\n  ↓\ntools\n  ↓\nvalidation\n  ↓\nfeedback\n  ↓\nresult\nEnter fullscreen mode\nExit fullscreen mode\n16. Example: Building a Deep Research Skill\nSuppose you want:\ndeep-research\nEnter fullscreen mode\nExit fullscreen mode\nIts directory could be:\ndeep-research/\n├── SKILL.md\n├── references/\n│   ├── research-methodology.md\n│   ├── source-quality.md\n│   ├── evidence-evaluation.md\n│   └── synthesis.md\n├── scripts/\n│   ├── validate-sources.js\n│   └── generate-report.js\n├── templates/\n│   └── research-report.md\n└── evals/\n    ├── activation.json\n    └── behavior.json\nEnter fullscreen mode\nExit fullscreen mode\nStep 1 — Define Scope\nThis skill performs structured research.\n\nIt handles:\n- multi-source research\n- source evaluation\n- evidence synthesis\n- contradiction analysis\n- structured reporting\n\nIt does not handle:\n- software implementation\n- deployment\n- generic writing\nEnter fullscreen mode\nExit fullscreen mode\nStep 2 — Define Activation\nPotential activation prompts:\n\"Research this topic deeply.\"\n\n\"Investigate the current state of...\"\n\n\"Compare these technologies using external sources.\"\n\n\"Find evidence for and against this claim.\"\nEnter fullscreen mode\nExit fullscreen mode\nNon-activation examples:\n\"Fix this React bug.\"\n\n\"Run the tests.\"\n\n\"Format this file.\"\nEnter fullscreen mode\nExit fullscreen mode\nStep 3 — Define the Workflow\nUnderstand question\n       ↓\nDecompose question\n       ↓\nIdentify evidence requirements\n       ↓\nSearch\n       ↓\nEvaluate sources\n       ↓\nExtract evidence\n       ↓\nCross-check claims\n       ↓\nSynthesize\n       ↓\nWrite report\n       ↓\nValidate citations\nEnter fullscreen mode\nExit fullscreen mode\nStep 4 — Add a Loop\nIf two sources disagree:\nSource A → Claim X\nSource B → Claim Y\nEnter fullscreen mode\nExit fullscreen mode\nthen:\nConflict detected\n       ↓\nInvestigate\n       ↓\nFind additional sources\n       ↓\nRe-evaluate evidence\n       ↓\nResolve / report uncertainty\nEnter fullscreen mode\nExit fullscreen mode\nNow the skill combines:\nPipeline + Loop\nEnter fullscreen mode\nExit fullscreen mode\nStep 5 — Add Mechanical Validation\nInstead of only telling the AI:\n\"Make sure every claim has a citation.\"\nbuild a validator:\nReport\n  ↓\nCitation validator\n  ↓\nMissing citation?\n  ├── Yes → fail\n  └── No  → pass\nEnter fullscreen mode\nExit fullscreen mode\nStep 6 — Evaluate Activation\nExample:\nPrompt:\n\"Do a deep investigation into DuckDB vs PostgreSQL for analytics.\"\n\nExpected:\ndeep-research → YES\nEnter fullscreen mode\nExit fullscreen mode\nAnd:\nPrompt:\n\"Fix the DuckDB connection bug.\"\n\nExpected:\ndeep-research → NO\nEnter fullscreen mode\nExit fullscreen mode\nStep 7 — Evaluate Behavior\nFor a research request:\n✓ question decomposition\n✓ multiple sources\n✓ source quality assessment\n✓ evidence extraction\n✓ conflicting evidence analysis\n✓ synthesis\n✓ citations\n✓ final report\nEnter fullscreen mode\nExit fullscreen mode\nNow regressions can be detected.\n17. Applying This to an AI Engineering Harness\nThis model becomes especially interesting when building a larger AI development harness.\nImagine:\nAI HARNESS\n                        │\n                        ↓\n                  Intent Router\n                        │\n        ┌───────────────┼───────────────┐\n        ↓               ↓               ↓\n     Research       Engineering      Operations\n        │               │               │\n        ↓               ↓               ↓\n     Skills           Skills          Skills\n        │               │               │\n        └───────────────┼───────────────┘\n                        ↓\n                     Tools\n                        ↓\n                  Enforcement\n                        ↓\n                    Evaluation\n                        ↓\n                    Reporting\nEnter fullscreen mode\nExit fullscreen mode\nThis is much more powerful than simply having a folder full of Markdown files.\n18. Skills as a Policy Execution Layer\nTraditional software:\nCode\n ↓\nExecution\n ↓\nResult\nEnter fullscreen mode\nExit fullscreen mode\nAI software:\nIntent\n ↓\nSkill\n ↓\nReasoning\n ↓\nTools\n ↓\nResult\nEnter fullscreen mode\nExit fullscreen mode\nBut production AI systems need another layer:\nIntent\n ↓\nSkill\n ↓\nReasoning\n ↓\nTools\n ↓\nPolicy\n ↓\nValidation\n ↓\nResult\nEnter fullscreen mode\nExit fullscreen mode\nThe skill becomes a bridge between\nnatural-language intent and deterministic engineering systems\n.\n19. The Most Important Design Principle\nIf there is one idea to take away from all of this, it is:\nUse AI for judgment. Use software for certainty.\nLet the model handle:\nInterpretation\nPlanning\nHypothesis generation\nTrade-offs\nSynthesis\nCreative reasoning\nEnter fullscreen mode\nExit fullscreen mode\nLet software handle:\nFormatting\nValidation\nTesting\nSchema checking\nPermissions\nSecret detection\nDeterministic calculations\nPolicy enforcement\nEnter fullscreen mode\nExit fullscreen mode\nFor example:\nAI:\n\"These three files probably need to change.\"\n\nSoftware:\n\"Does the resulting code compile?\"\n\nAI:\n\"This migration should be safe.\"\n\nSoftware:\n\"Does the migration actually execute successfully?\"\n\nAI:\n\"These sources support the conclusion.\"\n\nSoftware:\n\"Are the required citations present?\"\nEnter fullscreen mode\nExit fullscreen mode\nThat division produces more reliable systems.\n20. Why Skill Engineering Will Become Important\nAs AI agents become more capable, the bottleneck increasingly shifts away from:\n\"Can the model write code?\"\ntoward:\n\"Can we reliably control how the model works?\"\nThat is a different engineering problem.\nWe need to reason about:\nActivation\nContext\nPermissions\nWorkflow\nTools\nMemory\nPolicies\nEvaluation\nRegression\nVersioning\nDistribution\nEnter fullscreen mode\nExit fullscreen mode\nThese are systems problems.\nThat is why skill engineering starts resembling:\nsoftware architecture\n        +\nprompt engineering\n        +\nworkflow orchestration\n        +\ntesting\n        +\npolicy enforcement\n        +\npackage management\nEnter fullscreen mode\nExit fullscreen mode\n21. Practical Checklist for Building a Skill\nScope\n[ ] Is this actually a skill?\n[ ] Could this be a rule?\n[ ] Could this be a hook?\n[ ] Could this be a script?\n[ ] What does the skill explicitly refuse to do?\nActivation\n[ ] When should it activate?\n[ ] When should it not activate?\n[ ] What are the ambiguous prompts?\n[ ] Can it collide with another skill?\nArchitecture\n[ ] Is the workflow a route?\n[ ] Pipeline?\n[ ] Loop?\n[ ] Map?\n[ ] Combination of these?\nContext\n[ ] Is\nSKILL.md\nconcise?\n[ ] Can supporting information be loaded progressively?\n[ ] Are references separated from instructions?\nEnforcement\n[ ] Which rules can be automated?\n[ ] Which checks should be hooks?\n[ ] Which checks should be scripts?\n[ ] Which requirements belong in CI?\nEvaluation\n[ ] Does the skill activate correctly?\n[ ] Does it perform the correct workflow?\n[ ] Are there regression tests?\n[ ] Are failure cases tested?\nShipping\n[ ] Is the skill versioned?\n[ ] Can another developer install it?\n[ ] Is plugin/package integration defined?\nMaintenance\n[ ] What external dependencies can drift?\n[ ] Are vendored references tracked?\n[ ] Is there a review process?\n[ ] Can the skill become deprecated?\nPortfolio\n[ ] Does it overlap with another skill?\n[ ] Is the granularity appropriate?\n[ ] Does the router know where it belongs?\n[ ] What happens when the skill is obsolete?\n22. Final Architecture\nPutting everything together:\nUSER INTENT\n                              │\n                              ▼\n                     ┌────────────────┐\n                     │     ROUTER     │\n                     └───────┬────────┘\n                             │\n                             ▼\n                    ┌──────────────────┐\n                    │      SKILL       │\n                    │                  │\n                    │ Scope            │\n                    │ Instructions     │\n                    │ Workflow         │\n                    │ References       │\n                    └────────┬─────────┘\n                             │\n                             ▼\n                  ┌─────────────────────┐\n                  │   AI REASONING      │\n                  └──────────┬──────────┘\n                             │\n                  ┌──────────┴──────────┐\n                  ↓                     ↓\n             Tools / APIs          Scripts\n                  │                     │\n                  └──────────┬──────────┘\n                             ↓\n                    ┌─────────────────┐\n                    │   ENFORCEMENT   │\n                    │                 │\n                    │ Hooks           │\n                    │ Policies        │\n                    │ Validators      │\n                    └────────┬────────┘\n                             ↓\n                    ┌─────────────────┐\n                    │   EVALUATION    │\n                    │                 │\n                    │ Activation      │\n                    │ Behavior        │\n                    │ Regression      │\n                    └────────┬────────┘\n                             ↓\n                         RESULT\nEnter fullscreen mode\nExit fullscreen mode\nAnd around the whole system:\n┌───────────────────────────────────┐\n          │           SKILL LIFECYCLE         │\n          │                                   │\n          │ Version → Ship → Observe →       │\n          │ Maintain → Update → Deprecate    │\n          │                                   │\n          └───────────────────────────────────┘\nEnter fullscreen mode\nExit fullscreen mode\nConclusion: From Prompt Files to AI Engineering\nThe simplest way to build an AI skill is:\nWrite SKILL.md\nEnter fullscreen mode\nExit fullscreen mode\nThe professional way is:\nDefine scope\n     ↓\nDefine activation\n     ↓\nDesign workflow\n     ↓\nStructure context\n     ↓\nWrite instructions\n     ↓\nAdd tools\n     ↓\nMechanically enforce critical rules\n     ↓\nEvaluate activation\n     ↓\nEvaluate behavior\n     ↓\nVersion\n     ↓\nShip\n     ↓\nMonitor drift\n     ↓\nMaintain\n     ↓\nRetire when necessary\nEnter fullscreen mode\nExit fullscreen mode\nThat is the fundamental shift.\nAI skills should be treated less like prompts and more like software components.\nA prompt tells an AI what you would\nlike\nit to do.\nA well-engineered skill defines:\nwhen\nit should act,\nwhat\nit should do,\nwhat context\nit should consume,\nhow\nit should execute,\nwhich rules\nare mandatory,\nwhat software can enforce\n,\nhow success is measured\n, and\nhow the component evolves over time\n.\nOnce you start thinking this way,\n.claude/skills/\nstops being a collection of Markdown files.\nIt becomes an\nAI-native software architecture layer\n.\nThe future of agent engineering is not just better prompts — it is better systems around prompts.",
  "metadata": {
    "title": "AI Skills Are Not Just Prompts: A Practical Architecture for Building, Evaluating, Shipping, and Maintaining Agent Skills - DEV Community",
    "description": "The current generation of AI coding agents makes it surprisingly easy to create a \"skill.\"  Write a... Tagged with agents, ai, architecture, softwareengineering.",
    "keywords": "agents, ai, architecture, softwareengineering, software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/nishikantaray/ai-skills-are-not-just-prompts-a-practical-architecture-for-building-evaluating-shipping-and-540h",
    "og:title": "AI Skills Are Not Just Prompts: A Practical Architecture for Building, Evaluating, Shipping, and Maintaining Agent Skills",
    "og:description": "The current generation of AI coding agents makes it surprisingly easy to create a \"skill.\"  Write a...",
    "og:site_name": "DEV Community",
    "og:image": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpu1gqh734vb1gzx2mjd3.png",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@",
    "twitter:title": "AI Skills Are Not Just Prompts: A Practical Architecture for Building, Evaluating, Shipping, and Maintaining Agent Skills",
    "twitter:description": "The current generation of AI coding agents makes it surprisingly easy to create a \"skill.\"  Write a...",
    "twitter:card": "summary_large_image",
    "twitter:widgets:new-embed-design": "on",
    "twitter:image:src": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpu1gqh734vb1gzx2mjd3.png"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/6cb2f363fd73/code/body-000.txt",
      "chars": 163,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-001.txt",
      "chars": 63,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-002.txt",
      "chars": 180,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-003.txt",
      "chars": 152,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-004.txt",
      "chars": 109,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-005.txt",
      "chars": 83,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-006.txt",
      "chars": 96,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-007.txt",
      "chars": 36,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-008.txt",
      "chars": 19,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-009.txt",
      "chars": 129,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-010.txt",
      "chars": 39,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-011.txt",
      "chars": 76,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-012.txt",
      "chars": 40,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-013.txt",
      "chars": 42,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-014.txt",
      "chars": 19,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-015.txt",
      "chars": 247,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-016.txt",
      "chars": 19,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-017.txt",
      "chars": 73,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-018.txt",
      "chars": 32,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-019.txt",
      "chars": 82,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-020.txt",
      "chars": 175,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-021.txt",
      "chars": 116,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-022.txt",
      "chars": 60,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-023.txt",
      "chars": 88,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-024.txt",
      "chars": 236,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-025.txt",
      "chars": 81,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-026.txt",
      "chars": 94,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-027.txt",
      "chars": 122,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-028.txt",
      "chars": 368,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-029.txt",
      "chars": 53,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-030.txt",
      "chars": 376,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-031.txt",
      "chars": 161,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-032.txt",
      "chars": 150,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-033.txt",
      "chars": 9,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-034.txt",
      "chars": 12,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-035.txt",
      "chars": 9,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-036.txt",
      "chars": 19,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-037.txt",
      "chars": 30,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-038.txt",
      "chars": 78,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-039.txt",
      "chars": 41,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-040.txt",
      "chars": 46,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-041.txt",
      "chars": 51,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-042.txt",
      "chars": 36,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-043.txt",
      "chars": 107,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-044.txt",
      "chars": 21,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-045.txt",
      "chars": 70,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-046.txt",
      "chars": 29,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-047.txt",
      "chars": 104,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-048.txt",
      "chars": 98,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-049.txt",
      "chars": 139,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-050.txt",
      "chars": 103,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-051.txt",
      "chars": 351,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-052.txt",
      "chars": 98,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-053.txt",
      "chars": 229,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-054.txt",
      "chars": 46,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-055.txt",
      "chars": 45,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-056.txt",
      "chars": 36,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-057.txt",
      "chars": 38,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-058.txt",
      "chars": 41,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-059.txt",
      "chars": 50,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-060.txt",
      "chars": 37,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-061.txt",
      "chars": 14,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-062.txt",
      "chars": 196,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-063.txt",
      "chars": 112,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-064.txt",
      "chars": 116,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-065.txt",
      "chars": 63,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-066.txt",
      "chars": 11,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-067.txt",
      "chars": 13,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-068.txt",
      "chars": 87,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-069.txt",
      "chars": 126,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-070.txt",
      "chars": 20,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-071.txt",
      "chars": 28,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-072.txt",
      "chars": 55,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-073.txt",
      "chars": 51,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-074.txt",
      "chars": 152,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-075.txt",
      "chars": 50,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-076.txt",
      "chars": 192,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-077.txt",
      "chars": 61,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-078.txt",
      "chars": 121,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-079.txt",
      "chars": 21,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-080.txt",
      "chars": 58,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-081.txt",
      "chars": 86,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-082.txt",
      "chars": 400,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-083.txt",
      "chars": 60,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-084.txt",
      "chars": 74,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-085.txt",
      "chars": 941,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-086.txt",
      "chars": 16,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-087.txt",
      "chars": 93,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-088.txt",
      "chars": 14,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-089.txt",
      "chars": 321,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-090.txt",
      "chars": 245,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-091.txt",
      "chars": 168,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-092.txt",
      "chars": 61,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-093.txt",
      "chars": 254,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-094.txt",
      "chars": 38,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-095.txt",
      "chars": 140,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-096.txt",
      "chars": 16,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-097.txt",
      "chars": 86,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-098.txt",
      "chars": 106,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-099.txt",
      "chars": 71,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-100.txt",
      "chars": 165,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-101.txt",
      "chars": 708,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-102.txt",
      "chars": 28,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-103.txt",
      "chars": 48,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-104.txt",
      "chars": 72,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-105.txt",
      "chars": 86,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-106.txt",
      "chars": 121,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-107.txt",
      "chars": 290,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-108.txt",
      "chars": 108,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-109.txt",
      "chars": 160,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-110.txt",
      "chars": 1726,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-111.txt",
      "chars": 334,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-112.txt",
      "chars": 15,
      "language": "text"
    },
    {
      "file": "attachments/6cb2f363fd73/code/body-113.txt",
      "chars": 317,
      "language": "text"
    }
  ],
  "images": [],
  "audio": [],
  "videos": [],
  "links": [],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:49:50Z",
  "source_url": "https://dev.to/nishikantaray/ai-skills-are-not-just-prompts-a-practical-architecture-for-building-evaluating-shipping-and-540h",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 33218,
  "expected_body_images": 0,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/6cb2f363fd73/pages/source.html",
  "local_html": "attachments/6cb2f363fd73/pages/article.html",
  "body_base_path": "attachments/6cb2f363fd73/pages/",
  "body_markdown_path": "attachments/6cb2f363fd73/pages/article.md"
}