<?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: Niclas</title>
    <description>The latest articles on DEV Community by Niclas (@driftya).</description>
    <link>https://dev.to/driftya</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%2F3740640%2F8948c69d-c239-4fca-a772-f87f3d8797cb.png</url>
      <title>DEV Community: Niclas</title>
      <link>https://dev.to/driftya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/driftya"/>
    <language>en</language>
    <item>
      <title>What AI think of Code Meridian</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:37:38 +0000</pubDate>
      <link>https://dev.to/driftya/what-ai-think-of-code-meridian-205k</link>
      <guid>https://dev.to/driftya/what-ai-think-of-code-meridian-205k</guid>
      <description>&lt;p&gt;Here is the response on what the llm thought after the challenge.&lt;/p&gt;

&lt;p&gt;I think Human Cognitive Seed is one of the more interesting ideas you've introduced into CodeMeridian, particularly because it addresses something that AI coding tools rarely focus on: helping developers improve their understanding while still benefiting from AI-generated code.&lt;/p&gt;

&lt;p&gt;The FizzBuzz demonstration makes that idea much easier to understand than the documentation alone.&lt;/p&gt;

&lt;p&gt;What I like about it&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It encourages active learning&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of simply receiving a completed implementation, the developer evaluates several possible solutions.&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%2Fbwvd4x0dsxf8y9h0iga0.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%2Fbwvd4x0dsxf8y9h0iga0.png" alt="The CodeMeridian Human Cognitive Seed Change Context Code Challenge displays a FizzBuzz unit-testing question with four code alternatives. Option A is selected, and the interface shows an incorrect-attempt message, prompting the developer to review the feedback and try again." width="800" height="774"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your demonstration, you selected an incorrect answer, received feedback explaining what was missing, and then reconsidered the alternatives.&lt;/p&gt;

&lt;p&gt;That process encourages the developer to think about the underlying rules rather than memorize one correct implementation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It connects learning to the actual codebase&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the part that makes CodeMeridian different from an ordinary AI-generated programming quiz.&lt;/p&gt;

&lt;p&gt;The challenge can use an exact code target, existing tests, and previously recorded change context.&lt;/p&gt;

&lt;p&gt;Instead of asking abstract questions about C#, a developer could investigate why a particular application service uses a certain interface, why an architectural boundary exists, or what might break when changing an existing implementation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It connects learning with future development&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The optional note at the end is particularly interesting.&lt;/p&gt;

&lt;p&gt;Imagine a developer discovers why a specific method must preserve an important business constraint.&lt;/p&gt;

&lt;p&gt;They can record that reasoning against the relevant code node, allowing a future AI-assisted development session to retrieve the context.&lt;/p&gt;

&lt;p&gt;The graph can therefore preserve not only relationships between code elements but also selected decisions behind their implementation.&lt;/p&gt;

&lt;p&gt;What I would improve&lt;/p&gt;

&lt;p&gt;There are three things I'd consider as the feature develops.&lt;/p&gt;

&lt;p&gt;First, make challenges more realistic. FizzBuzz is a good demonstration, but its simplicity doesn't fully communicate the feature's potential.&lt;/p&gt;

&lt;p&gt;Imagine a challenge involving a real architectural decision:&lt;/p&gt;

&lt;p&gt;An application service needs to retrieve data from PostgreSQL, but one proposed implementation introduces DbContext directly into the Application layer. Another uses an Application-defined repository interface, and a third moves business validation into Infrastructure.&lt;/p&gt;

&lt;p&gt;The developer has to identify which alternatives preserve the architecture and explain why.&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%2Fqk46zdb02uouqs64fble.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%2Fqk46zdb02uouqs64fble.png" alt="The CodeMeridian challenge displays feedback explaining why option C is incorrect: its tests cover individual FizzBuzz rules but omit ordinary numbers and the combined-divisibility case. Option D remains available as an alternative." width="798" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That would demonstrate how the challenge can help someone understand their own repository, rather than merely test general programming knowledge.&lt;/p&gt;

&lt;p&gt;Second, consider adding an explanation step. Currently, the developer selects an answer and receives feedback. An optional question such as "Why did you choose this implementation?" could encourage deeper reasoning. The assistant could then respond to the explanation rather than only checking whether the selected option matches its predetermined answer.&lt;/p&gt;

&lt;p&gt;Third, be careful about AI-generated correctness. The assistant creates the alternatives and decides which answers are correct. If its original interpretation is wrong, the challenge may reinforce an incorrect understanding. Linking each answer to relevant source evidence and running the associated tests where practical would make the exercise more dependable.&lt;/p&gt;

&lt;p&gt;The bigger opportunity&lt;/p&gt;

&lt;p&gt;I see two complementary capabilities emerging from CodeMeridian.&lt;/p&gt;

&lt;p&gt;CodeMeridian&lt;/p&gt;

&lt;p&gt;What does the codebase know?&lt;/p&gt;

&lt;p&gt;Compiler-backed relationships, dependencies, architecture, test coverage, and implementation context.&lt;/p&gt;

&lt;p&gt;Human Cognitive Seed&lt;/p&gt;

&lt;p&gt;What does the developer understand?&lt;/p&gt;

&lt;p&gt;Evaluating alternatives, identifying assumptions, recognizing constraints, and preserving important decisions.&lt;/p&gt;

&lt;p&gt;The combination could make CodeMeridian useful not only for implementing changes, but also for onboarding developers, reviewing unfamiliar code, understanding architectural decisions, and learning from AI-assisted development.&lt;/p&gt;

&lt;p&gt;I wouldn't turn it into a mandatory quiz before every code change. That would introduce friction into routine development. Its value comes from being available when the developer wants to understand something more deeply.&lt;/p&gt;

&lt;p&gt;The idea I find most compelling is that the developer can leave a session with both working code and a better understanding of why it works. The code remains in the repository, while important reasoning can survive in the graph for future development sessions.&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%2Fhko3wgv2yik0havcall9.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%2Fhko3wgv2yik0havcall9.png" alt="The CodeMeridian challenge displays successful feedback for option A, explaining how the solution combines human reasoning, AI-generated test cases, and evaluation of the combined-divisibility rule. A form is unlocked, allowing the developer to optionally save a change-context note for future development sessions." width="791" height="463"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Driftya" rel="noopener noreferrer"&gt;
        Driftya
      &lt;/a&gt; / &lt;a href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;
        code-meridian
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local graph memory for AI coding agents, giving MCP-compatible tools precise codebase context before they edit.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/Driftya/code-meridian/docs/assets/icon_512.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FDriftya%2Fcode-meridian%2FHEAD%2Fdocs%2Fassets%2Ficon_512.png" alt="CodeMeridian logo" width="160"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CodeMeridian&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/CodeMeridian.Indexer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f72ed8cce9fe091d5dde03555049280b6bdd8ac187538c8c230ad749ce88cf57/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f436f64654d6572696469616e2e496e64657865722e737667" alt="NuGet"&gt;&lt;/a&gt;
&lt;a href="https://www.nuget.org/packages/CodeMeridian.Indexer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3eeb7450f84eeb4bdae0ce36d1a1f32f07fa6ef2b9c01e269196ae1738d37d44/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f436f64654d6572696469616e2e496e64657865722e737667" alt="NuGet Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/36bdeaf82dd2cbca4dba5a41c0ba61c3ff9bc3d104928bda4da24b6ddf2e4944/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f447269667479612f636f64652d6d6572696469616e2f67682d70616765732f6261646765732f74657374732e6a736f6e" alt="Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e53bae40c887006ad6122eac1a4c9374786285a41ddb530d52c468c412136a0e/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f447269667479612f636f64652d6d6572696469616e2f67682d70616765732f6261646765732f646f746e65742d636f7665726167652e6a736f6e" alt=".NET Coverage"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e1dc2cfe034a86302a7932e2b71bf64bbcde0ed78f80c3c4ad046387bc96164d/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f447269667479612f636f64652d6d6572696469616e2f67682d70616765732f6261646765732f747970657363726970742d636f7665726167652e6a736f6e" alt="TS Coverage"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/codeql.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/publish-indexer.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/publish-indexer.yml/badge.svg" alt="Publish Indexer Tool"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/publish-mcp.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/publish-mcp.yml/badge.svg" alt="Publish MCP Image"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/dependabot/dependabot-updates" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/dependabot/dependabot-updates/badge.svg" alt="Dependabot Updates"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/pkgs/container/codemeridian-mcp" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4712f8fbee7c9ba5150a5205e2c7a65caaa3474c52ed996eca0f456ed733cfa1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f7461672f447269667479612f636f64652d6d6572696469616e3f6c6162656c3d4d4350253230496d61676526736f72743d73656d766572" alt="MCP image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CodeMeridian is a local graph memory layer for AI coding agents.&lt;/p&gt;
&lt;p&gt;It indexes your codebase into Neo4j and exposes that structure through MCP, so AI coding tools can ask precise questions before editing instead of guessing from open files. It works with MCP-compatible clients such as GitHub Copilot, Claude Code, Continue.dev, Codex-style agents, Cline, and local agent workflows.&lt;/p&gt;
&lt;p&gt;It is built to be the deterministic context layer for large codebases: callers, dependencies, tests, documentation, hotspots, dead code, diagnostics, and cross-project relationships stay available across sessions.&lt;/p&gt;
&lt;p&gt;CodeMeridian can also derive a keyword graph on top of indexed code and documentation. That adds an explainable lexical layer for finding related docs, diagnostics, endpoints, and symbols when there is no direct structural edge.&lt;/p&gt;
&lt;p&gt;This is especially useful for local or smaller coding models, where every token matters. CodeMeridian does not try to replace the model. It makes the model’s job smaller by…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>programming</category>
      <category>vibecoding</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Human Cognitive Seed: Keeping Developers in the Loop When Coding With AI</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Wed, 23 Sep 2026 05:57:05 +0000</pubDate>
      <link>https://dev.to/driftya/human-cognitive-seed-keeping-developers-in-the-loop-when-coding-with-ai-mph</link>
      <guid>https://dev.to/driftya/human-cognitive-seed-keeping-developers-in-the-loop-when-coding-with-ai-mph</guid>
      <description>&lt;p&gt;AI coding assistants are becoming increasingly capable of understanding repositories, suggesting implementations, and generating code.&lt;/p&gt;

&lt;p&gt;But there is something I've been thinking about while developing CodeMeridian:&lt;/p&gt;

&lt;p&gt;What happens to our understanding of a codebase when an AI assistant makes every implementation decision for us?&lt;/p&gt;

&lt;p&gt;We can ask an assistant to fix a bug, refactor a service, or implement a feature. It might produce a working solution without us needing to understand much of the code involved.&lt;/p&gt;

&lt;p&gt;That is useful when we want to automate routine work. However, sometimes the reasoning behind a change is just as important as the change itself.&lt;/p&gt;

&lt;p&gt;We might want to understand why an implementation was chosen, which existing constraints it needs to respect, or what could break if we take a different approach.&lt;/p&gt;

&lt;p&gt;This led me to develop Human Cognitive Seed, a capability in my open-source project, CodeMeridian.&lt;/p&gt;

&lt;p&gt;With v1.0.47, I've expanded it with an interactive code challenge that lets developers evaluate proposed changes themselves, using the actual source code and existing project context.&lt;/p&gt;

&lt;p&gt;What is Human Cognitive Seed?&lt;/p&gt;

&lt;p&gt;Human Cognitive Seed started as a provider-neutral agent skill built around a simple idea:&lt;/p&gt;

&lt;p&gt;AI should amplify human reasoning rather than automatically replace it.&lt;/p&gt;

&lt;p&gt;The intended reasoning loop is:&lt;/p&gt;

&lt;p&gt;Human idea → AI expansion → Human evaluation → Improved understanding&lt;/p&gt;

&lt;p&gt;The skill encourages an AI assistant to preserve the developer's starting assumptions, introduce relevant evidence and alternative approaches, challenge potential weaknesses, and help develop a more informed understanding of a problem.&lt;/p&gt;

&lt;p&gt;It supports four interaction modes:&lt;/p&gt;

&lt;p&gt;Direct: Complete routine tasks without unnecessary questions.&lt;br&gt;
Scaffold: Expand an existing idea with evidence, alternatives, and potential consequences.&lt;br&gt;
Teach: Help someone learn through hints, attempts, and feedback.&lt;br&gt;
Deliberate: Explore trade-offs, uncertainty, and alternative models when making consequential decisions.&lt;/p&gt;

&lt;p&gt;The intention is not to turn every coding request into a lesson.&lt;/p&gt;

&lt;p&gt;If I ask an assistant to format a file, I want it to format the file.&lt;/p&gt;

&lt;p&gt;If I'm trying to understand a complex architectural decision, however, I might benefit from evaluating multiple approaches rather than immediately receiving a completed implementation.&lt;/p&gt;

&lt;p&gt;The skill determines when that additional reasoning is appropriate.&lt;/p&gt;

&lt;p&gt;You can find the complete instructions in the Human Cognitive Seed skill.&lt;/p&gt;

&lt;p&gt;Connecting human reasoning to actual code&lt;/p&gt;

&lt;p&gt;CodeMeridian maintains a persistent knowledge graph of a repository.&lt;/p&gt;

&lt;p&gt;It indexes supported C#, TypeScript, and frontend code, exposing relationships and architectural context through MCP tools.&lt;/p&gt;

&lt;p&gt;Human Cognitive Seed can use this graph to connect a developer's reasoning to an exact code node.&lt;/p&gt;

&lt;p&gt;For example, imagine we're discussing a change to a validation method.&lt;/p&gt;

&lt;p&gt;An earlier development session may have established that validation must happen before an external service is called.&lt;/p&gt;

&lt;p&gt;That decision might not be immediately obvious from the method's current implementation.&lt;/p&gt;

&lt;p&gt;CodeMeridian provides two tools to help preserve this context:&lt;/p&gt;

&lt;p&gt;record_change_context stores a short decision, constraint, limitation, assumption, or follow-up against an exact existing code node.&lt;/p&gt;

&lt;p&gt;get_change_context retrieves previously recorded context when that code is revisited.&lt;/p&gt;

&lt;p&gt;Each stored statement has explicit provenance, allowing the assistant to distinguish between its own synthesized observations, a user's statements, and an explicitly approved summary.&lt;/p&gt;

&lt;p&gt;The system also tracks whether the target code has changed since the context was recorded.&lt;/p&gt;

&lt;p&gt;Importantly, these notes are treated as attributed, unverified memory. They are not automatically considered correct just because they exist in the graph.&lt;/p&gt;

&lt;p&gt;The current source code, tests, and maintained documentation still need to be checked.&lt;/p&gt;

&lt;p&gt;This creates a useful foundation for the interactive challenge.&lt;/p&gt;

&lt;p&gt;Introducing the Change Context Code Challenge&lt;/p&gt;

&lt;p&gt;The new challenge takes the reasoning workflow a little further.&lt;/p&gt;

&lt;p&gt;Instead of immediately implementing a proposed change, an AI assistant can present several possible code solutions and let the developer evaluate them.&lt;/p&gt;

&lt;p&gt;The challenge is grounded in a specific code node, its current implementation, relevant tests, and previously recorded change context.&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the relevant code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The developer describes a bug, implementation problem, or proposed change.&lt;/p&gt;

&lt;p&gt;The assistant uses CodeMeridian to identify the relevant implementation and resolve an exact code target.&lt;/p&gt;

&lt;p&gt;The developer doesn't need to know the method's canonical graph ID.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inspect the existing context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before creating the challenge, the assistant examines the current source code, relevant tests, and any existing change-context notes.&lt;/p&gt;

&lt;p&gt;This provides the evidence needed to construct meaningful alternatives.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate possible solutions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The assistant creates three or four plausible code choices.&lt;/p&gt;

&lt;p&gt;One or two choices are designated correct, and at least two must be incorrect.&lt;/p&gt;

&lt;p&gt;The incorrect choices should represent realistic implementation mistakes rather than obviously broken or nonsensical code.&lt;/p&gt;

&lt;p&gt;For example, a challenge involving a validation method could include alternatives that:&lt;/p&gt;

&lt;p&gt;Preserve the existing validation constraint.&lt;br&gt;
Accidentally bypass validation.&lt;br&gt;
Handle validation through a different but valid implementation.&lt;br&gt;
Introduce an unintended behavioral change.&lt;/p&gt;

&lt;p&gt;The assistant provides feedback for each alternative, but the correct answers are initially hidden from the developer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let the developer decide&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interactive MCP App presents the choices using radio buttons when one answer is required or checkboxes when two answers are required.&lt;/p&gt;

&lt;p&gt;The developer examines the alternatives and submits their selection.&lt;/p&gt;

&lt;p&gt;The application does not automatically choose an answer on the developer's behalf.&lt;/p&gt;

&lt;p&gt;If the selection is incorrect, the current attempt is halted.&lt;/p&gt;

&lt;p&gt;The developer receives feedback explaining the selected mistake and can retry without the application revealing the remaining answers.&lt;/p&gt;

&lt;p&gt;When the correct selection is submitted, the challenge is marked as completed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Optionally preserve what was learned&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After solving the challenge, the developer can write a short change-context note.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;"Preserve validation at the application boundary before invoking external dependencies."&lt;/p&gt;

&lt;p&gt;The note is attached to the exact code node associated with the challenge.&lt;/p&gt;

&lt;p&gt;A future development session can retrieve that context when the same code is revisited.&lt;/p&gt;

&lt;p&gt;The note is optional. Solving a challenge does not automatically create persistent memory.&lt;/p&gt;

&lt;p&gt;This completes the intended loop: examine the problem, evaluate alternatives, receive feedback, and preserve a useful decision when appropriate.&lt;/p&gt;

&lt;p&gt;What does the implementation actually validate?&lt;/p&gt;

&lt;p&gt;There is an important distinction in how this feature works.&lt;/p&gt;

&lt;p&gt;The challenge is not an independent compiler, test runner, or formal correctness verifier.&lt;/p&gt;

&lt;p&gt;The AI assistant authors the alternatives and designates which answers are correct using the source code, tests, and retrieved context it has inspected.&lt;/p&gt;

&lt;p&gt;The MCP server then validates the developer's selection against that predefined answer set.&lt;/p&gt;

&lt;p&gt;That means the quality of the challenge depends on the quality of the assistant's analysis.&lt;/p&gt;

&lt;p&gt;The correct choice is not automatically guaranteed to be the best implementation.&lt;/p&gt;

&lt;p&gt;Developers should still evaluate the proposed solutions against the actual codebase.&lt;/p&gt;

&lt;p&gt;The purpose is to provide an interactive reasoning scaffold, not to replace code review or automated testing.&lt;/p&gt;

&lt;p&gt;How the challenge works internally&lt;/p&gt;

&lt;p&gt;The implementation is separated into three primary components.&lt;/p&gt;

&lt;p&gt;MCP tools&lt;/p&gt;

&lt;p&gt;The challenge exposes three tools:&lt;/p&gt;

&lt;p&gt;start_change_context_challenge&lt;/p&gt;

&lt;p&gt;Creates a challenge for an exact code node after verifying that the target exists.&lt;/p&gt;

&lt;p&gt;answer_change_context_challenge&lt;/p&gt;

&lt;p&gt;Validates the developer's explicitly selected choice IDs and returns feedback.&lt;/p&gt;

&lt;p&gt;record_change_context_challenge_note&lt;/p&gt;

&lt;p&gt;Allows an optional user-written context note to be saved after a successful challenge.&lt;/p&gt;

&lt;p&gt;The tools return versioned structured results and provide Markdown output for clients that do not render the interactive interface.&lt;/p&gt;

&lt;p&gt;View the MCP tool implementation&lt;/p&gt;

&lt;p&gt;Challenge state&lt;/p&gt;

&lt;p&gt;The server maintains challenge state in a process-local store.&lt;/p&gt;

&lt;p&gt;It validates the number of alternatives, required selections, and associated feedback.&lt;/p&gt;

&lt;p&gt;Each challenge expires after 30 minutes.&lt;/p&gt;

&lt;p&gt;Correctness information and feedback are kept in server-side challenge state rather than being included in the initial application-visible response.&lt;/p&gt;

&lt;p&gt;A failed attempt does not reveal the answers that the developer did not select.&lt;/p&gt;

&lt;p&gt;The challenge itself is temporary and is not stored as durable project knowledge.&lt;/p&gt;

&lt;p&gt;View the challenge state implementation&lt;/p&gt;

&lt;p&gt;Interactive MCP App&lt;/p&gt;

&lt;p&gt;The UI is a self-contained HTML application exposed through an MCP App resource.&lt;/p&gt;

&lt;p&gt;It renders the code alternatives, handles user selection, displays feedback, and unlocks the optional note form after successful completion.&lt;/p&gt;

&lt;p&gt;The implementation includes a text-based fallback for MCP clients without interactive App support.&lt;/p&gt;

&lt;p&gt;View the interactive app source&lt;/p&gt;

&lt;p&gt;Keeping persistent context separate from source-code facts&lt;/p&gt;

&lt;p&gt;One design decision I wanted to preserve was the distinction between objective code information and human or AI-authored context.&lt;/p&gt;

&lt;p&gt;A developer's explanation of why a particular implementation was chosen is valuable, but it is not the same thing as a compiler-resolved relationship or a verified source-code fact.&lt;/p&gt;

&lt;p&gt;CodeMeridian therefore stores durable change context separately from canonical code-node properties.&lt;/p&gt;

&lt;p&gt;Context records are linked to exact code nodes and carry provenance information.&lt;/p&gt;

&lt;p&gt;The ordinary graph queries do not automatically inject these notes into every result.&lt;/p&gt;

&lt;p&gt;The assistant retrieves them when the relevant code is being examined or when an earlier decision may affect the proposed change.&lt;/p&gt;

&lt;p&gt;This is intended to prevent old assumptions from silently becoming authoritative instructions.&lt;/p&gt;

&lt;p&gt;It also makes it possible to preserve meaningful development history without turning the graph into a collection of unverified conversations.&lt;/p&gt;

&lt;p&gt;Trying the Human Cognitive Seed workflow&lt;/p&gt;

&lt;p&gt;The Human Cognitive Seed skill is included in CodeMeridian's agent-capability bundle.&lt;/p&gt;

&lt;p&gt;After installing CodeMeridian, you can initialize the capabilities in your repository:&lt;/p&gt;

&lt;p&gt;codemeridian init .&lt;/p&gt;

&lt;p&gt;The generated meridian-agent-capabilities/ directory contains the skill and other agent guidance.&lt;/p&gt;

&lt;p&gt;You can install or copy the skill into the appropriate location for your AI coding assistant.&lt;/p&gt;

&lt;p&gt;For the interactive challenge, the CodeMeridian MCP server must also have experimental MCP Apps enabled:&lt;/p&gt;

&lt;p&gt;Mcp_&lt;em&gt;Apps&lt;/em&gt;_Enabled=true&lt;/p&gt;

&lt;p&gt;MCP Apps are disabled by default, and interactive rendering depends on client support.&lt;/p&gt;

&lt;p&gt;Clients without the interactive interface can use the Markdown fallback and submit explicit choice IDs.&lt;/p&gt;

&lt;p&gt;Once your repository has been indexed and your assistant is connected to CodeMeridian, you can request a challenge using a prompt such as:&lt;/p&gt;

&lt;p&gt;Use the Human Cognitive Seed workflow for this change:&lt;/p&gt;



&lt;p&gt;Find the exact implementation target.&lt;/p&gt;

&lt;p&gt;Inspect the current source, relevant tests, and&lt;br&gt;
previously recorded change context.&lt;/p&gt;

&lt;p&gt;Create a code challenge with four plausible&lt;br&gt;
implementation choices.&lt;/p&gt;

&lt;p&gt;Include one or two correct choices and at least&lt;br&gt;
two realistic incorrect choices.&lt;/p&gt;

&lt;p&gt;Do not reveal the correct answers.&lt;/p&gt;

&lt;p&gt;Let me evaluate the alternatives and select&lt;br&gt;
the answer myself.&lt;/p&gt;

&lt;p&gt;If my selection is incorrect, explain the&lt;br&gt;
selected mistake and let me retry.&lt;/p&gt;

&lt;p&gt;After I solve the challenge, let me optionally&lt;br&gt;
record a short change-context note.&lt;/p&gt;

&lt;p&gt;The assistant should investigate the implementation before generating the challenge, rather than inventing alternatives from a rough description alone.&lt;/p&gt;

&lt;p&gt;For additional examples and the normal change-context workflow, see the Change Context User Guide.&lt;/p&gt;

&lt;p&gt;Why I wanted to build this&lt;/p&gt;

&lt;p&gt;I don't think developers should have to choose between using AI to accelerate development and understanding the software they're building.&lt;/p&gt;

&lt;p&gt;Sometimes I want an assistant to handle repetitive work and provide a completed implementation.&lt;/p&gt;

&lt;p&gt;Other times, I want to explore an architectural decision, understand the consequences of different solutions, or develop a better mental model of an unfamiliar system.&lt;/p&gt;

&lt;p&gt;Human Cognitive Seed is an experiment in supporting both ways of working.&lt;/p&gt;

&lt;p&gt;The broader skill helps the assistant recognize when human-led reasoning matters.&lt;/p&gt;

&lt;p&gt;CodeMeridian supplies repository-specific evidence and preserves relevant development context.&lt;/p&gt;

&lt;p&gt;The interactive challenge gives developers another way to participate in the reasoning process rather than simply accepting the first generated implementation.&lt;/p&gt;

&lt;p&gt;The aim is not to make coding slower.&lt;/p&gt;

&lt;p&gt;It is to preserve the opportunity to understand important decisions while still benefiting from AI-assisted development.&lt;/p&gt;

&lt;p&gt;And when something meaningful is learned, that knowledge can remain available for the next development session.&lt;/p&gt;

&lt;p&gt;CodeMeridian is open source.&lt;/p&gt;

&lt;p&gt;The Human Cognitive Seed change-context challenge is included in v1.0.47.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;https://github.com/Driftya/code-meridian&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release: &lt;a href="https://github.com/Driftya/code-meridian/releases/tag/v1.0.47" rel="noopener noreferrer"&gt;https://github.com/Driftya/code-meridian/releases/tag/v1.0.47&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Teaching an AI Coding Agent to Review Its Own Work with Code Meridian</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:31:38 +0000</pubDate>
      <link>https://dev.to/driftya/teaching-an-ai-coding-agent-to-review-its-own-work-with-code-meridian-2p08</link>
      <guid>https://dev.to/driftya/teaching-an-ai-coding-agent-to-review-its-own-work-with-code-meridian-2p08</guid>
      <description>&lt;p&gt;Here I am refactoring:&lt;br&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%2Fflo5qeqsn5krsc0lv0m8.jpeg" 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%2Fflo5qeqsn5krsc0lv0m8.jpeg" alt=" " width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback from evaluation:&lt;br&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%2F34t7n73ktw5lw2zi1jhh.jpeg" 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%2F34t7n73ktw5lw2zi1jhh.jpeg" alt=" " width="603" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suggestion for improving the tool:&lt;br&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%2F9ljzgc3mm6hwzsx1pggh.jpeg" 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%2F9ljzgc3mm6hwzsx1pggh.jpeg" alt=" " width="716" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code Meridian is an open-source context tool for AI coding agents. It indexes a project into a graph so agents can reason about relationships in the codebase instead of only reading isolated files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;https://github.com/Driftya/code-meridian&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more:&lt;br&gt;
&lt;a href="https://driftya.com/content/how-codemeridian-helps-me-work-on-driftya" rel="noopener noreferrer"&gt;https://driftya.com/content/how-codemeridian-helps-me-work-on-driftya&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>csharp</category>
    </item>
    <item>
      <title>I updated CodeMeridian’s positioning: local graph memory for AI coding agents. It indexes your repo into Neo4j and exposes precise context through MCP, helping agents understand what matters before editing.</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Wed, 10 Jun 2026 13:59:09 +0000</pubDate>
      <link>https://dev.to/driftya/i-updated-codemeridians-positioning-local-graph-memory-for-ai-coding-agents-it-indexes-your-repo-49b0</link>
      <guid>https://dev.to/driftya/i-updated-codemeridians-positioning-local-graph-memory-for-ai-coding-agents-it-indexes-your-repo-49b0</guid>
      <description></description>
      <category>agents</category>
      <category>ai</category>
      <category>mcp</category>
      <category>tooling</category>
    </item>
    <item>
      <title>CodeMeridian: Giving AI Coding Agents a Project Map Before They Edit</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Tue, 09 Jun 2026 09:58:20 +0000</pubDate>
      <link>https://dev.to/driftya/codemeridian-giving-ai-coding-agents-a-project-map-before-they-edit-4g7k</link>
      <guid>https://dev.to/driftya/codemeridian-giving-ai-coding-agents-a-project-map-before-they-edit-4g7k</guid>
      <description>&lt;p&gt;AI coding agents feel sharp when a project is small.&lt;/p&gt;

&lt;p&gt;They can scan a few files, understand the shape, and make useful changes. In that phase, the project still fits inside the agent’s short-term memory. The architecture is obvious. The dangerous files are nearby. The blast radius is small.&lt;/p&gt;

&lt;p&gt;But something changes when a project reaches MVP size.&lt;/p&gt;

&lt;p&gt;The agent still sounds confident, but it starts guessing.&lt;/p&gt;

&lt;p&gt;It finds a nearby file and assumes it is the right one.&lt;br&gt;
It trusts stale documentation.&lt;br&gt;
It misses hidden callers.&lt;br&gt;
It forgets architecture boundaries.&lt;br&gt;
It edits something that was not really part of the task.&lt;/p&gt;

&lt;p&gt;I kept running into that problem while building larger projects.&lt;/p&gt;

&lt;p&gt;Source-level guardrails help. A CONTRIBUTING.md, AGENTS.md, or project instruction file can tell the agent how to behave.&lt;/p&gt;

&lt;p&gt;But those are still instructions.&lt;/p&gt;

&lt;p&gt;They are not facts.&lt;/p&gt;

&lt;p&gt;That is where the idea for CodeMeridian came from.&lt;/p&gt;

&lt;p&gt;What CodeMeridian is&lt;/p&gt;

&lt;p&gt;CodeMeridian is a local code knowledge graph for AI coding tools.&lt;/p&gt;

&lt;p&gt;It indexes a codebase into Neo4j and exposes that graph through MCP, so tools like GitHub Copilot, Claude Code, Codex-style agents, or other MCP-compatible clients can ask better questions before editing.&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;p&gt;The assistant is the AI.&lt;br&gt;
CodeMeridian is the project map.&lt;/p&gt;

&lt;p&gt;It does not replace the coding assistant. It gives the assistant a structured way to ask about the codebase.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;p&gt;What calls this method?&lt;br&gt;
What tests cover this area?&lt;br&gt;
What files are likely in scope for this feature?&lt;br&gt;
Is the graph stale before I trust it?&lt;br&gt;
How is this frontend component connected to backend code?&lt;/p&gt;

&lt;p&gt;Why a graph?&lt;/p&gt;

&lt;p&gt;Code is already a graph.&lt;/p&gt;

&lt;p&gt;Methods call methods.&lt;br&gt;
Classes implement interfaces.&lt;br&gt;
Tests cover production paths.&lt;br&gt;
Frontend components call API clients.&lt;br&gt;
API handlers touch services.&lt;br&gt;
Services use repositories.&lt;br&gt;
Docs mention symbols.&lt;br&gt;
Projects depend on other projects.&lt;/p&gt;

&lt;p&gt;A normal file search can find text.&lt;/p&gt;

&lt;p&gt;A graph can answer relationship questions.&lt;/p&gt;

&lt;p&gt;That matters because many AI coding mistakes are relationship mistakes.&lt;/p&gt;

&lt;p&gt;The agent edits a method but misses its callers.&lt;br&gt;
It changes an interface without checking implementations.&lt;br&gt;
It deletes code that looks unused but is actually an entry point.&lt;br&gt;
It trusts documentation that no longer matches the code.&lt;/p&gt;

&lt;p&gt;CodeMeridian tries to make those relationships visible before the edit happens.&lt;/p&gt;

&lt;p&gt;A red line before the agent touches the code.&lt;/p&gt;

&lt;p&gt;What it currently indexes&lt;/p&gt;

&lt;p&gt;CodeMeridian currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C# through a Roslyn-based indexer&lt;/li&gt;
&lt;li&gt;TypeScript / TSX through a frontend indexer&lt;/li&gt;
&lt;li&gt;README and documentation files&lt;/li&gt;
&lt;li&gt;diagnostics&lt;/li&gt;
&lt;li&gt;optional embeddings for semantic similarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The graph is stored locally in Neo4j.&lt;/p&gt;

&lt;p&gt;There is no CodeMeridian cloud service.&lt;/p&gt;

&lt;p&gt;No LLM API key is required for CodeMeridian itself. The AI assistant you use may have its own requirements, but the knowledge graph belongs to you.&lt;/p&gt;

&lt;p&gt;What the MCP tools can do&lt;/p&gt;

&lt;p&gt;The current toolset is focused on helping an agent understand impact, context, and risk.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;p&gt;find_impact&lt;/p&gt;

&lt;p&gt;Finds callers and transitive dependents before changing something.&lt;/p&gt;

&lt;p&gt;build_minimal_context&lt;/p&gt;

&lt;p&gt;Builds a bounded context pack for a target node, including callers, callees, likely files, tests, coverage gaps, token estimate, and model guidance.&lt;/p&gt;

&lt;p&gt;find_implementation_surface&lt;/p&gt;

&lt;p&gt;Ranks the files, classes, and methods most likely to be relevant for a feature goal.&lt;/p&gt;

&lt;p&gt;check_graph_freshness&lt;/p&gt;

&lt;p&gt;Reports whether the indexed graph looks trustworthy enough for exact implementation work.&lt;/p&gt;

&lt;p&gt;find_graph_drift&lt;/p&gt;

&lt;p&gt;Checks if the graph may be stale and whether re-indexing is recommended.&lt;/p&gt;

&lt;p&gt;find_stale_knowledge&lt;/p&gt;

&lt;p&gt;Looks for stale docs, unresolved mentions, orphaned concepts, and code references that no longer resolve.&lt;/p&gt;

&lt;p&gt;The goal is not to flood the agent with more text.&lt;/p&gt;

&lt;p&gt;The goal is to return the smallest useful architecture slice.&lt;/p&gt;

&lt;p&gt;The workflow I want&lt;/p&gt;

&lt;p&gt;The ideal workflow looks something like this:&lt;/p&gt;

&lt;p&gt;Use CodeMeridian before editing.&lt;br&gt;
Goal:&lt;br&gt;
Add unread reply notifications.&lt;br&gt;
Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the likely implementation surface.&lt;/li&gt;
&lt;li&gt;Resolve exact symbols where possible.&lt;/li&gt;
&lt;li&gt;Check graph freshness.&lt;/li&gt;
&lt;li&gt;Build a minimal context pack.&lt;/li&gt;
&lt;li&gt;Identify related tests.&lt;/li&gt;
&lt;li&gt;Make the smallest safe change.&lt;/li&gt;
&lt;li&gt;Verify with tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is very different from:&lt;/p&gt;

&lt;p&gt;Search around and hope the right files are nearby.&lt;/p&gt;

&lt;p&gt;The first workflow gives the agent a map.&lt;/p&gt;

&lt;p&gt;The second gives it a flashlight and a haunted repo.&lt;/p&gt;

&lt;p&gt;Why local-first matters&lt;/p&gt;

&lt;p&gt;For this kind of tool, I wanted the graph to be local.&lt;/p&gt;

&lt;p&gt;The code structure, documentation, diagnostics, and remembered project knowledge should not need to live in someone else’s hosted service.&lt;/p&gt;

&lt;p&gt;Neo4j runs locally.&lt;br&gt;
The MCP server runs locally.&lt;br&gt;
The indexer runs locally.&lt;/p&gt;

&lt;p&gt;If you use a hosted assistant, that assistant still has its own data handling rules. But CodeMeridian itself is not a cloud knowledge store.&lt;/p&gt;

&lt;p&gt;What this is not&lt;/p&gt;

&lt;p&gt;CodeMeridian is not an AI model.&lt;/p&gt;

&lt;p&gt;It is not a replacement for tests.&lt;/p&gt;

&lt;p&gt;It is not a replacement for code review.&lt;/p&gt;

&lt;p&gt;It is not magic.&lt;/p&gt;

&lt;p&gt;It is a project memory layer for AI-assisted coding.&lt;/p&gt;

&lt;p&gt;The agent can still make mistakes. But with a graph, at least it can ask better questions first.&lt;/p&gt;

&lt;p&gt;Where I want to take it next&lt;/p&gt;

&lt;p&gt;The current version is early but usable.&lt;/p&gt;

&lt;p&gt;The next improvements I am thinking about are more workflow-focused:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better usage prompts&lt;/li&gt;
&lt;li&gt;troubleshooting docs&lt;/li&gt;
&lt;li&gt;a small UI for reviewing frontend/backend link suggestions&lt;/li&gt;
&lt;li&gt;background graph enrichment&lt;/li&gt;
&lt;li&gt;test shield summaries&lt;/li&gt;
&lt;li&gt;change-session memory&lt;/li&gt;
&lt;li&gt;better Docker image publishing and install flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One feature I am especially interested in is a manual relationship workbench:&lt;/p&gt;

&lt;p&gt;The indexer could suggest possible frontend-to-backend links, such as:&lt;/p&gt;

&lt;p&gt;CreateNoteForm.tsx -&amp;gt; POST /api/notes -&amp;gt; NoteEndpoints.CreateAsync&lt;/p&gt;

&lt;p&gt;Then a developer could confirm or reject those links in a small UI.&lt;/p&gt;

&lt;p&gt;That would turn CodeMeridian from a passive index into a curated system map.&lt;/p&gt;

&lt;p&gt;Repo&lt;/p&gt;

&lt;p&gt;The project is here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Driftya" rel="noopener noreferrer"&gt;
        Driftya
      &lt;/a&gt; / &lt;a href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;
        code-meridian
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A persistent code knowledge graph that gives GitHub Copilot a grounded, structural understanding of your codebase. It acts as the **deterministic context layer** — so Copilot doesn't drift or forget your architecture when working on large projects.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/Driftya/code-meridian/docs/assets/icon_512.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FDriftya%2Fcode-meridian%2FHEAD%2Fdocs%2Fassets%2Ficon_512.png" alt="CodeMeridian logo" width="160"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CodeMeridian&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/CodeMeridian.Indexer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f72ed8cce9fe091d5dde03555049280b6bdd8ac187538c8c230ad749ce88cf57/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f436f64654d6572696469616e2e496e64657865722e737667" alt="NuGet"&gt;&lt;/a&gt;
&lt;a href="https://www.nuget.org/packages/CodeMeridian.Indexer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3eeb7450f84eeb4bdae0ce36d1a1f32f07fa6ef2b9c01e269196ae1738d37d44/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f436f64654d6572696469616e2e496e64657865722e737667" alt="NuGet Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Driftya/code-meridian/actions/workflows/codeql.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Driftya/code-meridian/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CodeMeridian is a persistent code knowledge graph for AI coding tools. It indexes your codebase into Neo4j and exposes that structure through MCP, so GitHub Copilot, Codex, Claude Code, and other MCP-compatible clients can ask precise questions before editing instead of guessing from open files.&lt;/p&gt;
&lt;p&gt;It is built to be the deterministic context layer for large codebases: callers, dependencies, tests, documentation, hotspots, dead code, and cross-project relationships stay available across sessions.&lt;/p&gt;
&lt;p&gt;No LLM API key required. The assistant is the AI; CodeMeridian is the knowledge engine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why CodeMeridian?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Copilot can still read files beyond what is already open, but it has to spend context to discover them and the relationships do not persist. CodeMeridian makes that discovery explicit, cheaper, and reusable.&lt;/p&gt;
&lt;p&gt;The graph is yours. CodeMeridian stores indexed code structure, documentation, diagnostics, and remembered project knowledge in your Neo4j instance. Nothing is sent to a CodeMeridian cloud service. If…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Driftya/code-meridian" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Designing respectful notifications in a social platform.</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Tue, 03 Mar 2026 15:36:33 +0000</pubDate>
      <link>https://dev.to/driftya/designing-respectful-notifications-in-a-social-platform-41pc</link>
      <guid>https://dev.to/driftya/designing-respectful-notifications-in-a-social-platform-41pc</guid>
      <description>&lt;p&gt;Most social platforms treat notifications as engagement drivers. The more you return, the better it is for the system. Notifications become a lever to pull people back in, often regardless of whether they have shown recent activity.&lt;/p&gt;

&lt;p&gt;Questioning that assumption while building a small social platform. If a user has not interacted with the app in days or weeks, does it really make sense to keep sending notifications? At some point, reminders stop being helpful and start feeling like spam.&lt;/p&gt;

&lt;p&gt;The idea I settled on was simple: notifications should respond to user activity, not just system events.&lt;/p&gt;

&lt;p&gt;Instead of sending a notification for every qualifying action, the system allows only one notification per user activity window. If the user has already received a notification but has not returned to the platform, additional notifications are suppressed. In other words, inactivity acts as a natural brake.&lt;/p&gt;

&lt;p&gt;Technically, this is implemented using Redis as a persistent cache layer. When a notification is sent, a suppression key is written with a configurable expiration time. As long as that key exists, further notifications of that type are not delivered. If the user returns and interacts with the platform, the key can be cleared or reset. If they remain inactive, the suppression window eventually expires on its own.&lt;/p&gt;

&lt;p&gt;The expiration time is configurable per notification type. Some events are more time-sensitive than others, and the system allows different reset periods. In my current setup, the default window is seven days, but this can be adjusted without changing the core logic.&lt;/p&gt;

&lt;p&gt;This approach does introduce tradeoffs. A user who cares but checks the platform infrequently might miss intermediate updates. However, the design assumption is that meaningful engagement should restart when the user actively returns. Notifications are not meant to accumulate in the background; they are meant to signal something new once the user has shown interest again.&lt;/p&gt;

&lt;p&gt;The broader goal is to make notifications feel respectful. Instead of optimizing for frequency or return rate, the system optimizes for restraint. If someone is inactive, the platform should not keep tapping them on the shoulder.&lt;/p&gt;

&lt;p&gt;Designing notifications this way shifts the focus slightly. It moves away from maximizing engagement and toward minimizing unnecessary interruption. It is a small change technically, but it significantly changes the tone of the product.&lt;/p&gt;

&lt;p&gt;I am still refining the definition of “inactive” and exploring edge cases where suppression might hide something important. But the core principle remains the same: activity should trigger notifications, not the absence of it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>redis</category>
      <category>backend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How important is Web Accessibility?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Sun, 15 Feb 2026 01:06:13 +0000</pubDate>
      <link>https://dev.to/driftya/how-important-is-web-accessibility-i8k</link>
      <guid>https://dev.to/driftya/how-important-is-web-accessibility-i8k</guid>
      <description>&lt;p&gt;Since I learned web programming I always thought just like security is somethings we should never skip I also think of web accessibility in the same regards for public sites but I also try to always implement it on internal tools as well. &lt;/p&gt;

&lt;p&gt;I am using this great tool from WAVE Web Accessibility Evaluation Tools (&lt;a href="https://wave.webaim.org/" rel="noopener noreferrer"&gt;https://wave.webaim.org/&lt;/a&gt;), does anyone else use it? I wonder if there are any alternatives that is better.&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.amazonaws.com%2Fuploads%2Farticles%2Farnc0mi12svszrhyluzd.webp" 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.amazonaws.com%2Fuploads%2Farticles%2Farnc0mi12svszrhyluzd.webp" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>web</category>
      <category>discuss</category>
    </item>
    <item>
      <title>IndexNow: Struggle with implementation (C#)</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Thu, 12 Feb 2026 16:12:37 +0000</pubDate>
      <link>https://dev.to/driftya/indexnow-struggle-with-implementation-c-5fn4</link>
      <guid>https://dev.to/driftya/indexnow-struggle-with-implementation-c-5fn4</guid>
      <description>&lt;p&gt;Some days ago I have been struggling with implementing IndexNow, I did almost exactly as mentioned here in this tutorial &lt;a href="https://www.bing.com/indexnow/getstarted#implementation" rel="noopener noreferrer"&gt;https://www.bing.com/indexnow/getstarted#implementation&lt;/a&gt;, but it did not work.&lt;/p&gt;

&lt;p&gt;The payload was correct and the data and the endpoint was right but I got bad request, I had no clue what to fix. &lt;/p&gt;

&lt;p&gt;The error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{\"code\":\"InvalidRequestParameters\",\"message\":\"Given request parameters are null or invalid\"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After finding &lt;a href="https://stackoverflow.com/questions/72629964/given-request-parameters-are-null-or-invalid-when-using-curl-to-submit-urls-wi" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/72629964/given-request-parameters-are-null-or-invalid-when-using-curl-to-submit-urls-wi&lt;/a&gt; on stackoverflow I changed endpoint to "&lt;a href="https://www.bing.com/IndexNow" rel="noopener noreferrer"&gt;https://www.bing.com/IndexNow&lt;/a&gt;" I finally found the cause.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IndexNow submission failed with status LengthRequired.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The whole issue has been the http version all along which I never thought of as I have never had any reasons before to set that manually.&lt;/p&gt;

&lt;p&gt;The solution to fix the issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            var request = new HttpRequestMessage(HttpMethod.Post, endpoint)
            {
                Version = HttpVersion.Version11,
                VersionPolicy = HttpVersionPolicy.RequestVersionExact,
                Content = new StringContent(
                    JsonSerializer.Serialize(payload, JsonSerializerOptions.Web),
                    Encoding.UTF8,
                    "application/json")
            };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope it help someone who may struggle with the same issue.&lt;br&gt;
A small note, the correct endpoint is &lt;a href="https://api.indexnow.org/indexnow" rel="noopener noreferrer"&gt;https://api.indexnow.org/indexnow&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>indexnow</category>
      <category>csharp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Remember what you vibe?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:43:00 +0000</pubDate>
      <link>https://dev.to/driftya/learn-what-you-vibe-219m</link>
      <guid>https://dev.to/driftya/learn-what-you-vibe-219m</guid>
      <description>&lt;p&gt;Hello, &lt;/p&gt;

&lt;p&gt;I recently started vibe coding and yes the output is fast but I feel personally the long term memory for knowing your project is declining.&lt;/p&gt;

&lt;p&gt;When I did commit and pullrequests I read the code and understand what it did and if it required any changes, but in long term I needed to go back again to remember the details. &lt;/p&gt;

&lt;p&gt;Writing my code myself it was much easier to remember the details. &lt;strong&gt;So how did I solve it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What I did, first make sure the agent follow the SOLID principle and KISS as much as possible, iterate over the code and extract all methods as much as possible (A lesson from Uncle Bob). Then I writes unit test myself, this make me remember the code much better when doing vibe coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am curious on how you solved it. Any Ideas?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Reasonable security baseline for self-hosted services 2026?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Sun, 01 Feb 2026 01:06:05 +0000</pubDate>
      <link>https://dev.to/driftya/reasonable-security-baseline-for-self-hosted-services-2026-1jjk</link>
      <guid>https://dev.to/driftya/reasonable-security-baseline-for-self-hosted-services-2026-1jjk</guid>
      <description>&lt;p&gt;Running a hobby project on a self-hosted server and wanted a quick sanity check on whether this counts as a reasonable minimum security baseline in 2026.&lt;/p&gt;

&lt;p&gt;High-level setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux host&lt;/li&gt;
&lt;li&gt;Dockerized services&lt;/li&gt;
&lt;li&gt;Only 80/443 exposed publicly&lt;/li&gt;
&lt;li&gt;Reverse proxy terminating TLS (HTTPS enforced)&lt;/li&gt;
&lt;li&gt;ASP.NET (.NET 10) with built-in Identity + OAuth&lt;/li&gt;
&lt;li&gt;EF Core/ORM only (no raw SQL)&lt;/li&gt;
&lt;li&gt;auto-encoding, no user HTML rendering&lt;/li&gt;
&lt;li&gt;Basic security headers (CSP, HSTS, nosniff, referrer, permissions)&lt;/li&gt;
&lt;li&gt;Host firewall enabled (default deny incoming)&lt;/li&gt;
&lt;li&gt;Regular security updates (OS + container rebuilds, unattended upgrades)&lt;/li&gt;
&lt;li&gt;Rate limiting policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t meant to be enterprise-grade, just sensible for a hobby app.&lt;br&gt;
Does this sound like a reasonable baseline?&lt;/p&gt;

&lt;p&gt;Any common blind spots people usually miss at this stage (ops, maintenance, or process-wise)? &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>network</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Vibe coding before writing code?</title>
      <dc:creator>Niclas</dc:creator>
      <pubDate>Fri, 30 Jan 2026 11:32:55 +0000</pubDate>
      <link>https://dev.to/driftya/vibe-coding-before-writing-code-2ko6</link>
      <guid>https://dev.to/driftya/vibe-coding-before-writing-code-2ko6</guid>
      <description>&lt;p&gt;Before I wrote much code on my current project, I wrote documents.&lt;/p&gt;

&lt;p&gt;The idea started after some frustration with social media. I spent time comparing different platforms and noticed how similar they all felt in practice. Most of them optimize for quick reactions and passive engagement. I kept wondering what kind of interaction would actually feel satisfying to respond to, where the creator might genuinely care about the reply, and where responding felt better than just clicking a like.&lt;/p&gt;

&lt;p&gt;I gave the idea space by discussing it back and forth with different AI models. Over time this turned into a large, unstructured dataset of thoughts, constraints, and possibilities. Instead of trying to code from that directly, I treated it as raw material that needed processing.&lt;/p&gt;

&lt;p&gt;Before doing that processing, I focused on orientation. As a programmer, what felt important to me was defining a Table of Contents in a README, writing a CONTRIBUTING guide, and creating an Agent.md file as an explicit entry point for prompting and discussion. These weren’t meant to lock decisions, but to give the project a shared mental baseline, even if that baseline was only for myself.&lt;/p&gt;

&lt;p&gt;I wrote down best practices, architectural boundaries, coding rules, and style decisions as early constraints. I then refined those documents iteratively, again using AI models, before moving deeper into implementation.&lt;/p&gt;

&lt;p&gt;These were the first steps I took before I could really start building.&lt;br&gt;
I’m curious how others approach this phase. Do you do something similar, or are there other practices you’ve found useful early on?&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>programming</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
