<?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>From too many sources to knowledge I can use again</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Fri, 16 Oct 2026 06:55:57 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/from-too-many-sources-to-knowledge-i-can-use-again-22fk</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/from-too-many-sources-to-knowledge-i-can-use-again-22fk</guid>
      <description>&lt;p&gt;Hi! There were more useful sources than I could read carefully. Saving every promising link would only move the pile into a reading list. I wanted to choose what deserved attention and keep the ideas I would need again.&lt;/p&gt;

&lt;p&gt;That raised another question: when I returned to a problem, what should I be able to recover from my own research? A useful note would give me the idea, the source behind it, and enough context to judge whether it applied to the task in front of me.&lt;/p&gt;

&lt;p&gt;This became Research Brain: a workflow for collecting material, turning selected sources into linked notes, and consulting those notes later. I wanted that knowledge to be available in other projects, where my agent and I were making development decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a research wiki to a working workflow
&lt;/h2&gt;

&lt;p&gt;I started by trying &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;Karpathy's LLM Wiki pattern&lt;/a&gt; and an Obsidian setup using the Model Context Protocol (MCP). They gave me a starting point: keep research in a wiki that an agent can maintain and consult.&lt;/p&gt;

&lt;p&gt;I judged the result by whether I could reuse what I had learned. For that, I needed rules around the wiki: how a source gets in, what evidence a note retains, when it needs another check, and what the agent may change. I also needed to notice when collection or delivery failed. Working through those requirements, and fixing what failed in practice, shaped my own implementation.&lt;/p&gt;

&lt;p&gt;The knowledge store is an Obsidian vault—a local folder of Markdown notes. A concept note keeps an idea together with its sources, limits, and open questions. I can read and edit those files directly; the optional MCP adapter lets an agent in another project retrieve them. Source collection and the configured model can still use external services.&lt;/p&gt;

&lt;p&gt;The digest and the adapter serve different moments in the same workflow. The digest surfaces new material and note updates for reading; retrieval brings existing notes into a current task.&lt;/p&gt;

&lt;h2&gt;
  
  
  How material becomes a note
&lt;/h2&gt;

&lt;p&gt;The full workflow runs inside an agent runtime. It collects candidates from configured sources, including feeds, official pages, and search results, then selects material for the configured topics. URL and text deduplication reduce repeated material before it moves further through the pipeline.&lt;/p&gt;

&lt;p&gt;Before the agent curates or synthesizes article text, a sanitizer removes known prompt-injection patterns and flags others. Curation then applies the topic's inclusion and exclusion rules and a minimum text length. The selected material becomes the input for synthesis into concept notes.&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%2Fzznk6hr9s5dfhmwitner.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%2Fzznk6hr9s5dfhmwitner.png" alt="The full agent workflow collects configured sources, removes duplicates, sanitizes incoming text, and curates it before synthesizing concept notes. The same vault supports a weekly digest and read-only retrieval by project agents through MCP." width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The full agent workflow supports reading and reuse. The reduced RSS-only fallback builds a digest without synthesizing concept notes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These steps filter different kinds of problems. A duplicate is repeated material. An off-topic article does not belong in this collection. A hidden instruction should not become a command to the agent. None of those checks establishes that an article's claims are true.&lt;/p&gt;

&lt;p&gt;The security boundary also continues after ingestion. The MCP adapter labels retrieved notes as untrusted data and exposes read-only retrieval, with no shell or arbitrary-file tool. Filters can miss attacks; the connected agent still needs appropriate tool permissions. This follows the concern described in &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP's guidance on indirect prompt injection&lt;/a&gt;: instructions can arrive inside material the agent was only meant to read.&lt;/p&gt;

&lt;p&gt;To check the facts, I need the source trail to survive synthesis. Notes carry source records, and a mechanical health check flags missing citations, broken links, and other maintenance issues. Several publishers can repeat one upstream story, so counting sources is not enough to establish independent confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Asking the notes from another project
&lt;/h2&gt;

&lt;p&gt;Once the notes existed, the next step was to make them available where a question arose. The local MCP adapter provides two tools: &lt;code&gt;search_knowledge&lt;/code&gt; finds candidate notes, and &lt;code&gt;get_concept&lt;/code&gt; opens a selected note in more detail.&lt;/p&gt;

&lt;p&gt;The current search uses weighted word matches. It breaks the query into words, removes common English query words, and checks the note's title, filename, tags, vault-index context, and body. An optional topic filter narrows the candidates; problem-and-solution notes can also be filtered by programming language and problem type. Title matches count more than body matches; the adapter returns up to two notes with excerpts, recorded sources, freshness information, and open questions.&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%2Fx7pdqv9ayjjfa3t2rqtu.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%2Fx7pdqv9ayjjfa3t2rqtu.png" alt="A project question is split into query words, then matched against titles, filenames, tags, index context, and note bodies. Up to two candidate notes are returned. The host agent checks their sources and applicability; a gap can lead to separate research." width="800" height="1055"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The search finds candidate context. The agent still has to decide whether that context supports the current task.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are no embeddings or semantic search in this adapter. Freshness is reported from the note's recorded verification date and review interval; it does not improve the match score or certify that the source is still correct. Generic words can produce irrelevant hits, and a useful note can be missed when the query uses different wording.&lt;/p&gt;

&lt;p&gt;When the vault has no useful answer, I want that gap to stay visible. In vault-only mode, the lookup stops and offers further research. In research mode, it tells the host agent to carry the retrieved context and gaps into the existing research workflow: check local material first, then ask before external research. The MCP server itself does no web research. Project findings go through a separate write workflow with explicit approval; the weekly workflow can ingest eligible research notes unattended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the loop between projects
&lt;/h2&gt;

&lt;p&gt;Retrieval left another question open: could a solution found during project work become useful knowledge for the next project? I tested that path with an agent on real unfinished tasks, using a private evaluation vault.&lt;/p&gt;

&lt;p&gt;In the first project, an HTTP collector ignored the server's &lt;code&gt;Retry-After&lt;/code&gt; hint and used its fixed retry delay. The agent checked &lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.3" rel="noopener noreferrer"&gt;RFC 9110, section 10.2.3&lt;/a&gt; and corrected the retry loop: wait the full requested pause when it fits the local budget, otherwise stop. Offline regression tests reproduced the problem and passed after the change.&lt;/p&gt;

&lt;p&gt;The agent then prepared an update to the existing note. It kept the problem, the rule and source, the checked result, and the conditions another project would need to reconsider. I approved the exact change before it entered Research Brain. Saving used a separate reviewed workflow; MCP remained read-only.&lt;/p&gt;

&lt;p&gt;From a second project, the agent retrieved the saved note through MCP. That collector shortened server pauses to its own limit and used a total deadline rather than the first collector's cumulative sleep allowance. The note supplied the rule and questions; the agent still had to inspect the local code, clocks, error handling, and callers. It adapted the fix and checked it with offline regressions. The result was then proposed back to the note and saved with my approval, including the remaining limits.&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%2Fu3twqjt39tslfu2pcudi.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%2Fu3twqjt39tslfu2pcudi.png" alt="A checked project solution goes through an exact proposal and owner approval before entering Research Brain. Another project retrieves it through read-only MCP, adapts and verifies it locally, and proposes any new finding for another owner-approved update." width="800" height="1157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Project findings use a separate write workflow. Reuse can lead to another proposal; each save needs direct owner approval.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This completed a coordinated loop of saving, reuse and another approved update. The agent kept earlier context, and the faults were chosen before lookup. Offline tests used simulated responses and clocks. They did not test discovery by a new agent, automatic note synthesis or live traffic. They also did not show that separate jobs would respect the same wait, or that the changes were ready to release.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the notes did not help
&lt;/h2&gt;

&lt;p&gt;A school-class comparison task gave a different result. The agent queried a separate working vault of 39 notes. Broad wording returned unrelated matches; a more specific admissions query returned nothing. The agent set those results aside and completed the change using the project's own rules and retained data.&lt;/p&gt;

&lt;p&gt;Matching familiar words could make irrelevant notes look promising. Improving retrieval and growing useful coverage are both necessary; one does not automatically solve the other.&lt;/p&gt;

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

&lt;p&gt;What I found useful was having sources, limits, and questions for further checking together. These recorded trials do not establish time savings or better decisions. The longer-term question is whether recurring collection and retrieval justify the effort of preparing, verifying, and maintaining the notes.&lt;/p&gt;

&lt;p&gt;For someone trying the idea, I would start with one recurring question. Keep a note with the rule, its supporting source, and the conditions that could change the answer. When the question returns, check whether the note helps you decide what to inspect next—and count the effort needed to verify and update it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/artemrudenko/research-brain-public" rel="noopener noreferrer"&gt;public Research Brain repository&lt;/a&gt; now includes the project-solution capture workflow, its record template, and tests alongside collection and retrieval. The &lt;a href="https://github.com/artemrudenko/research-brain-public/blob/main/docs/problem-solutions.md" rel="noopener noreferrer"&gt;problem-and-solution guide&lt;/a&gt; explains how to validate a finding, review the exact proposed change, and save it after direct owner approval.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://github.com/artemrudenko/research-brain-public/blob/main/integrations/mcp_server/examples/problem_solution.py" rel="noopener noreferrer"&gt;disposable synthetic example&lt;/a&gt; exercises saving a finding and retrieving it from another project. It checks the workflow, not the private application runs described here. The &lt;a href="https://github.com/artemrudenko/research-brain-public/blob/main/integrations/mcp_server/README.md" rel="noopener noreferrer"&gt;MCP setup guide&lt;/a&gt; covers connecting the adapter.&lt;/p&gt;

&lt;p&gt;When you return to something you researched earlier, what do you usually have to reconstruct?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>learning</category>
      <category>mcp</category>
    </item>
    <item>
      <title>When does an integration help a sales decision? — SalesWiki, Part 5 of 5</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:29:46 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc</guid>
      <description>&lt;p&gt;Before your next customer conversation, which detail would you check—and where would you find it?&lt;/p&gt;

&lt;p&gt;The account summary may be in your customer system, the latest detail in a document, and a promise in a chat thread. Finding each piece still leaves a question: what can you rely on for your next step?&lt;/p&gt;

&lt;p&gt;That is the question behind my SalesWiki research. I am exploring a shared knowledge base for sales and marketing: linked account context, different access for different roles, and answers that show their sources and gaps. The aim is to spend less effort rebuilding context so people have more room to think through the decision.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;Part 4&lt;/a&gt;, I looked at what must change before a demo uses real customer data. This final part follows one example through a check, then asks when connecting another tool would help. No technical background is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before contacting Atlas Foods
&lt;/h2&gt;

&lt;p&gt;Atlas Foods is an invented account in the demo, not a customer case. Its account summary was last reviewed on August 12. A call note is dated August 18, and an audit source August 21. Both are newer than the summary.&lt;/p&gt;

&lt;p&gt;The audit source says the team wants to reduce manual evidence gathering during each audit cycle. That could matter when preparing the conversation: ask which part of the audit takes the most effort, rather than starting with a general product pitch. It still does not tell us the customer's current evaluation date.&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%2Fc8afcp4thi8celrn7xz6.jpg" 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%2Fc8afcp4thi8celrn7xz6.jpg" alt="The Atlas Foods context check shows an August 12 account review and newer August 18 and 21 sources, with buttons to inspect each source." width="620" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Current demo, cropped to the check and its dated sources. All account data is synthetic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An old summary is not a reason to drop the account. A newer document is not automatically the full answer either. I would compare them, keep the useful history, and ask the account owner for the missing date before deciding how to follow up.&lt;/p&gt;

&lt;p&gt;For marketing, the question might be different: which approved detail can support a useful message? The same account can help both teams, but each needs the facts relevant to its task and permitted for its role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting an answer is different from changing the record
&lt;/h2&gt;

&lt;p&gt;This is the distinction I want SalesWiki to make clear. Someone asking a question needs an answer they can check. Someone correcting the shared account context needs a review path.&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%2Fptc782ju0isvdaualcjb.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%2Fptc782ju0isvdaualcjb.png" alt="Two paths: a question leads through permitted dated facts to an answer with sources and gaps, then a person chooses the next step. A new source leads to a proposed card change, human review, and a separately applied approved change. Original sources stay intact." width="800" height="831"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The intended workflow in plain language. A proposed change is reviewed before it is applied; reading a source does not update a card.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The knowledge base holds the team's current understanding and links back to the evidence. It does not need to become another copy of every document, recording and customer system. Original sources stay intact. Account summaries and working conclusions can change through review, with a history of what changed and why.&lt;/p&gt;

&lt;p&gt;The assistant's role is to bring the relevant, permitted context together and make gaps visible. It should not quietly fill in a missing date or decide that an account is no longer worth attention. The person makes that judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful check can end with “we still don't know”
&lt;/h2&gt;

&lt;p&gt;For this demonstration, I opened the audit source, then recorded “Could not verify” and “Ask for missing context.” The source explains a need, but it does not settle the current evaluation date. I left the effect on the next decision as “Cannot assess yet.”&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%2Fxb2gltr99rawbpw32l6a.jpg" 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%2Fxb2gltr99rawbpw32l6a.jpg" alt="A recorded Atlas Foods check says Could not verify, Cannot assess yet, and Ask for missing context. A notice says card freshness and priority still follow the stored evidence." width="620" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;An illustrative result I recorded in the synthetic demo. It records a next step, not a confirmed customer finding or an updated account card.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This gives the check an outcome: ask for the missing context, then return to the decision. Recording a result does not make the old account summary current. In the browser demo, these personal checks reset on reload and do not send reminders. A correction to the shared card has a separate approval path.&lt;/p&gt;

&lt;p&gt;We also do not know why the account review fell behind. Perhaps a source changed, perhaps a review was missed; the dates alone cannot tell us. A later private pilot would need enough history to investigate recurring gaps without guessing their cause. The &lt;a href="https://www.gov.uk/government/publications/the-government-data-quality-framework/the-government-data-quality-framework-guidance" rel="noopener noreferrer"&gt;Government Data Quality Framework&lt;/a&gt; is a useful reference for tracking quality issues over time and addressing their causes. That is guidance for the research, not a claim that the demo diagnoses them automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  When would another connection earn its place?
&lt;/h2&gt;

&lt;p&gt;Now the integration question is easier to answer. &lt;strong&gt;What missing fact would the connection supply, or where would it help someone use the answer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a sales follow-up, a connection to the customer system could supply an agreed next step and its date. For a campaign, a document connection could supply approved evidence for a message. A chat interface could bring the cited answer to a place where the team already works. These are examples to test, not live connections shipped by the demo.&lt;/p&gt;

&lt;p&gt;I would start with one decision and one narrow connection. First read the needed information. If anything should change in the shared record, propose the exact change for review. Access rules still apply, and the original source remains available to check.&lt;/p&gt;

&lt;p&gt;If the only benefit is “we can search more material,” I would first ask whether the team's existing search tools already do enough. A connection also brings work: permissions, failed updates, source checks and maintenance. That effort belongs in the evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five lessons I am taking forward
&lt;/h2&gt;

&lt;p&gt;Across the series, the idea has become more concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep account understanding connected.&lt;/strong&gt; People should be able to follow an account, a conversation and the evidence behind a conclusion without rebuilding the story each time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate access from relevance.&lt;/strong&gt; A role defines what someone may see; their task defines which of those facts help them decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep dates and gaps visible.&lt;/strong&gt; Old information can matter. Missing information should lead to a check, not a confident guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make corrections traceable.&lt;/strong&gt; Preserve original evidence, review changes, and record the result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect tools for a reason.&lt;/strong&gt; Supply a needed fact or bring an answer to the person who needs it. Count the ongoing effort as well as the benefit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The demo shows how these steps can work together with invented data. It does not yet show that a real team will make better decisions or spend less time searching.&lt;/p&gt;

&lt;p&gt;My next useful test would be one repeated decision alongside the team's current process: did the answer change the next step for a defensible reason? Did someone catch a missing fact before acting? Was the effort of checking and keeping the knowledge current worth it?&lt;/p&gt;

&lt;p&gt;That is where I want the research to go. I hope to automate some of the work of finding and checking context, while leaving more space for the part that needs a person's judgment. The next version should follow what people find useful—even if that means a simpler tool is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it or follow the series
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://knowledge-workbench-seven.vercel.app/" rel="noopener noreferrer"&gt;Open the synthetic demo&lt;/a&gt;. Choose Atlas Foods, open “Check account context,” and inspect a source. Then ask: what would I need to know before taking the next step?&lt;/p&gt;

&lt;p&gt;If you want to explore the implementation, the &lt;a href="https://github.com/artemrudenko/SalesWiki-public/blob/main/docs/QUICKSTART.en.md" rel="noopener noreferrer"&gt;public repository and local setup guide&lt;/a&gt; are available. The demo is a research prototype; real customer use needs a separate private setup with real identity, access and review controls.&lt;/p&gt;

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

&lt;p&gt;This five-part series explores how shared sales and marketing context can support decisions people can check.&lt;/p&gt;

&lt;ol&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;What should a sales knowledge base help someone decide?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;What must change before a sales demo uses real data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc"&gt;When does an integration help a sales decision?&lt;/a&gt; — this part&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;Part 4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which missing detail most often makes you stop and check before a customer conversation?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>What must change before a sales demo uses real data? — SalesWiki, Part 4 of 5</title>
      <dc:creator>Artsiom Rudzenka</dc:creator>
      <pubDate>Wed, 07 Oct 2026 11:02:21 +0000</pubDate>
      <link>https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo</link>
      <guid>https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo</guid>
      <description>&lt;p&gt;The public demo uses invented accounts. You can trace an answer to its sources and see how a correction enters review.&lt;/p&gt;

&lt;p&gt;If you are responsible for sales or marketing operations, the practical question is what it would take to test one real decision without exposing customer data or mistaking a convincing demo for proof that it helps.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;Part 3&lt;/a&gt;, I chose one repeated decision to test: which account needs attention today, and why? This article looks at how to run the synthetic demo, where real data belongs, and what a private pilot would need to prove. The demo itself does not show that the workflow helps a real team.&lt;/p&gt;

&lt;p&gt;The boundary is simple: the public repository holds the platform, its demo holds synthetic cards, and real customer data belongs in a separate private vault.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contour&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Data rule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;Public SalesWiki repository&lt;/td&gt;
&lt;td&gt;Code, schemas, synthetic examples and setup guides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demo&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;demo/&lt;/code&gt; inside the repository&lt;/td&gt;
&lt;td&gt;Synthetic cards only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot&lt;/td&gt;
&lt;td&gt;A separate private vault outside the repository&lt;/td&gt;
&lt;td&gt;Real accounts, deals, contacts and transcripts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The public repository supports a browser preview and a local synthetic service. A shared service with real customer data would need further work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect the synthetic demo
&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; is the quickest way to see the synthetic workflow. Select &lt;strong&gt;Tour&lt;/strong&gt; in the top bar. Its eight-step quick tour takes about two minutes: it checks dated evidence when a signal is stale, shows how roles get different views of shared evidence, and follows an answer to its sources. It also opens a personal context check: take the check, compare the sources and record what would change your next decision. The tour itself saves nothing. A cause remains unknown unless the available evidence supports an assessment.&lt;/p&gt;

&lt;p&gt;For example, the Atlas Foods summary is older than two of its sources. In the demo, you can take that check yourself, record &lt;strong&gt;Update needed&lt;/strong&gt;, link the source you checked and choose &lt;strong&gt;Propose a card update&lt;/strong&gt; as the next step. Recording the result does not refresh the card or approve the proposed change.&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%2F5r29yik6iw4iw4g1hsio.jpg" 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%2F5r29yik6iw4iw4g1hsio.jpg" alt="A synthetic Atlas Foods context check records its reviewer, result, source date and next action" width="620" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Synthetic example: the check result and next action are recorded separately from the account's stored freshness.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the hosted browser demo, these personal checks stay in the current tab and reset on reload. The local service keeps them in a separate runtime journal. Each person sees only their own checks, including people using reviewer roles.&lt;/p&gt;

&lt;p&gt;To run the demo locally, clone the &lt;a href="https://github.com/artemrudenko/SalesWiki-public" rel="noopener noreferrer"&gt;public repository&lt;/a&gt; and follow the &lt;a href="https://github.com/artemrudenko/SalesWiki-public/blob/main/docs/QUICKSTART.en.md" rel="noopener noreferrer"&gt;quick start&lt;/a&gt;. It gives separate commands for the browser preview and the local permissioned service. This verifies the synthetic setup; it does not show whether the workflow helps a real team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the data boundary in place
&lt;/h2&gt;

&lt;p&gt;The local demo service refuses a vault that is not marked synthetic. Changing an environment variable is not enough to turn it into a real-data service. A private pilot needs a separate vault and verified identity before anyone can retrieve customer information. Keep that vault outside the public repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start a private pilot carefully
&lt;/h2&gt;

&lt;p&gt;Do not copy real customer records or call transcripts into this repository. Create a separate access-controlled vault with no public remote. Keep personal-data bodies out of Git. Use external restricted references where needed.&lt;/p&gt;

&lt;p&gt;The smallest useful pilot tests one repeated decision. A possible sales question is: which lead needs a follow-up today, and why? Part 3 used a related account-follow-up question. Choose one exact decision and keep it fixed. This is a test plan, not evidence that a real team has validated the workflow. A later marketing pilot can use the same method once its decision and success criteria are clear.&lt;/p&gt;

&lt;p&gt;A useful pilot should prove more than document retrieval. Continue only if real work validates all four points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The cited answer helps people make the chosen decision with less searching than their current workflow.&lt;/li&gt;
&lt;li&gt;At least one correction is clearer or safer after a proposal, review and controlled update.&lt;/li&gt;
&lt;li&gt;Keeping the data and access rules under the team's control solves a real need.&lt;/li&gt;
&lt;li&gt;Users can explain why they chose the action and what evidence would change it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the pilot mainly proves that people want document search or summarization, an existing product may be the cheaper answer.&lt;/p&gt;

&lt;p&gt;Before the first real account enters the pilot, write down the test plan: the decision, the allowed evidence, the current workflow, and what would make the team stop or change direction. Count an answer without a source, restricted information reaching the wrong person, or an action the user cannot explain as a failed case. Do not change the allowed sources, access rules and answer format all at once; otherwise the team will not know what caused an improvement or a failure.&lt;/p&gt;

&lt;p&gt;The personal journal is a starting point for recording what happens when a fact needs review. A stale flag tells us that a review window passed; by itself, it does not tell us whether a source changed, a sync failed, or no one owned the task. In the private pilot log, I would note when the check was due, noticed, assigned and resolved; the review result; the likely cause (or &lt;code&gt;unknown&lt;/code&gt;); and whether it could have changed the decision. The demo already records the reviewer, result, source-record dates and next step. Historical due and detection times still need to be recorded when known; starting a check today does not recover them. I would keep customer text and contact details out of that log, using only a private record handle and a restricted source link.&lt;/p&gt;

&lt;p&gt;That distinction follows public data-quality guidance: assess quality against the intended use, track recurring issues, and investigate causes before choosing a fix. The &lt;a href="https://www.gov.uk/government/publications/the-government-data-quality-framework/the-government-data-quality-framework-guidance" rel="noopener noreferrer"&gt;Government Data Quality Framework&lt;/a&gt; describes that loop, and its &lt;a href="https://www.gov.uk/government/publications/implement-a-data-quality-action-plan/data-quality-issues-framework" rel="noopener noreferrer"&gt;issues framework&lt;/a&gt; puts impact and priority into the response. This is a method for the pilot to test; it is not a claim that SalesWiki currently diagnoses stale records.&lt;/p&gt;

&lt;p&gt;For an early pilot, I would use the roles and team boundaries already in place. The person who takes a check owns its next step. Later, someone responsible for sales operations or knowledge quality could review process patterns within their existing access, and department leads could see scoped summaries. Those shared views are not implemented in the demo. I would not add a separate audit role until a multi-user pilot shows a need for independent review. If that need appears, the role should be read-only and show review-event details, not customer records.&lt;/p&gt;

&lt;h2&gt;
  
  
  What production deployment still needs
&lt;/h2&gt;

&lt;p&gt;Before shared production use, add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a sign-in system that verifies the user on every request;&lt;/li&gt;
&lt;li&gt;securely stored connector credentials with limited access;&lt;/li&gt;
&lt;li&gt;backup and restore drills;&lt;/li&gt;
&lt;li&gt;operational logs, monitoring and limits on request volume;&lt;/li&gt;
&lt;li&gt;incident response;&lt;/li&gt;
&lt;li&gt;external storage that can delete personal data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The public local service demonstrates a separate worker applying approved proposals. A production setup still needs controlled filesystem access to the private vault, protected runtime storage and verified user identity. Packaging the service in a container would not provide those controls by itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical evaluation checklist
&lt;/h2&gt;

&lt;p&gt;After trying the demo, you should be able to answer these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a person trace the answer to a dated source and see what is missing?&lt;/li&gt;
&lt;li&gt;Do people see only the information allowed for their role and task?&lt;/li&gt;
&lt;li&gt;Does missing or conflicting evidence lead to a check instead of a guess?&lt;/li&gt;
&lt;li&gt;Does a correction wait for review before the card changes?&lt;/li&gt;
&lt;li&gt;Can the team tell whether an old fact came from a changed source, a missed sync, an unowned check, or an unknown cause?&lt;/li&gt;
&lt;li&gt;Will real pilot data stay outside the public repository?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those properties match your requirements, clone the &lt;a href="https://github.com/artemrudenko/SalesWiki-public" rel="noopener noreferrer"&gt;SalesWiki repository&lt;/a&gt; and run the demo. Then choose one repeated sales or marketing decision and compare the cited workflow with the way the team handles it today. That comparison, including where SalesWiki gets in the way, is the evidence the next version needs.&lt;/p&gt;

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

&lt;p&gt;This five-part series explores how shared sales and marketing context can support decisions people can check.&lt;/p&gt;

&lt;ol&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;What should a sales knowledge base help someone decide?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;What must change before a sales demo uses real data?&lt;/a&gt; — this part&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc"&gt;When does an integration help a sales decision?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;Part 3&lt;/a&gt; · &lt;strong&gt;Next:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc"&gt;Part 5&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>mcp</category>
      <category>ai</category>
      <category>privacy</category>
    </item>
    <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;An old note should trigger a check, not quietly lower an account's priority. If the same stale facts keep appearing, the pilot should also ask where the review loop failed. Part 4 describes a small way to record that history without copying customer details into a public project.&lt;/p&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 also shows how to treat a stale signal: check the dated evidence before acting or deprioritizing. You can now take a personal context check and record its result, sources and next step. That gives the check an owner; it does not explain an earlier missed review or automatically make the account current. The cause stays unknown unless evidence supports an assessment.&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;This five-part series explores how shared sales and marketing context can support decisions people can check.&lt;/p&gt;

&lt;ol&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;What should a sales knowledge base help someone decide?&lt;/a&gt; — this part&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;What must change before a sales demo uses real data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc"&gt;When does an integration help a sales decision?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;Part 2&lt;/a&gt; · &lt;strong&gt;Next:&lt;/strong&gt; &lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;Part 4&lt;/a&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;In the synthetic demo, 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;This five-part series explores how shared sales and marketing context can support decisions people can check.&lt;/p&gt;

&lt;ol&gt;
&lt;li&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;/li&gt;
&lt;li&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; — this part&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;What should a sales knowledge base help someone decide?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;What must change before a sales demo uses real data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc"&gt;When does an integration help a sales decision?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;Part 1&lt;/a&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-saleswiki-part-3-of-5-pb0"&gt;Part 3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The implementation and focused tests 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 full knowledge-vault model separates five areas of work. The public starter ships the implementation and synthetic examples; it does not include the team's source material or operating history.&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%2Fbwvkbycok8tm0uuklzb4.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%2Fbwvkbycok8tm0uuklzb4.gif" alt="A synthetic Atlas Foods context check: inspect a dated source, record the result and prepare a separate update proposal" width="799" height="450"&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. 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 eight-step quick tour in the &lt;a href="https://knowledge-workbench-seven.vercel.app/" rel="noopener noreferrer"&gt;Knowledge Workbench&lt;/a&gt; takes about two minutes. It starts with a role-specific priority, opens the account context and follows the evidence to a possible next step. The accounts are synthetic, and the tour does not change a card. You can also record your own context check: what you found, the sources you checked, and the next step. That record stays separate from a proposed change to shared knowledge.&lt;/p&gt;

&lt;p&gt;The five-part series follows the questions in order: how can one shared account serve different roles safely; which repeated decision is worth testing; what must change before a demo can use real data; and when does an integration help that decision? The demo shows a workflow to inspect, not proof that it already helps a real team.&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. 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, focused tests and configuration examples. 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;This five-part series explores how shared sales and marketing context can support decisions people can check.&lt;/p&gt;

&lt;ol&gt;
&lt;li&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; — this part&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-should-a-sales-knowledge-base-help-someone-decide-saleswiki-part-3-of-5-pb0"&gt;What should a sales knowledge base help someone decide?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/what-must-change-before-a-sales-demo-uses-real-data-saleswiki-part-4-of-5-26fo"&gt;What must change before a sales demo uses real data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/artemr_rudenko_0bf2c2c505/when-does-an-integration-help-a-sales-decision-saleswiki-part-5-of-5-omc"&gt;When does an integration help a sales decision?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Next:&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;Part 2&lt;/a&gt;&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>
