<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Artsiom Rudzenka</title>
    <description>The latest articles on DEV Community by Artsiom Rudzenka (@artemr_rudenko_0bf2c2c505).</description>
    <link>https://dev.to/artemr_rudenko_0bf2c2c505</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1730126%2Fcc09aa7f-ea7e-4f38-bbcc-532d9449fd9e.jpg</url>
      <title>DEV Community: Artsiom Rudzenka</title>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/artemr_rudenko_0bf2c2c505"/>
    <language>en</language>
    <item>
      <title>What should a sales knowledge base help someone decide? — SalesWiki, Part 3 of 5</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Tue, 29 Sep 2026 20:23:36 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0</guid>
      <description>&lt;p&gt;An assistant can summarize every account in a pipeline and still leave a salesperson with the same question: which account needs my attention today?&lt;/p&gt;

&lt;p&gt;Earlier in this series, I wrote about why sales and marketing need shared knowledge and why different people should see different parts of it.&lt;/p&gt;

&lt;p&gt;Now I want to learn whether that knowledge helps someone make one recurring decision with less searching and a clear view of the evidence. A larger wiki or a longer summary is not useful by itself.&lt;/p&gt;

&lt;p&gt;For sales, the question might be which account to follow up with next. For marketing, it might be which customer signal should change a campaign plan. Each needs a different answer from the same shared account context. In this part, I use the sales question to design a small test before connecting more tools or moving real customer data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a decision card
&lt;/h2&gt;

&lt;p&gt;The test should fit on one page before anyone connects a customer system or uploads a call transcript.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Example: account follow-up priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Person making the decision&lt;/td&gt;
&lt;td&gt;Account executive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeated moment&lt;/td&gt;
&lt;td&gt;Morning pipeline review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision&lt;/td&gt;
&lt;td&gt;Which account should I follow up with next?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facts the person may see&lt;/td&gt;
&lt;td&gt;An account they own, dated call notes, confirmed next step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Useful output&lt;/td&gt;
&lt;td&gt;A suggested next step with sources and any gaps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human remains responsible for&lt;/td&gt;
&lt;td&gt;Choosing what to do and contacting the customer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is narrower than asking an assistant to "improve sales." A specific decision tells us what information matters, who may see it, and how to tell whether the answer helped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Information has to earn a place in the answer
&lt;/h2&gt;

&lt;p&gt;The test should not reward a longer account summary. I would use a simple rule instead:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence state&lt;/th&gt;
&lt;th&gt;What the short answer should do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The person is not allowed to see it&lt;/td&gt;
&lt;td&gt;Leave it out entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It is allowed but would not change this decision&lt;/td&gt;
&lt;td&gt;Keep it in the linked account context, not in the short answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It could matter but is old, incomplete, or contradictory&lt;/td&gt;
&lt;td&gt;Say what needs checking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It is allowed, dated, and could change the decision&lt;/td&gt;
&lt;td&gt;Include it with its source&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The short answer needs the last two rows: useful facts with sources, and gaps that could change the choice. This is a working rule for the test, not a relevance score that SalesWiki claims to calculate today. The question is whether a smaller set of checkable facts helps more than a complete-looking summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful answer makes uncertainty visible
&lt;/h2&gt;

&lt;p&gt;Imagine a made-up morning review of two accounts. BluePeak has a call note from yesterday and a confirmed next step due today. Cedar has a high score, but its last call note is old and nobody is named as the owner of the next step. Which account would you follow up with first?&lt;/p&gt;

&lt;p&gt;I would not want an answer that puts Cedar first because of its score alone. A useful answer might point to BluePeak's dated next step and say that Cedar needs a quick check before its priority can be trusted. A person can then choose the action; the answer should make the reason easy to inspect.&lt;/p&gt;

&lt;p&gt;SalesWiki's answer format keeps sources, dates, and missing facts beside the conclusion. It can narrow the search and suggest a direction. It should not hide the person's choice inside confident prose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0qmov1cyo13w75eitah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0qmov1cyo13w75eitah.png" alt="A decision loop: choose one follow-up question, check permitted and dated facts, then either give a sourced direction or say what needs checking; a person makes the next move and sends corrections for review" width="720" height="1120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the current workflow against the proposed one
&lt;/h2&gt;

&lt;p&gt;I would compare the team's usual account records and notes with a short, sourced answer for the same decision. The team would keep its normal tools. There is no need to move everything into SalesWiki first.&lt;/p&gt;

&lt;p&gt;Before trying it with real work, I would agree on the question, allowed sources, and what counts as a failed answer. An unsupported claim, someone seeing a restricted record, or a person unable to explain the suggested step would be a failure. A smoother prompt would not fix it.&lt;/p&gt;

&lt;p&gt;Then record four observations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How long it takes to prepare the decision.&lt;/li&gt;
&lt;li&gt;Whether the person can point to a dated source for the action.&lt;/li&gt;
&lt;li&gt;Whether an old or missing fact changes the choice.&lt;/li&gt;
&lt;li&gt;Whether a correction to shared knowledge is needed, and how much review work it adds.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I would also ask what the person would have done without the answer. Faster preparation means little if it leads to a worse decision. If people only need faster document search, an existing search tool may be enough. If maintaining the shared facts takes more work than the decision is worth, that matters too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the public demo can and cannot show
&lt;/h2&gt;

&lt;p&gt;The public &lt;a href="https://knowledge-workbench-seven.vercel.app/" rel="noopener noreferrer"&gt;Knowledge Workbench&lt;/a&gt; uses synthetic accounts. Its guided tour goes from a suggested priority to account context, linked evidence, an answer with sources, and a review path for corrections. It lets people inspect the interaction without customer data.&lt;/p&gt;

&lt;p&gt;The demo cannot show whether a real team would use this every day. It has no real user sign-in, live customer records, or hosted setup for a team. That is the job of a later private pilot, with a separate place for customer data. When facts are old or missing, saying what to check can be more useful than recommending an action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continue only when the workflow earns it
&lt;/h2&gt;

&lt;p&gt;I would consider a private pilot only if the small test supports these points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The answer helps people make the chosen decision with less searching, without hiding a fact that could change it.&lt;/li&gt;
&lt;li&gt;People can point to the sources, explain their choice, and say what would change their minds.&lt;/li&gt;
&lt;li&gt;Corrections to shared knowledge are worth the review effort.&lt;/li&gt;
&lt;li&gt;The time spent keeping the answer current is reasonable for the value of the decision.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The next part looks at how to run that private test without confusing synthetic demo data with customer data. It covers the public repository, local demo, private vault, and the safeguards still needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continue the series
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/how-i-keep-shared-sales-knowledge-safe-for-different-roles-saleswiki-part-2-of-5-1ngl"&gt;How I keep shared sales knowledge safe for different roles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;em&gt;From synthetic demo to a safe private pilot.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>marketing</category>
      <category>sales</category>
    </item>
    <item>
      <title>How I keep shared sales knowledge safe for different roles — SalesWiki, Part 2 of 5</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Wed, 23 Sep 2026 05:20:38 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/how-i-keep-shared-sales-knowledge-safe-for-different-roles-saleswiki-part-2-of-5-1ngl</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/how-i-keep-shared-sales-knowledge-safe-for-different-roles-saleswiki-part-2-of-5-1ngl</guid>
      <description>&lt;p&gt;A salesperson and a marketer can open the same customer account and need different facts.&lt;/p&gt;

&lt;p&gt;Before a customer call, the salesperson needs what was agreed and the next step. Marketing needs an approved customer signal it can use in a campaign. Both need the same account map. Neither needs every private note.&lt;/p&gt;

&lt;p&gt;That is the tension I wanted to test in SalesWiki. A shared knowledge base should stop people rebuilding context in separate tools. It should not turn every record into one unrestricted summary.&lt;/p&gt;

&lt;p&gt;The question is not only what a person may see. It is what they are trying to decide. One person may be preparing the next conversation; another may be deciding whether a customer signal can support a message. The useful answer is different, but both answers should lead back to dated evidence, show what is missing, and leave the decision with the person responsible.&lt;/p&gt;

&lt;p&gt;I treated a request for information and a request to change information as different paths. An answer uses only permitted facts. A correction waits for review before anything changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6d5iakpha1bh38psl0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6d5iakpha1bh38psl0s.png" alt="A request passes through server-side identity and policy before producing a cited answer or an approved, auditable change" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One question, two valid answers
&lt;/h2&gt;

&lt;p&gt;Consider the shared account BluePeak Energy. The account executive asks, "What was agreed, and what could block the next step?" Marketing asks, "Which approved signal can support a useful message?"&lt;/p&gt;

&lt;p&gt;The account is the same. The decision is not. A sales answer might say, “The next step was a technical review on Tuesday; the security questionnaire is still missing.” A marketing answer might say, “The customer agreed to a public webinar, but product claims still need approval.”&lt;/p&gt;

&lt;p&gt;Each answer should show its sources, how current they are and what it cannot tell the reader. One answer helps move a commercial conversation forward. The other helps decide what can be said publicly. A shared knowledge base earns its place when it preserves that difference before an answer is assembled.&lt;/p&gt;

&lt;p&gt;This is one logical knowledge model, not one unrestricted storage location. Stable links connect the broad and protected cards, while physical boundaries keep sensitive material out of a role's retrieval path. The user experiences a shared account map; the server decides which part of that map can be assembled.&lt;/p&gt;

&lt;p&gt;The service processes the request in this order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request
  -&amp;gt; server-side identity
  -&amp;gt; role and account policy
  -&amp;gt; allowed storage areas
  -&amp;gt; filtered retrieval
  -&amp;gt; field extraction
  -&amp;gt; cited answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser does not decide a person's role. The server does. In the demo, a server setting selects a test person. A production deployment still needs a real identity provider on every request; that is one of the documented gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  A label in a card is not access control
&lt;/h2&gt;

&lt;p&gt;This card property is useful metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sales-confidential&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does not stop a person or process from opening the file. SalesWiki keeps broad knowledge, sensitive sales notes, contact references and legal material in separate storage areas. The directory that holds a card determines its class. A card outside a known area is denied by default.&lt;/p&gt;

&lt;p&gt;Roles set the broad boundary: which storage areas may this person read? Ownership and other account attributes narrow the result. An account executive may see sensitive cards for accounts they own, while a head of sales sees the wider team view.&lt;/p&gt;

&lt;p&gt;Contact details do not belong in the shared vault. The broad knowledge layer keeps only an opaque reference such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;restricted://personal-data/demo-bluepeak-energy-lead-contact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An approved external store can resolve that reference later. This keeps access and deletion concerns out of the shared knowledge layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fixed answer format keeps the limits visible
&lt;/h2&gt;

&lt;p&gt;After filtering, the service extracts named values from permitted card sections. A configuration file connects the shape of a card to the shape of an answer, rather than leaving that decision to a prompt.&lt;/p&gt;

&lt;p&gt;Every answer has the same fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conclusion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The direct result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extracted facts or record tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;citations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Source and location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;confidence&lt;/code&gt; and &lt;code&gt;freshness&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;How certain and current the source data is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;next_action&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The recommended operational step already stored in the card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;missing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What the vault cannot answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;access&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Allowed, sanitized, blocked, ambiguous or not found&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An optional language model can later turn the result into prose in a client. It may not introduce new facts. The service itself does not need a language model to produce the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A change is a transaction, not an edit
&lt;/h2&gt;

&lt;p&gt;Suppose a user spots an outdated deal risk. The visible workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flag stale or wrong
  -&amp;gt; draft proposal
  -&amp;gt; review queue
  -&amp;gt; approve or reject
  -&amp;gt; worker apply
  -&amp;gt; validation and audit
  -&amp;gt; rollback if needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The proposal includes the target entity, requested change, source evidence, risk and base version. Approval and apply are separate steps.&lt;/p&gt;

&lt;p&gt;The worker changes the compiled card, not the original source. Raw evidence stays as captured; a correction creates a new, reviewed conclusion with a clear reason and audit record.&lt;/p&gt;

&lt;p&gt;The worker then checks the approved change and the current card version. It holds a file lock so only one writer runs at a time. The card is written safely through a temporary file and replacement. Failed work is set aside for review. Rollback is an explicit worker action.&lt;/p&gt;

&lt;p&gt;Approved changes land in the card's &lt;code&gt;Review Needed&lt;/code&gt; section. They do not silently overwrite protected profile fields.&lt;/p&gt;

&lt;p&gt;This is slower than direct page editing. That delay is useful when the knowledge affects deal economics, identity fields, updates to customer records or access decisions. It would be unnecessary overhead for an ordinary team notebook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a single writer is enough
&lt;/h2&gt;

&lt;p&gt;SalesWiki targets a small sales and marketing operating group, not millions of writes per second. At that scale, one writer gives a clear invariant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every applied change passed through one ordered, reviewable path.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The design avoids distributed locking and merge machinery before the pilot proves that they are needed. The reading service can have read-only access to the vault, while the writing worker has controlled write access.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audit chain makes rewriting visible
&lt;/h2&gt;

&lt;p&gt;Audit events are append-only and linked with cryptographic hashes. Each record carries the previous hash and its own hash. Rewriting or removing an earlier record breaks verification of the later chain.&lt;/p&gt;

&lt;p&gt;This makes tampering visible; it does not make the system magical. Storage permissions, backups and external monitoring still matter. For a private pilot, SalesWiki can sign a checkpoint containing the verified record count and latest hash, then store that checkpoint and its key separately. That can reveal a clean deletion at the end of the chain. Version history is useful for card changes, but it does not show who read sensitive data. Reading needs its own audit in the service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules should be visible, not hidden in code
&lt;/h2&gt;

&lt;p&gt;The project keeps rules for access, storage boundaries, identity, answer fields and external connections in configuration files. The intent is simple: changing a role map, a storage boundary or an answer field should not require rewriting the service. The health check validates that these rules still agree with the cards and dashboards.&lt;/p&gt;

&lt;p&gt;The code follows the same boundary. A server interface carries requests into the service, while identity, policy, retrieval, answers, proposals, audit and the worker live in separate modules. Optional chat integrations depend on that core; the core never depends on them. This makes it possible to replace a chat client without moving the rules that protect access and changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the demo has tested
&lt;/h2&gt;

&lt;p&gt;The end-to-end dry run uses a throwaway vault and checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one role cannot see data reserved for another;&lt;/li&gt;
&lt;li&gt;sourced answers and an honest “not found” result;&lt;/li&gt;
&lt;li&gt;proposal, approval and worker apply;&lt;/li&gt;
&lt;li&gt;rejection, audit verification and rollback paths;&lt;/li&gt;
&lt;li&gt;the same answer format across read tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture still has open production work. Test identity must be replaced by a real identity provider on every request. Approval records need production-grade identity and secret handling. Connector credentials, backups, rate limits and incident response need an operating environment outside the public repository.&lt;/p&gt;

&lt;p&gt;This part answers one question: the same shared knowledge can support different decisions only when identity and policy filter retrieval before an answer is assembled, and when changes follow a separate governed path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continue the series
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/why-i-built-a-sales-and-marketing-knowledge-base-that-refuses-to-guess-5fhm"&gt;Why I built a sales and marketing knowledge base that refuses to guess&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-4f0k-temp-slug-3957887"&gt;What should a sales knowledge base help someone decide?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code and architecture decisions are available in the &lt;a href="https://github.com/artemrudenko/SalesWiki-public" rel="noopener noreferrer"&gt;SalesWiki repository&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>mcp</category>
      <category>privacy</category>
      <category>security</category>
    </item>
    <item>
      <title>I wanted my coding agent to remember the codebase</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:58:37 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/i-wanted-my-coding-agent-to-remember-the-codebase-20if</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/i-wanted-my-coding-agent-to-remember-the-codebase-20if</guid>
      <description>&lt;p&gt;An AI coding agent can look fast on its first task. The expensive part often appears on the fifth.&lt;/p&gt;

&lt;p&gt;It opens the same files again. It traces the same call chain. It rediscovers where a value is assembled, and it can still miss one screen or one boundary that needs to change. The cost is not only tokens. A change takes longer, and the reviewer has more places where an incomplete patch can hide.&lt;/p&gt;

&lt;p&gt;I wanted to give the agent a useful kind of working memory: a reusable map of the codebase that makes repeated investigation cheaper &lt;strong&gt;without making the next product change less safe&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That last condition changed the whole experiment. A short answer is a saving only when the resulting patch is correct. If an index helps the agent find four files quickly but it misses the fifth file that carries the contract, the saved tokens simply become rework.&lt;/p&gt;

&lt;p&gt;This article is about how I tested that idea. It is not a leaderboard for code graph tools. My aim was more practical: learn when a saved code map earns a place in day-to-day product work, and when current source and tests must take over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I was actually trying to solve
&lt;/h2&gt;

&lt;p&gt;An agent repeatedly needs answers to a small set of questions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question before a change&lt;/th&gt;
&lt;th&gt;Why the answer matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What is the exact function, class, or endpoint?&lt;/td&gt;
&lt;td&gt;A familiar name can point to the wrong implementation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where else does this value or decision travel?&lt;/td&gt;
&lt;td&gt;The visible UI is often only the last step of a longer path.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What could break if I change it?&lt;/td&gt;
&lt;td&gt;This defines the change radius and review plan.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which tests protect the behaviour?&lt;/td&gt;
&lt;td&gt;A passing local check does not prove the intended behaviour.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the saved map still current?&lt;/td&gt;
&lt;td&gt;A correct index from yesterday can be incomplete today.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tools answer these questions in different ways. Some ask the same language services used by an IDE. Others keep a parsed map of symbols, imports, calls, and tests. I call that map an &lt;em&gt;index&lt;/em&gt; in this article. It is saved navigation, not a replacement for the source of truth.&lt;/p&gt;

&lt;p&gt;The promise is attractive. The agent should spend less time reopening code and more time making a useful change. But the promise only matters if quality stays level or improves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule I refused to break
&lt;/h2&gt;

&lt;p&gt;I did not count a small response, a convincing explanation, or a passing frontend check as success. A patch had to satisfy a source-derived behaviour contract. Its focused test had to pass. Then the same test had to fail again after I deliberately reintroduced a relevant defect.&lt;/p&gt;

&lt;p&gt;That last step matters. It checks that the test is able to catch the mistake we care about, such as a wrong calculation or an update missing from the mobile layout. A green test that does not fail when the defect returns gives false confidence.&lt;/p&gt;

&lt;p&gt;I used an LLM as a judge in an earlier exploration to help decide which questions were worth investigating. I do not use an LLM score to decide whether a patch is correct. A model can prefer a short, plausible answer that names the wrong function. For the change tasks below, source checks and deliberate mutations are the final gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I made the question testable
&lt;/h2&gt;

&lt;p&gt;I did not start by ranking tools. I first looked at different ways an agent might keep code context between questions: ordinary source search, context packers, language-service bridges, graph indexes, and semantic search. They do different jobs, so one headline score would hide more than it explains.&lt;/p&gt;

&lt;p&gt;The work then narrowed in three stages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Question it could answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Find candidates and failure modes&lt;/td&gt;
&lt;td&gt;12 public repositories, 8 languages, and 4 candidates with source-checkable records&lt;/td&gt;
&lt;td&gt;Can a compact answer safely help an agent navigate a particular codebase?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make navigation answers trustworthy&lt;/td&gt;
&lt;td&gt;Exact identity, test boundaries, absence, scope, and freshness checks&lt;/td&gt;
&lt;td&gt;When should an answer be treated as a lead, rather than as evidence for a patch?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test the delivered change&lt;/td&gt;
&lt;td&gt;3 fixed product tasks × 3 conditions × 5 fresh agent sessions&lt;/td&gt;
&lt;td&gt;Does adding persistent context preserve the quality of a completed change?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The broad first stage gives examples of failure modes. The narrow third stage checks a real outcome. Neither is a universal ranking or a token-saving claim. Together they answer a practical question: which recurring question can a tool help with in &lt;em&gt;this&lt;/em&gt; repository? What must I still verify? Does it lower total work without lowering patch quality?&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/selection-and-evaluation-framework.md" rel="noopener noreferrer"&gt;selection framework&lt;/a&gt; keeps the candidate history. The &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/reproducibility-manifest.md" rel="noopener noreferrer"&gt;reproducibility manifest&lt;/a&gt; has pinned revisions and raw records. I keep that detail in the archive so the article can explain the decision without asking every reader to audit a tool catalogue first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwnr4md22d0deai2b0tez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwnr4md22d0deai2b0tez.png" alt="A code-context lifecycle: configure scope and build a reusable index; ask recurring questions about symbols, callers, paths, and tests; check the source before acting; refresh the index after code changes." width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The result that changed my mind
&lt;/h2&gt;

&lt;p&gt;I ran three fixed change tasks in one private Python and TypeScript product. Each condition used five fresh agent sessions. I compared ordinary source navigation with Code Review Graph and Serena, two tools that give an agent structured help finding code relationships.&lt;/p&gt;

&lt;p&gt;Before each batch, I froze the task and an independent evaluator. A known-good patch had to pass. An untouched fixture and an incomplete patch had to fail. Only then did I count fresh agent runs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product change&lt;/th&gt;
&lt;th&gt;Ordinary source navigation&lt;/th&gt;
&lt;th&gt;Code Review Graph&lt;/th&gt;
&lt;th&gt;Serena&lt;/th&gt;
&lt;th&gt;What it tells me&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stop an inactive signed-in user from resolving a department through a shared SQL helper&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;Direct source navigation was enough. The indexes preserved quality, but showed no correctness advantage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Show an honest delivery count in the existing desktop row and mobile card&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;A small change across two layouts was also reliable without an index.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carry a machine category through SQL, pagination, TypeScript contracts, and two reader surfaces&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;A navigation index did not make a difficult cross-layer contract reliable.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zbtw4hzggu67nu1nfw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zbtw4hzggu67nu1nfw4.png" alt="Three fixed product tasks, with five fresh sessions per condition. Ordinary source navigation, Code Review Graph, and Serena all achieved 5 of 5 on two contained tasks. On the hard cross-layer task, they achieved 1 of 5, 1 of 5, and 0 of 5. This is task-specific evidence, not a tool ranking." width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last row was the useful surprise. I expected a structured map to help most on the hard task. Instead, many patches looked plausible but were incomplete: a paginated field was absent, a closed vocabulary was changed incorrectly, or an uncertain state was left unprotected.&lt;/p&gt;

&lt;p&gt;This does not mean that one condition is better than another. Five out of five still has a wide exact 95% interval, from 47.8% to 100%. These are small, task-specific observations. They do show something important for tool choice: an index can give an agent a faster starting point, but it does not supply a missing product contract or prove that every layer was changed.&lt;/p&gt;

&lt;p&gt;I discarded an early UI batch. An old inverse patch was still visible in Git, so it could have given an agent the solution without requiring it to understand the current code. I rebuilt a clean one-commit fixture, reran the controls, and counted only the 15 fresh runs. The lesson is simple: a benchmark must not quietly provide its own answer.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/info-radar-quality-gate-summary.md" rel="noopener noreferrer"&gt;quality-gate summary&lt;/a&gt; and &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/info-radar-source-delivery-summary.md" rel="noopener noreferrer"&gt;redacted UI task record&lt;/a&gt; explain the method and its limits. They do not measure token saving, elapsed time, index build cost, refresh cost, full browser behaviour, or general agent quality.&lt;/p&gt;

&lt;p&gt;The product source is private, so these task records are deliberately redacted. They let a reader inspect the behaviour contract, controls, and evaluator boundary, but they are not a package that an outside reader can rerun exactly. That limits their weight, and is one reason I do not use them to claim a winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  A map must also be trustworthy
&lt;/h2&gt;

&lt;p&gt;The change tasks tell me whether the final patch survives a quality gate. I also checked four smaller retrieval questions against fixed source versions. This matters because an agent can act on a compact answer long before a test has a chance to correct it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Tool response&lt;/th&gt;
&lt;th&gt;Source-checked result&lt;/th&gt;
&lt;th&gt;Practical lesson&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ktor function name collision&lt;/td&gt;
&lt;td&gt;Code Review Graph returned 17 callers&lt;/td&gt;
&lt;td&gt;1 caller belonged to the requested low-level parser; 16 belonged to another public overload with the same name&lt;/td&gt;
&lt;td&gt;A name is not an identity. Check the exact definition before estimating refactor impact.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ripgrep test boundary&lt;/td&gt;
&lt;td&gt;Code Review Graph returned 28 callers&lt;/td&gt;
&lt;td&gt;24 were tests; 4 were production functions&lt;/td&gt;
&lt;td&gt;“All callers” needs a visible test and production boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deliberately absent symbols&lt;/td&gt;
&lt;td&gt;graphify returned related code in 3 of 12 fixed queries&lt;/td&gt;
&lt;td&gt;9 returned a clear no-match response&lt;/td&gt;
&lt;td&gt;A related suggestion must not look like an exact match.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI indexing scope&lt;/td&gt;
&lt;td&gt;Serena found 1 of 4 known references from a nested package root&lt;/td&gt;
&lt;td&gt;The same version returned 4 of 4 when indexed from repository root&lt;/td&gt;
&lt;td&gt;Scope is part of the answer, not a detail to hide in setup.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://ktor.io/docs/server-create-a-new-project.html" rel="noopener noreferrer"&gt;Ktor&lt;/a&gt; is an open-source Kotlin framework for building server applications. This case shows why a small answer can be dangerous. The low-level &lt;code&gt;parseHeaderValue&lt;/code&gt; function has one direct caller, &lt;code&gt;parseHeaders&lt;/code&gt;. The tool also returned 16 callers of a different public function with the same name. The response was compact, but almost all of it was wrong for the target I asked about.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw46woe5yhadyoq23a3cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw46woe5yhadyoq23a3cl.png" alt="Ktor's low-level CIO parseHeaderValue has one direct caller, parseHeaders. Code Review Graph returned 17 results labelled as the CIO target: one correct caller and 16 callers of a public overload or its tests." width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not an argument against a graph or language tool. It is a reason to give the answer a trust contract: the exact target, the indexed scope, a clear test boundary, and a label for exact match, possible match, or no match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory that does not refresh is old memory
&lt;/h2&gt;

&lt;p&gt;I then checked what happened after source changed. In a controlled FastAPI case, an index was built when the helper &lt;code&gt;solve_dependencies&lt;/code&gt; had four direct callers. I added a fifth caller in a local source revision. The existing indexes still reported yesterday’s relationships until their refresh path ran.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Behaviour on changed source&lt;/th&gt;
&lt;th&gt;Safe response from an agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code Review Graph still returned four edges and gave no automatic warning&lt;/td&gt;
&lt;td&gt;Compare the saved revision with the repository; refresh or check source.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;codebase-memory-mcp reported &lt;code&gt;metadata_changed&lt;/code&gt; through its coverage check&lt;/td&gt;
&lt;td&gt;Treat this as a rebuild request, even if general status says ready.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;graphify retained its old incoming-edge view without a code-revision signal&lt;/td&gt;
&lt;td&gt;Rebuild or use source search before treating the caller set as complete.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcg05n4d6urpbn8mwswgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcg05n4d6urpbn8mwswgn.png" alt="A stale-index control: build an index when source has four callers; source changes to five callers; the old graph misses the new relationship; compare freshness, check current source, then refresh before relying on it again." width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran one small rename task with ordinary source navigation, Graphify with the old graph, and Graphify rebuilt after the change. Each condition passed the same deterministic evaluator once. The stale-graph run still succeeded because the agent searched current source before editing all five callers.&lt;/p&gt;

&lt;p&gt;That is a workflow observation, not a performance result. The control was small, each condition ran once, and the baseline passed too. It supports one rule only: use a saved map to start the search, then verify a relationship-sensitive change against current source. The &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/stale-index-control.md" rel="noopener noreferrer"&gt;normalized control record&lt;/a&gt; has the precise boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would test a tool in my own repository
&lt;/h2&gt;

&lt;p&gt;Vendor demonstrations are useful for discovering possibilities. They cannot tell us whether a tool fits a particular architecture, build, codebase age, or team workflow. The test can be small and still be much more useful than a generic ranking.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick two or three questions that genuinely repeat in current work. Include one ordinary lookup and one hard case: an overload, generated code, a build-specific implementation, or a test-heavy API.&lt;/li&gt;
&lt;li&gt;Write the expected answer from source before running the tool. Decide whether tests count and what “caller” means in this case.&lt;/li&gt;
&lt;li&gt;Record the project root, exclusions, dependencies, build flags, index time, and any errors. A wrong root can make a correct tool appear broken.&lt;/li&gt;
&lt;li&gt;Save every raw answer. Check it against source before using it to plan a change. State whether the answer is exact, a candidate, or no match.&lt;/li&gt;
&lt;li&gt;Make a small source change, refresh the index, and repeat one affected relationship question.&lt;/li&gt;
&lt;li&gt;Give the agent one fixed change task. Require the patch, a focused test, and a failed mutation before measuring time, tool calls, context, or tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I turned the method into three small, tool-neutral companion skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/tree/main/skills/verify-code-context" rel="noopener noreferrer"&gt;verify-code-context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/tree/main/skills/maintain-code-context-index" rel="noopener noreferrer"&gt;maintain-code-context-index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/tree/main/skills/run-code-context-change-task" rel="noopener noreferrer"&gt;run-code-context-change-task&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They do not make an index correct. They make its scope, freshness, and uncertainty visible before the agent acts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2hrs38yfwgclx22uuvrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2hrs38yfwgclx22uuvrd.png" alt="Five checks before a compact answer guides a code change: exact target, scope and build, test boundary, match type, and freshness. If any answer is unclear, verify current source before acting." width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would measure next
&lt;/h2&gt;

&lt;p&gt;The real value of persistent context will not appear in a single answer. It will appear, if it appears at all, across a sequence of independent tickets: the agent asks fewer repeated questions, reuses safe navigation, and still delivers patches that meet the same quality gate.&lt;/p&gt;

&lt;p&gt;That next experiment needs a baseline and an indexed condition on comparable tickets. It should measure the whole lifecycle: setup, index build, refresh, tool calls, retries, context, elapsed time, and patch quality. Quality comes first. Only after it stays level can lower overhead become a useful result.&lt;/p&gt;

&lt;p&gt;My conclusion is deliberately modest. Persistent code context is worth trying as working memory for an agent. It can make repeated navigation easier. It does not make the agent understand a product automatically, and it cannot replace a clear behaviour contract, current source, or tests that can expose a regression.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2" rel="noopener noreferrer"&gt;public evidence archive&lt;/a&gt; includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/evidence-index.md" rel="noopener noreferrer"&gt;source-checked cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/reproducibility-manifest.md" rel="noopener noreferrer"&gt;reproduction details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/tree/main/skills" rel="noopener noreferrer"&gt;three companion skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;a &lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/reader-run-testbench.md" rel="noopener noreferrer"&gt;reader-run testbench&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artemrudenko/code-graph-benchmark-v2/blob/main/docs/info-radar-quality-gate-summary.md" rel="noopener noreferrer"&gt;redacted quality-gate summaries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What does your coding agent keep re-investigating in the same repository?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>developertools</category>
      <category>agents</category>
    </item>
    <item>
      <title>Why I built a sales and marketing knowledge base that refuses to guess — SalesWiki, Part 1 of 5</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:28:36 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/why-i-built-a-sales-and-marketing-knowledge-base-that-refuses-to-guess-5fhm</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/why-i-built-a-sales-and-marketing-knowledge-base-that-refuses-to-guess-5fhm</guid>
      <description>&lt;p&gt;Sales and marketing context rarely disappears in one big failure. It leaks away in small pieces.&lt;/p&gt;

&lt;p&gt;A useful detail stays in a call transcript. A pricing objection lives in a CRM note. Market research sits in one document that nobody opens before the next meeting. Then someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should we do next — and why?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built &lt;a href="https://github.com/artemrudenko/SalesWiki-public" rel="noopener noreferrer"&gt;SalesWiki&lt;/a&gt; to test a simple idea: a shared knowledge base should help a person find the relevant evidence and narrow the options without inventing what it does not know.&lt;/p&gt;

&lt;p&gt;The durable source of truth is a folder of Markdown files that opens directly in Obsidian. Raw evidence stays separate from compiled knowledge. Answers copy facts from named fields and sections, attach citations, and say &lt;code&gt;not-found&lt;/code&gt; when the vault has no evidence.&lt;/p&gt;

&lt;p&gt;SalesWiki is not a CRM and it is not a hosted SaaS. It is an open starter kit for a governed sales and marketing knowledge base.&lt;/p&gt;

&lt;h2&gt;
  
  
  This started as a research question
&lt;/h2&gt;

&lt;p&gt;I did not begin with "let's build another knowledge product." I wanted to learn whether a plain wiki could help sales and marketing teams make decisions without becoming an unstructured folder. I also wanted to know whether agents could maintain it without changing protected facts behind the scenes.&lt;/p&gt;

&lt;p&gt;Sales and marketing are a useful stress test. Evidence arrives in many forms, ages quickly and has mixed sensitivity. The result has to support a decision, not simply retrieve a paragraph. A good answer should say what matters, where a fact came from, how fresh it is and what the user can do next.&lt;/p&gt;

&lt;p&gt;That led to four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can typed Markdown be a small but dependable knowledge data plane?&lt;/li&gt;
&lt;li&gt;Will people trust a shorter cited answer more than a fluent generated one?&lt;/li&gt;
&lt;li&gt;Can I make agent changes reviewable and reversible?&lt;/li&gt;
&lt;li&gt;When does owning this machinery beat buying search over existing documents?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The synthetic demo answers only the engineering part. A real pilot still has to prove that people prefer the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  One knowledge model, different views for each role
&lt;/h2&gt;

&lt;p&gt;"Central" does not mean copying every CRM field, transcript and document into one unrestricted folder. Those systems can remain the source of their original records, and sensitive material can stay in a separate protected store.&lt;/p&gt;

&lt;p&gt;SalesWiki centralizes the team's compiled understanding. A company, person, deal, call, campaign, source or reusable case becomes a typed card with stable links to related cards. Sales and marketing use the same account map, while policy determines which cards and fields each role can read.&lt;/p&gt;

&lt;p&gt;The layers have different jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw evidence is preserved instead of silently rewritten;&lt;/li&gt;
&lt;li&gt;linked cards hold the current shared conclusion;&lt;/li&gt;
&lt;li&gt;proposals, review records and Git history show how that conclusion changed;&lt;/li&gt;
&lt;li&gt;indexes and dashboards are generated views that can be rebuilt from the cards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Raw evidence stays as captured. The shared conclusion can change, but only through a proposal, review and controlled apply step that leaves the earlier evidence and the reason for the change visible.&lt;/p&gt;

&lt;p&gt;This is why I chose a wiki model. The goal is not a larger folder. It is a durable map that people and tools can navigate, question and correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small synthetic example
&lt;/h2&gt;

&lt;p&gt;The public demo contains a synthetic deal for Atlas Robotics. Its problem is simple: the next step has no confirmed owner. The deal card points to the demo call and lead cards, labels the confidence as medium, and suggests a follow-up to confirm the success criteria.&lt;/p&gt;

&lt;p&gt;The useful part is not that the system chose for the account executive. It made the reason for a proposed action inspectable. A person can follow the links, challenge the evidence or decide that another option is better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The folder is simple on purpose
&lt;/h2&gt;

&lt;p&gt;The core flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F150vu92fb9hr8ss3eciq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F150vu92fb9hr8ss3eciq.png" alt="Calls, CRM notes and research become immutable evidence, typed Markdown cards, generated indexes, dashboards and cited MCP answers" width="800" height="1139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository separates five areas of work:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Folder&lt;/th&gt;
&lt;th&gt;What belongs there&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raw/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Original calls, exports, notes and research evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wiki/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Typed cards for companies, people, leads, deals, calls and reusable knowledge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;indexes/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rebuildable search, freshness, temporal and graph projections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;state/&lt;/code&gt; and &lt;code&gt;tracking/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Intake, review queues, processed sources and audit traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;demo/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Synthetic data that is safe to inspect and regenerate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This choice has an obvious trade-off. A Markdown vault cannot hide behind a database schema. The structure must be explicit and checked.&lt;/p&gt;

&lt;p&gt;SalesWiki treats every card type as a small contract. A deal card has known YAML properties and required sections. A health check fails when templates, properties, dashboards or links drift out of shape.&lt;/p&gt;

&lt;p&gt;Here is a shortened synthetic deal card from the demo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deal&lt;/span&gt;
&lt;span class="na"&gt;entity_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-deal-atlas-robotics-pilot&lt;/span&gt;
&lt;span class="na"&gt;dataset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
&lt;span class="na"&gt;synthetic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sales-confidential&lt;/span&gt;
&lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Proposal&lt;/span&gt;
&lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;25000&lt;/span&gt;
&lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;89&lt;/span&gt;
&lt;span class="na"&gt;score_band&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hot&lt;/span&gt;
&lt;span class="na"&gt;freshness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;needs-action&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Deal: Atlas Robotics Pilot&lt;/span&gt;

&lt;span class="gu"&gt;## Deal Readout&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Main risk: next step needs owner confirmation.
&lt;span class="p"&gt;-&lt;/span&gt; Next best action: book follow-up and confirm success criteria.
&lt;span class="p"&gt;-&lt;/span&gt; Confidence: medium
&lt;span class="p"&gt;-&lt;/span&gt; Evidence: demo call and lead cards.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;People can read this file. Git can diff it. Obsidian can link it. A script can validate it. The permissioned gateway can extract its fields without asking a model to reconstruct the deal from loose prose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fccg81blh5sr579tblp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fccg81blh5sr579tblp.gif" alt="A short tour of the SalesWiki Workbench, from a role-specific priority to linked account context and evidence" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why answers are extracted instead of generated
&lt;/h2&gt;

&lt;p&gt;SalesWiki makes a deliberate trade-off in its permissioned core: an incomplete cited answer is safer than a confident invented one.&lt;/p&gt;

&lt;p&gt;Every read tool returns the same Answer Contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deal risk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allowed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"conclusion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Atlas Robotics needs action."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"citations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales-confidential"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wiki/entities/deals/Deal - Atlas Robotics - Pilot.md"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"freshness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"needs-action"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Book follow-up and confirm success criteria."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"missing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example above is shortened for readability, but the shape comes from the real &lt;code&gt;saleswiki_mcp/answer.py&lt;/code&gt; contract. Each answer includes access, conclusion, sections, citations, confidence, freshness, the next action and missing fields.&lt;br&gt;
The rendered Markdown uses the same data.&lt;/p&gt;

&lt;p&gt;If a user asks for a company that is not in the vault, the answer is direct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Conclusion: Cannot answer from the knowledge base.
Missing: No matching company card was found.
Next action: add or research the company.
Access: not-found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no fallback paragraph that guesses what the company probably does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown alone is not the product
&lt;/h2&gt;

&lt;p&gt;Using Markdown is useful, but it is not enough to justify another system. I would tell most teams to buy an existing product if all they need is AI search over documents.&lt;/p&gt;

&lt;p&gt;SalesWiki makes sense only when three requirements matter together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Answers must be extracted from cited evidence.&lt;/li&gt;
&lt;li&gt;Sensitive changes need proposal, approval, apply and rollback steps.&lt;/li&gt;
&lt;li&gt;The team wants to own the semantic model, policy and durable data files.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That third point has a cost. Owning the data plane also means owning backups, identity, connectors, retention and maintenance. The repository does not hide that work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the design helps and where it costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What I chose&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;th&gt;What you pay for it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Markdown source of truth&lt;/td&gt;
&lt;td&gt;people can read it; Git can diff it; tools can parse it&lt;/td&gt;
&lt;td&gt;queries and transactions are weaker than in a database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typed cards and validation&lt;/td&gt;
&lt;td&gt;extraction stays predictable and drift becomes visible&lt;/td&gt;
&lt;td&gt;templates and schema changes need discipline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extract-only answers&lt;/td&gt;
&lt;td&gt;missing data stays missing and every claim can be traced&lt;/td&gt;
&lt;td&gt;answers are less flexible than free-form generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access checks before retrieval&lt;/td&gt;
&lt;td&gt;closed content never reaches answer assembly&lt;/td&gt;
&lt;td&gt;identity and boundary rules need careful design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proposal, approval and one writer&lt;/td&gt;
&lt;td&gt;sensitive edits are reviewable and reversible&lt;/td&gt;
&lt;td&gt;a correction takes more steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owned data and policy&lt;/td&gt;
&lt;td&gt;the team controls portability and meaning&lt;/td&gt;
&lt;td&gt;the team also owns operations and maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I treat these as design constraints rather than universal best practices. If your main problem is finding a document, a mature search product is probably the better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the synthetic demo
&lt;/h2&gt;

&lt;p&gt;The fastest way to see the idea is the six-step guided tour in the&lt;br&gt;
&lt;a href="https://knowledge-workbench-seven.vercel.app/" rel="noopener noreferrer"&gt;synthetic Knowledge Workbench&lt;/a&gt;.&lt;br&gt;
It starts with a role-specific priority, opens the account context and follows the evidence to a proposed next step. The data is synthetic and the tour never changes a card.&lt;/p&gt;

&lt;p&gt;If you want to inspect the files and run the checks locally, Part 3 contains the full fresh-clone and private-pilot path. That separation is deliberate: this article explains why the model exists; the next practical article explains how to test it safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo boundary
&lt;/h2&gt;

&lt;p&gt;The public Workbench uses synthetic data. It is a preview of the workflow, not a system that makes commercial decisions. A suggested next step is a prompt for review: the responsible person must check the cited records, the current context and their own company policy before acting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to take it next
&lt;/h2&gt;

&lt;p&gt;Start narrower than the repository looks. Pick one repeated decision, such as "which lead needs action today?", and test it with a private vault.&lt;br&gt;
Keep that vault outside the public checkout.&lt;/p&gt;

&lt;p&gt;Then measure three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does the user prefer the cited answer to the current CRM-and-notes workflow?&lt;/li&gt;
&lt;li&gt;how often does someone correct the compiled knowledge?&lt;/li&gt;
&lt;li&gt;how much curator time does the system consume each week?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add SSO before shared multi-user use. Keep authorization before retrieval and keep durable writes behind the worker. Add connectors or vector search only when the validated workflow needs them. Otherwise it is easy to build impressive infrastructure around an unproven habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the public preview stops
&lt;/h2&gt;

&lt;p&gt;The repository includes a synthetic demo, a local MCP gateway, a single-writer worker, Docker checks and connector contracts. It does not yet include production multi-user SSO, live HubSpot or Google Drive sync, hosted operations, or an external erasable personal-data store.&lt;/p&gt;

&lt;p&gt;That boundary matters. Fixture identities are useful for a demo and a single-operator pilot. They are not production authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continue the series
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;em&gt;How I keep shared sales knowledge safe for different roles&lt;/em&gt; asks what must change when the same account map serves sales, marketing and curators.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/artemrudenko/SalesWiki-public" rel="noopener noreferrer"&gt;SalesWiki&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sales</category>
      <category>marketing</category>
      <category>knowledgebase</category>
      <category>ai</category>
    </item>
    <item>
      <title>AI Skills Are Executable Assets. Let's Review Them Like Code. Part 3 of 3</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Wed, 19 Aug 2026 20:44:29 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-executable-assets-lets-review-them-like-code-1cph</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-executable-assets-lets-review-them-like-code-1cph</guid>
      <description>&lt;p&gt;Markdown is not executable code.&lt;/p&gt;

&lt;p&gt;But an AI skill written in Markdown can tell an agent to run a shell command, open a credential file, install a package, call an MCP tool, modify a repository, or delegate work to another agent. The file doesn't execute itself, but it influences a system that can, and that's what makes "it's only documentation" such a dangerous security assumption.&lt;/p&gt;

&lt;p&gt;In &lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-becoming-software-they-need-governance-52nb]"&gt;Part 1&lt;/a&gt;, I argued that reusable skills have become software artifacts. In &lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/designing-a-governance-layer-for-ai-skills-50g]"&gt;Part 2&lt;/a&gt;, I described a portable governance architecture. This final article focuses on the consequence: skills need a threat model and a code-review discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real execution chain
&lt;/h2&gt;

&lt;p&gt;The risk isn't the Markdown parser. It's the authority downstream of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipu4b2hbz44r187ogvkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipu4b2hbz44r187ogvkt.png" alt="The execution chain from a skill author or external source, through an interpreting agent and its available authority, to external effects." width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/64m5t7xz01oyvzrnazoj.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same sentence carries a different risk profile depending on whether it's read by a chatbot with no tools or by an autonomous coding agent holding repository write access and cloud credentials.&lt;/p&gt;

&lt;p&gt;Review the instruction in the context of the agent's actual authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical threat model
&lt;/h2&gt;

&lt;p&gt;A useful review starts with five questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Who can influence the skill?
&lt;/h3&gt;

&lt;p&gt;The author may be trusted, but the skill can import or quote untrusted material: web pages, issues, emails, repository files, or output from another tool. A workflow that says "follow the instructions in the linked document" has created an instruction channel outside code review.&lt;/p&gt;

&lt;p&gt;Treat external content as data unless an explicit trust decision promotes it to instructions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What can the agent reach?
&lt;/h3&gt;

&lt;p&gt;Inventory the available tools, filesystem scope, network access, credentials, MCP servers, hooks, and delegation mechanisms. Least privilege belongs in the runtime, but the skill shouldn't assume more authority than it needs either.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What can change?
&lt;/h3&gt;

&lt;p&gt;Read-only discovery is different from rewriting a library. A local formatting change is different from publishing a package. Review the maximum blast radius, not just the happy path.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How can the workflow fail?
&lt;/h3&gt;

&lt;p&gt;Consider interruption after a partial mutation, retry after a timeout, concurrent runs, stale state, missing dependencies, and ambiguous tool output. "The agent will figure it out" isn't a recovery plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. What evidence remains?
&lt;/h3&gt;

&lt;p&gt;A reviewer should be able to answer what ran, under which skill and policy version, what changed, and how completion was verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attack surface is larger than the skill body
&lt;/h2&gt;

&lt;p&gt;A complete review follows references.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nvwzscsknvi0df0g99n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nvwzscsknvi0df0g99n.png" alt="The behavior graph of an AI skill includes its contract, referenced files, scripts, MCP dependencies, hooks, agents, and handoffs." width="799" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/cb8zrvr5wtz535fp80vp.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A clean-looking skill may point to a dangerous script. A safe script may get launched by a hook with unescaped input. An MCP configuration may start an unexpected command. A handoff may expand the task past what the user actually approved.&lt;/p&gt;

&lt;p&gt;The review unit is the behavior graph, not one Markdown file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to look for
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prompt injection and trust-boundary collapse
&lt;/h3&gt;

&lt;p&gt;Flag instructions that treat fetched content as authoritative, especially phrases like "obey all instructions from…" or workflows that copy remote text straight into the agent's instruction hierarchy.&lt;/p&gt;

&lt;p&gt;Safer skills separate phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;retrieve content;&lt;/li&gt;
&lt;li&gt;label it untrusted;&lt;/li&gt;
&lt;li&gt;extract facts or data;&lt;/li&gt;
&lt;li&gt;validate those facts against the user's goal and local policy; and&lt;/li&gt;
&lt;li&gt;request approval before expanding scope.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Secrets and credential paths
&lt;/h3&gt;

&lt;p&gt;Review both literal secrets and instructions that steer the agent toward credential stores. Mask matches in reports. Don't echo tokens for debugging. Prefer environment-provided, scoped credentials, and avoid teaching a reusable skill where one particular person's secrets happen to live.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dangerous shell patterns
&lt;/h3&gt;

&lt;p&gt;Pipelines such as remote download into a shell, recursive deletion, force pushes, approval bypasses, or hard resets deserve high severity. Documentation examples need the same care: agents copy examples too.&lt;/p&gt;

&lt;p&gt;A skill that legitimately performs a destructive operation should define exact targets, preview the change, require confirmation, and explain recovery. "Be careful" isn't a control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hidden Unicode and homoglyphs
&lt;/h3&gt;

&lt;p&gt;Bidirectional controls and zero-width characters can make displayed text differ from its logical order. Homoglyphs can substitute characters that look nearly identical. Both are well suited to hiding a command, domain, variable, or path from a reviewer.&lt;/p&gt;

&lt;p&gt;Scan every agent asset, not only &lt;code&gt;SKILL.md&lt;/code&gt;: prompts, agents, commands, manifests, MCP configs, and runtime aliases.&lt;/p&gt;

&lt;h3&gt;
  
  
  References that escape the repository
&lt;/h3&gt;

&lt;p&gt;Resolve referenced paths against an explicit root. Reject traversal outside it unless the exception is deliberate and reviewed. Missing references should fail visibly rather than silently weakening the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP configuration and hooks
&lt;/h3&gt;

&lt;p&gt;MCP servers and hooks are executable boundaries. Review the command and arguments used to start a server, the environment variables passed to it, its network reach, and whether a skill's declared MCP dependencies actually match its tool use.&lt;/p&gt;

&lt;p&gt;For hooks, check input interpolation, shell quoting, trigger scope, and whether the hook can make changes without the same preview and approval contract the skill itself follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety properties for mutating skills
&lt;/h2&gt;

&lt;p&gt;Four concepts should show up in every review of a skill that changes state.&lt;/p&gt;

&lt;p&gt;Blast radius: what's the maximum set of files, records, systems, or people this could affect, and is that scope resolved before anything actually mutates? Preview: can the user see the exact plan or diff before the change happens, with confirmation tied to that preview rather than to some vague stated intent? Rollback: can the change be reversed, and if not, is that made explicit before execution? Idempotency: what happens if the skill runs twice, since a retry shouldn't duplicate comments, recreate resources, or apply the same migration a second time?&lt;/p&gt;

&lt;p&gt;Add checkpointing for multi-phase workflows too. After an interruption, resume from verified state instead of trusting conversational memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  A code-review checklist for skills
&lt;/h2&gt;

&lt;p&gt;Use this in pull requests:&lt;/p&gt;

&lt;h3&gt;
  
  
  Contract
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] The name and description define a narrow activation boundary.&lt;/li&gt;
&lt;li&gt;[ ] Inputs, outputs, non-goals, and verification are explicit.&lt;/li&gt;
&lt;li&gt;[ ] The skill declares whether it is read-only or mutating.&lt;/li&gt;
&lt;li&gt;[ ] Interactive questions and non-interactive behavior are bounded.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Portability and dependencies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Host-specific fields are absent or justified.&lt;/li&gt;
&lt;li&gt;[ ] Tool, script, MCP, and skill dependencies are declared.&lt;/li&gt;
&lt;li&gt;[ ] Optional host capabilities have a sequential fallback.&lt;/li&gt;
&lt;li&gt;[ ] Paths are portable and resolved within an explicit root.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] External content is treated as untrusted data.&lt;/li&gt;
&lt;li&gt;[ ] No embedded secrets or credential-store directions exist.&lt;/li&gt;
&lt;li&gt;[ ] Dangerous commands are absent or protected by exact-scope controls.&lt;/li&gt;
&lt;li&gt;[ ] Hidden Unicode and homoglyph scans pass.&lt;/li&gt;
&lt;li&gt;[ ] Referenced scripts, hooks, agents, and configs were reviewed too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mutation safety
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] The blast radius is bounded.&lt;/li&gt;
&lt;li&gt;[ ] The user sees a concrete preview before material changes.&lt;/li&gt;
&lt;li&gt;[ ] Confirmation cannot be bypassed by ambiguous wording.&lt;/li&gt;
&lt;li&gt;[ ] Rollback or recovery is documented.&lt;/li&gt;
&lt;li&gt;[ ] Retries and repeated runs are safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Evidence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Deterministic checks pass under a known rule version.&lt;/li&gt;
&lt;li&gt;[ ] Semantic quality was reviewed against a shared rubric.&lt;/li&gt;
&lt;li&gt;[ ] The completion test verifies outcomes, not merely tool success.&lt;/li&gt;
&lt;li&gt;[ ] Material decisions remain visible in the change history.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What automation should block
&lt;/h2&gt;

&lt;p&gt;Not every imperfect sentence should fail CI. Blocking policy should stay narrow and predictable.&lt;/p&gt;

&lt;p&gt;High-confidence, high-impact issues are good candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing required metadata that makes the skill unloadable;&lt;/li&gt;
&lt;li&gt;destructive or approval-bypassing commands;&lt;/li&gt;
&lt;li&gt;embedded secrets or credential paths;&lt;/li&gt;
&lt;li&gt;hidden character deception;&lt;/li&gt;
&lt;li&gt;unsafe references or script traversal;&lt;/li&gt;
&lt;li&gt;mutating behavior without a preview/confirmation contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clarity, example quality, discoverability, and compositional elegance usually belong in review evidence rather than a hard deterministic gate.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/artemrudenko/skill-governance-toolkit" rel="noopener noreferrer"&gt;Skill Governance Toolkit&lt;/a&gt; implements this split. Its read-only engine scans agent assets with versioned rules and can block only newly introduced high-severity findings. Its model-driven skills add nine-dimensional quality evaluation and library-level analysis on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance is not a sandbox
&lt;/h2&gt;

&lt;p&gt;Skill review doesn't replace runtime isolation, permissions, network policy, secret management, or human approval for high-risk actions.&lt;/p&gt;

&lt;p&gt;It addresses a different layer: whether the reusable instructions we distribute are well-formed, transparent, portable, and safe by design.&lt;/p&gt;

&lt;p&gt;Defense in depth still applies:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Facyj28cgpdkrv4nidqaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Facyj28cgpdkrv4nidqaj.png" alt="Defense in depth for AI skills: governed assets, reviewed changes, least-privilege runtimes, tool and network controls, observable execution, and human approval." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/zrt137tutah2tilgn4ri.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No single layer should have to carry the whole trust burden.&lt;/p&gt;

&lt;h2&gt;
  
  
  The standard should rise with the authority
&lt;/h2&gt;

&lt;p&gt;We don't review a comment, a build script, and a production migration with the same rigor, and skills deserve that same risk-based treatment.&lt;/p&gt;

&lt;p&gt;A writing assistant skill may need a clear contract and privacy boundaries. A deployment skill needs dependency pinning, least privilege, preview, approval, rollback, idempotency, and an audit trail.&lt;/p&gt;

&lt;p&gt;The more authority an agent gets, the less it makes sense to treat its reusable instructions as "just prompts."&lt;/p&gt;

&lt;p&gt;AI skills are executable assets. Not because Markdown became code, but because Markdown became part of the control plane for systems that can actually act.&lt;/p&gt;

&lt;p&gt;Let's review it accordingly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-becoming-software-they-need-governance-52nb]"&gt;AI Skills Are Becoming Software. They Need Governance.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/designing-a-governance-layer-for-ai-skills-50g]"&gt;Designing a Governance Layer for AI Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Skills Are Executable Assets. Let's Review Them Like Code.&lt;/strong&gt; (this article)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Explore or contribute to the MIT-licensed toolkit: &lt;a href="https://github.com/artemrudenko/skill-governance-toolkit" rel="noopener noreferrer"&gt;github.com/artemrudenko/skill-governance-toolkit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What is the most dangerous capability you have seen hidden behind an innocent-looking agent instruction?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Designing a Governance Layer for AI Skills. Part 2 of 3</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Sat, 08 Aug 2026 19:27:34 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/designing-a-governance-layer-for-ai-skills-50g</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/designing-a-governance-layer-for-ai-skills-50g</guid>
      <description>&lt;p&gt;In &lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-becoming-software-they-need-governance-52nb]"&gt;Part 1&lt;/a&gt;, I argued that reusable AI skills have become software artifacts.&lt;/p&gt;

&lt;p&gt;That thesis is only useful if it changes the architecture.&lt;/p&gt;

&lt;p&gt;A governance layer should make skills easier to discover, safer to reuse, and cheaper to maintain. It shouldn't require every team to adopt the same model, editor, or orchestration framework. And it needs to separate facts a machine can enforce from judgments that still need a human reading them.&lt;/p&gt;

&lt;p&gt;This article walks through the architecture behind the open-source &lt;a href="https://github.com/artemrudenko/skill-governance-toolkit" rel="noopener noreferrer"&gt;Skill Governance Toolkit&lt;/a&gt;, including the choices that mattered more than the code did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the lifecycle, not the tool
&lt;/h2&gt;

&lt;p&gt;It's tempting to begin with a marketplace, an MCP server, or a CLI. Those are delivery mechanisms. Governance begins with a lifecycle:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focw3xcfkp48l0m4lqn8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focw3xcfkp48l0m4lqn8p.png" alt="A governance lifecycle that begins by finding or authoring a skill, then evaluates, reviews, versions, distributes, improves, or retires it." width="800" height="2764"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/zvx3wetriph2jvccvobj.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each transition needs a contract. Discovery needs consistent metadata. Evaluation needs criteria. Distribution needs compatibility claims. Adoption needs an upgrade and removal path.&lt;/p&gt;

&lt;p&gt;Skip those contracts and a collection of skills is just a folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three instruction layers
&lt;/h2&gt;

&lt;p&gt;The toolkit separates information by loading cost and responsibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L1 — Project rules       always loaded
L2 — Procedural skills   loaded when intent matches
L3 — Specialized agents dispatched when supported
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; holds universal project rules. A &lt;code&gt;SKILL.md&lt;/code&gt; contains a bounded procedure activated by its description. A file under &lt;code&gt;agents/&lt;/code&gt; supplies specialized expertise that an orchestrator may dispatch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmhytww3wve2wx49ctsjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmhytww3wve2wx49ctsjj.png" alt="Three instruction layers: always-on project rules, intent-activated procedural skills, and optional specialized agents with a sequential fallback." width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/0n3b9u3w41z4b414klgm.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That layout avoids two expensive extremes: loading every procedure on every turn, or burying every rule inside an opaque runtime configuration.&lt;/p&gt;

&lt;p&gt;The sub-agent layer is optional by design. Four supported runtimes can use the included code-reviewer agent; Gemini CLI currently needs the instructions inlined or run sequentially instead. Portability claims carry more weight when you're upfront about limitations like that.&lt;/p&gt;

&lt;h2&gt;
  
  
  One source, multiple runtimes
&lt;/h2&gt;

&lt;p&gt;Forking the same skill for each host looks pragmatic at first. In practice it creates five sources of truth.&lt;/p&gt;

&lt;p&gt;The toolkit instead keeps one canonical &lt;code&gt;skills/&lt;/code&gt; directory. Runtime manifests and thin aliases point back to it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; is the rule source;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;GEMINI.md&lt;/code&gt; import it;&lt;/li&gt;
&lt;li&gt;Copilot, Cursor, and Codex consume the appropriate root files or manifests;&lt;/li&gt;
&lt;li&gt;host-specific packaging changes, but skill content doesn't.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule is simple: capability differences belong in compatibility metadata and fallback paths, not in duplicated skill bodies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Split deterministic checks from semantic judgment
&lt;/h2&gt;

&lt;p&gt;This is the most important boundary in the design.&lt;/p&gt;

&lt;p&gt;Some findings have to come out identical no matter which model happens to be running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required front matter is missing;&lt;/li&gt;
&lt;li&gt;a host-only &lt;code&gt;allowed-tools&lt;/code&gt; field breaks portability;&lt;/li&gt;
&lt;li&gt;a secret-like token is embedded;&lt;/li&gt;
&lt;li&gt;a destructive shell command appears;&lt;/li&gt;
&lt;li&gt;a file contains hidden bidirectional characters or suspicious homoglyphs;&lt;/li&gt;
&lt;li&gt;a referenced script escapes the repository boundary;&lt;/li&gt;
&lt;li&gt;a mutating skill has no preview or confirmation contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other questions are inherently semantic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the description specific enough for reliable discovery?&lt;/li&gt;
&lt;li&gt;Are examples representative rather than decorative?&lt;/li&gt;
&lt;li&gt;Does the workflow explain edge cases clearly?&lt;/li&gt;
&lt;li&gt;Are constraints proportionate to the risk?&lt;/li&gt;
&lt;li&gt;Would another engineer understand how to verify the result?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbvtufjcmwj3zi9hryev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbvtufjcmwj3zi9hryev.png" alt="Deterministic checks and model-assisted evaluation produce complementary evidence for a skill policy decision." width="799" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/8sd5dwsk9vrxcz1snv8b.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The deterministic engine is stdlib-only Python, read-only by default, and needs no network access. The same rules are exposed in three modes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;local checks and CI gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;an agent auditing a skill while it is being edited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;isolation, reproducibility, or environments without local Python&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are delivery layers, not three separate engines. A finding shouldn't change just because it came from an editor instead of CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive enforcement beats the clean-slate fantasy
&lt;/h2&gt;

&lt;p&gt;A governance rollout often fails for a predictable reason: the first audit surfaces years of debt and immediately blocks every change.&lt;/p&gt;

&lt;p&gt;The toolkit's changed-only gate compares findings at a base ref against findings at HEAD. A finding's identity excludes its line number, so moving existing text around doesn't turn old debt into a new failure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8n38q2wye0405cl4167u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8n38q2wye0405cl4167u.png" alt="A progressive enforcement gate distinguishes pre-existing advisory debt from newly introduced findings that can warn or block." width="798" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/tnkqgtpcu99dj9ymfjsb.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That makes a simple policy possible: don't let the library get worse, then improve it on purpose. High-severity new findings can block; medium and low findings can start out advisory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance as a set of composable skills
&lt;/h2&gt;

&lt;p&gt;The toolkit ships six meta-skills instead of one universal "govern everything" agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;skill-find&lt;/code&gt; searches project, personal, and corporate libraries.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skill-evaluate&lt;/code&gt; scores one skill across nine quality dimensions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skill-compare&lt;/code&gt; recommends whether to keep, replace, or merge variants.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;library-audit&lt;/code&gt; detects collection-level drift and collisions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skill-build-portable&lt;/code&gt; transforms a host-specific skill with a diff preview.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;integration-init&lt;/code&gt; installs optional analysis integrations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The boundaries between them matter. A detect-only library audit shouldn't quietly rewrite files, a mutating portability workflow needs to preview its changes before applying them, and a comparison tool should hand you a decision rather than sneak in an undeclared migration.&lt;/p&gt;

&lt;p&gt;Small skills also compose better. An audit can spot a problem, an evaluator can explain it in depth, and a builder can propose a repair, all without one oversized workflow owning every decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation is part of governance
&lt;/h2&gt;

&lt;p&gt;Distribution code can wreck trust even when the skills themselves are excellent.&lt;/p&gt;

&lt;p&gt;So the installer distinguishes user-owned files from toolkit-owned files. It only touches user instruction files inside marker blocks. Toolkit-owned files are tracked separately, so upgrades and uninstalls remove only what the toolkit put there. User content outside the markers, state directories, and generated reports stay untouched.&lt;/p&gt;

&lt;p&gt;Safe upgrade, rollback, and uninstall aren't packaging trivia. They're lifecycle requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traceability and resumability
&lt;/h2&gt;

&lt;p&gt;Audit reports include both the engine version and the rule-catalog version, so a verdict can always be traced back to the policy that produced it.&lt;/p&gt;

&lt;p&gt;Longer workflows checkpoint after expensive phases into a project-local state directory. If a run gets interrupted, it resumes instead of repeating work or guessing what already completed. It's a small implementation detail, but it has an outsized effect on reliability: agent workflows fail and get interrupted just like any other distributed process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would keep invariant
&lt;/h2&gt;

&lt;p&gt;Tools and formats will change. These design principles should outlast them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one canonical source for each skill;&lt;/li&gt;
&lt;li&gt;explicit interfaces and compatibility claims;&lt;/li&gt;
&lt;li&gt;deterministic gates for deterministic facts;&lt;/li&gt;
&lt;li&gt;semantic review for semantic quality;&lt;/li&gt;
&lt;li&gt;read-only inspection as the default;&lt;/li&gt;
&lt;li&gt;preview and recovery for mutations;&lt;/li&gt;
&lt;li&gt;progressive enforcement for legacy libraries;&lt;/li&gt;
&lt;li&gt;traceable rule and engine versions; and&lt;/li&gt;
&lt;li&gt;optional runtime optimizations with functional fallbacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Governance should stay portable even when the agents running it aren't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture in one view
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffefndlny5wr7mn5pszqh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffefndlny5wr7mn5pszqh.png" alt="The complete governance architecture: one canonical skill repository, multiple runtimes, a shared deterministic audit core, semantic meta-skills, and human review." width="798" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/lztkiqgz7oj7h5sbbznh.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The implementation itself is deliberately modest. What matters is the separation of concerns: authoring, evaluation, enforcement, packaging, and execution no longer collapse into one giant prompt.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-becoming-software-they-need-governance-52nb]"&gt;Part 1 — AI Skills Are Becoming Software. They Need Governance.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-executable-assets-lets-review-them-like-code-1cph]"&gt;Part 3 — AI Skills Are Executable Assets. Let's Review Them Like Code.&lt;/a&gt; goes deeper into the threat model: prompt injection, Unicode deception, referenced scripts, hooks, MCP configuration, blast radius, rollback, and idempotency.&lt;/p&gt;

&lt;p&gt;Explore the implementation: &lt;a href="https://github.com/artemrudenko/skill-governance-toolkit" rel="noopener noreferrer"&gt;github.com/artemrudenko/skill-governance-toolkit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Where would you draw the boundary between a CI-blocking rule and a review-time recommendation?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>AI Skills Are Becoming Software. They Need Governance. Part 1 of 3</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Sat, 08 Aug 2026 19:16:18 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-becoming-software-they-need-governance-52nb</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-becoming-software-they-need-governance-52nb</guid>
      <description>&lt;p&gt;We're starting to treat AI skills as software.&lt;/p&gt;

&lt;p&gt;We're still managing them like prompts.&lt;/p&gt;

&lt;p&gt;That gap is easy to ignore when one developer keeps a handful of local instruction files. It gets expensive once skills are shared across a team, loaded by several agent runtimes, and trusted to guide tools that can read repositories, run commands, or touch production systems.&lt;/p&gt;

&lt;p&gt;A reusable skill isn't just text anymore. It has an interface, dependencies, compatibility assumptions, failure modes, and a blast radius. It can go stale, conflict with another skill, or work fine on one runtime and quietly fail on another. At that point it's behaving like a software artifact, and software artifacts need governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The prompt model breaks at team scale
&lt;/h2&gt;

&lt;p&gt;The first version of almost every agent workflow is a prompt: explain the task, add a few examples, ask the model to follow the rules.&lt;/p&gt;

&lt;p&gt;Then the prompt grows. Someone appends architectural conventions, then safety warnings, then tool-specific syntax. A second developer copies it and tweaks a line. Another team spins up a "cleaner" version. Six months later, nobody can say which copy is the real one.&lt;/p&gt;

&lt;p&gt;That's not mainly a context-window problem. It's a lifecycle problem.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When a skill is treated as a prompt&lt;/th&gt;
&lt;th&gt;When a skill is treated as software&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Copied between chats&lt;/td&gt;
&lt;td&gt;Stored in a canonical repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed without history&lt;/td&gt;
&lt;td&gt;Versioned with meaningful diffs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trusted because it reads well&lt;/td&gt;
&lt;td&gt;Evaluated against explicit criteria&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bound to one agent host&lt;/td&gt;
&lt;td&gt;Declares and tests portability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewed informally&lt;/td&gt;
&lt;td&gt;Passes review and security gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owned by whoever last edited it&lt;/td&gt;
&lt;td&gt;Has an owner and lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model still executes instructions probabilistically. The asset around those instructions doesn't have to be unmanaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a skill a software artifact?
&lt;/h2&gt;

&lt;p&gt;Not every prompt deserves a release process. The boundary is reuse plus consequence.&lt;/p&gt;

&lt;p&gt;A skill crosses that boundary when it's expected to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;work repeatedly rather than once;&lt;/li&gt;
&lt;li&gt;be discovered and activated from natural-language intent;&lt;/li&gt;
&lt;li&gt;coordinate tools, scripts, files, or sub-agents;&lt;/li&gt;
&lt;li&gt;behave consistently across projects or runtimes;&lt;/li&gt;
&lt;li&gt;be maintained by more than one person; or&lt;/li&gt;
&lt;li&gt;produce changes whose failure matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point the skill starts looking like software in five specific ways.&lt;/p&gt;

&lt;p&gt;It has an interface: its name and description decide when an agent picks it up, and its inputs, outputs, and verification steps form a contract with whoever uses it. It has dependencies, often on tools, MCP servers, scripts, reference files, or other skills. Compatibility becomes a real question once host-specific fields and capabilities start producing different behavior across Claude Code, GitHub Copilot, Cursor, Codex, and Gemini CLI. You can assess its quality attributes: clarity, completeness, specificity, discoverability, testability, portability, safety. And it carries risk, since instructions can normalize destructive commands, expose credential paths, trust hostile content, or hide behavior behind Unicode characters that look harmless.&lt;/p&gt;

&lt;p&gt;Calling the file "Markdown" doesn't make any of that go away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance is not bureaucracy
&lt;/h2&gt;

&lt;p&gt;Say "governance" and most people picture a committee standing between an engineer and the work that actually matters. That's not what I mean by it here.&lt;/p&gt;

&lt;p&gt;For skills, governance comes down to a small set of questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What assets do we have?&lt;/li&gt;
&lt;li&gt;Who owns them?&lt;/li&gt;
&lt;li&gt;What contract does each asset promise?&lt;/li&gt;
&lt;li&gt;Which runtimes and dependencies does it support?&lt;/li&gt;
&lt;li&gt;What evidence is required before it's shared?&lt;/li&gt;
&lt;li&gt;What should block a change, and what should merely warn?&lt;/li&gt;
&lt;li&gt;How do we upgrade, deprecate, and remove it safely?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Good governance makes the safe path the easy path: a standard for authors, a shared vocabulary for reviewers, a deterministic baseline for CI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgaizd759t6qtacwlv5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgaizd759t6qtacwlv5j.png" alt="The lifecycle of a governed AI skill, from discovery and authoring through review, publication, improvement, and deprecation." width="800" height="2042"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/33u6yj5ou47okehnkiuk.png" rel="noopener noreferrer"&gt;Open the full-size SVG diagram →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of this is meant to slow every edit down. It's meant to make the lifecycle visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory was the symptom, not the product
&lt;/h2&gt;

&lt;p&gt;My own path to this idea started with an AI pair programmer that kept losing project context between sessions: architectural decisions, naming conventions, testing expectations, the reasoning behind earlier choices.&lt;/p&gt;

&lt;p&gt;My first instinct was to write a bigger instruction file.&lt;/p&gt;

&lt;p&gt;That helped, until it didn't. The file got harder to navigate, harder to validate, and increasingly tied to one specific tool. The deeper issue wasn't that the model needed a bigger memory. It was that project knowledge needed structure.&lt;/p&gt;

&lt;p&gt;So instead of asking an agent to remember everything, I started packaging bounded procedures as skills: discoverable, reusable, versioned, reviewable, portable.&lt;/p&gt;

&lt;p&gt;The memory problem is what led me to the architecture. Governance turned out to be the actual product.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete experiment: Skill Governance Toolkit
&lt;/h2&gt;

&lt;p&gt;I built the open-source &lt;a href="https://github.com/artemrudenko/skill-governance-toolkit" rel="noopener noreferrer"&gt;Skill Governance Toolkit&lt;/a&gt; as a reference implementation of this approach.&lt;/p&gt;

&lt;p&gt;It uses one canonical &lt;code&gt;skills/&lt;/code&gt; directory and a shared &lt;code&gt;AGENTS.md&lt;/code&gt; source of project rules, while packaging the same six core meta-skills for Claude Code, GitHub Copilot, Cursor, OpenAI Codex CLI, and Google Gemini CLI.&lt;/p&gt;

&lt;p&gt;Those meta-skills cover a practical lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;find an existing skill before creating another;&lt;/li&gt;
&lt;li&gt;evaluate one skill across nine quality dimensions;&lt;/li&gt;
&lt;li&gt;compare local and corporate variants;&lt;/li&gt;
&lt;li&gt;audit a library for systemic issues;&lt;/li&gt;
&lt;li&gt;convert host-specific skills into portable ones; and&lt;/li&gt;
&lt;li&gt;initialize optional integrations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository also includes a deterministic, read-only audit engine. The same checks run locally or in CI through a CLI, interactively through MCP, or inside a locked-down Docker container. A changed-only gate can block newly introduced high-severity findings without forcing a team to fix all historical debt first.&lt;/p&gt;

&lt;p&gt;This distinction matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic checks handle reproducible facts such as malformed front matter, unsafe shell patterns, hidden characters, hardcoded paths, and missing contracts;&lt;/li&gt;
&lt;li&gt;model-assisted evaluation handles semantic questions such as whether instructions are clear, examples are useful, or trigger phrases are discoverable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Governance needs both. Asking an LLM to make every safety decision creates recursive trust. Asking a lexical scanner to judge clarity creates false confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The questions we should ask in review
&lt;/h2&gt;

&lt;p&gt;Once you start seeing skills as software, the review question changes. "Does this prompt look good?" isn't enough anymore.&lt;/p&gt;

&lt;p&gt;Ask instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is its activation boundary specific enough to avoid collisions?&lt;/li&gt;
&lt;li&gt;Does it state what it will and will not change?&lt;/li&gt;
&lt;li&gt;Are inputs, outputs, and completion criteria explicit?&lt;/li&gt;
&lt;li&gt;Can it run without one vendor's private front matter?&lt;/li&gt;
&lt;li&gt;Are required scripts and MCP servers declared?&lt;/li&gt;
&lt;li&gt;Does a mutating workflow preview changes and support recovery?&lt;/li&gt;
&lt;li&gt;Could untrusted content be mistaken for instructions?&lt;/li&gt;
&lt;li&gt;What happens on interruption, retry, or partial failure?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are ordinary engineering questions. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shift
&lt;/h2&gt;

&lt;p&gt;Prompt engineering asks: how do I phrase this instruction so the model follows it?&lt;/p&gt;

&lt;p&gt;Skill engineering asks: how do I design, validate, distribute, and evolve this capability so a team can rely on it?&lt;/p&gt;

&lt;p&gt;We'll keep writing prompts. But the reusable ones are turning into something more consequential: interfaces between human intent, model behavior, and the tools that actually do things.&lt;/p&gt;

&lt;p&gt;Teams that catch that shift early won't just end up with better prompts. They'll have a capability system they can actually maintain.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/designing-a-governance-layer-for-ai-skills-50g]"&gt;Part 2 — Designing a Governance Layer for AI Skills&lt;/a&gt; examines the architecture: instruction layers, deterministic and semantic checks, portability, CI policy, and safe adoption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI Skills Are Becoming Software. They Need Governance.&lt;/strong&gt; (this article)&lt;/li&gt;
&lt;li&gt;&lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/designing-a-governance-layer-for-ai-skills-50g]"&gt;Designing a Governance Layer for AI Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="[https://dev.to/artemr_rudenko_0bf2c2c505/ai-skills-are-executable-assets-lets-review-them-like-code-1cph]"&gt;AI Skills Are Executable Assets. Let's Review Them Like Code.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The toolkit is open source and MIT-licensed: &lt;a href="https://github.com/artemrudenko/skill-governance-toolkit" rel="noopener noreferrer"&gt;github.com/artemrudenko/skill-governance-toolkit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How is your team reviewing and maintaining reusable agent instructions today?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
