<?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: KIM · 风雷益 FENGLEI YI</title>
    <description>The latest articles on DEV Community by KIM · 风雷益 FENGLEI YI (@kimfenglei).</description>
    <link>https://dev.to/kimfenglei</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%2F4076069%2F92c88df6-f8c4-43d7-96b3-2b4c4e2a0b8a.png</url>
      <title>DEV Community: KIM · 风雷益 FENGLEI YI</title>
      <link>https://dev.to/kimfenglei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kimfenglei"/>
    <language>en</language>
    <item>
      <title>Your Next Meeting Can Run Itself. This Free AI Debates Every Angle for You</title>
      <dc:creator>KIM · 风雷益 FENGLEI YI</dc:creator>
      <pubDate>Sat, 15 Aug 2026 16:26:58 +0000</pubDate>
      <link>https://dev.to/kimfenglei/your-next-meeting-can-run-itself-this-free-ai-debates-every-angle-for-you-3ak1</link>
      <guid>https://dev.to/kimfenglei/your-next-meeting-can-run-itself-this-free-ai-debates-every-angle-for-you-3ak1</guid>
      <description>&lt;p&gt;Meetings are the biggest time sink in modern work. You sit in a room, listen to one person talk for an hour, and leave with nothing decided. Every meeting is a single story, told from a single angle.&lt;/p&gt;

&lt;p&gt;What if a meeting could argue with itself?&lt;/p&gt;

&lt;p&gt;Meet Multi-Perspective Meeting, a free open-source tool that turns one topic into a full multi-sided debate. You type a subject. Five AI agents with five different viewpoints analyze it. Each one challenges the others. Then everything is merged into a complete meeting report, with decisions, risks, and next steps.&lt;/p&gt;

&lt;p&gt;This is not academic theory. This is a tool you can try right now in your browser. No install. No signup. No credit card.&lt;/p&gt;

&lt;p&gt;What can you use it for?&lt;/p&gt;

&lt;p&gt;Product decisions. Before you ship a feature, let the product, engineering, design, marketing, and support perspectives tear it apart. You will see the risks before your users do.&lt;/p&gt;

&lt;p&gt;Research and study. Test a hypothesis from five angles. Find the holes in your own logic before a reviewer does.&lt;/p&gt;

&lt;p&gt;Debate practice. The system argues both sides. Watch it defend a position, then destroy it. You learn faster than any single reading.&lt;/p&gt;

&lt;p&gt;Brainstorming. Five agents, five directions, one merged result. Your next idea is already in the output.&lt;/p&gt;

&lt;p&gt;Here is how it works. You give it a topic. It assigns multiple roles to multiple perspectives. Each agent presents its view, responds to the others, and the final report combines everything into a structured meeting note with key points, disagreements, decisions, and action items.&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%2Fd5p6xmjpdzqb6mn5wkp7.gif" 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%2Fd5p6xmjpdzqb6mn5wkp7.gif" alt="Multi-Perspective Meeting in action - five AI agents debating your topic" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it now.&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://kim-fenglei.github.io/multi-perspective-meeting/run.html" rel="noopener noreferrer"&gt;https://kim-fenglei.github.io/multi-perspective-meeting/run.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watch it run: &lt;a href="https://kim-fenglei.github.io/multi-perspective-meeting/demo.gif" rel="noopener noreferrer"&gt;https://kim-fenglei.github.io/multi-perspective-meeting/demo.gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is open source, free, and MIT licensed.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Kim-FengLei/multi-perspective-meeting" rel="noopener noreferrer"&gt;https://github.com/Kim-FengLei/multi-perspective-meeting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop preparing meetings. Let the AI debate it. You just show up and decide.&lt;/p&gt;

&lt;p&gt;More from FENGLEI YI: &lt;a href="https://xuanyuange.club:8443/fenglei/" rel="noopener noreferrer"&gt;https://xuanyuange.club:8443/fenglei/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Migrated to Godot 4 and Hit These GDScript Traps. Here Is What Fixed Them</title>
      <dc:creator>KIM · 风雷益 FENGLEI YI</dc:creator>
      <pubDate>Fri, 14 Aug 2026 16:07:31 +0000</pubDate>
      <link>https://dev.to/kimfenglei/i-migrated-to-godot-4-and-hit-these-gdscript-traps-here-is-what-fixed-them-1kgo</link>
      <guid>https://dev.to/kimfenglei/i-migrated-to-godot-4-and-hit-these-gdscript-traps-here-is-what-fixed-them-1kgo</guid>
      <description>&lt;p&gt;Godot 4 is a great engine. The migration from Godot 3 is not. When I moved a real project from Godot 3 to Godot 4, I did not hit one or two problems. I hit a wall of them. Constants renamed, APIs moved, methods removed, types that stopped existing, parser errors that made no sense, and a few hours lost to each. Every pitfall in this article is one I actually hit. Every fix is one I actually shipped. No theory, no speculation, only the traps that cost time and the corrections that worked.&lt;/p&gt;

&lt;p&gt;If you are migrating to Godot 4, or if you have already migrated and some error message keeps showing up, this article will save you hours. And at the end I share the full open source guide I distilled from all of this, so the lessons never get lost again.&lt;/p&gt;

&lt;p&gt;Trap One, Custom Classes Cannot Be Const Types&lt;/p&gt;

&lt;p&gt;In Godot 3 I used to write things like this without thinking.&lt;/p&gt;

&lt;p&gt;const _instance: GameServiceManager = null&lt;/p&gt;

&lt;p&gt;In Godot 4 this is a compile error. A const declaration cannot use a custom class as its type annotation. The fix is simple, use a plain var instead.&lt;/p&gt;

&lt;p&gt;var _instance = null&lt;/p&gt;

&lt;p&gt;This one cost me maybe ten minutes. The next one cost more.&lt;/p&gt;

&lt;p&gt;Trap Two, Abstract Classes Cannot Be Instantiated&lt;/p&gt;

&lt;p&gt;I tried to create an audio generator directly.&lt;/p&gt;

&lt;p&gt;var silence = AudioStreamGeneratorPlayback.new()&lt;/p&gt;

&lt;p&gt;That is a compile error too, because AudioStreamGeneratorPlayback is abstract. Godot 4 refuses to construct it. You have to obtain it through an AudioStreamPlayer or another valid path. Common abstract classes in Godot 4 include AudioStreamGeneratorPlayback and XRInterface. If you see an error saying a native class cannot be constructed as it is abstract, do not fight it. Find the factory method that gives you the instance.&lt;/p&gt;

&lt;p&gt;Trap Three, Types That Do Not Exist&lt;/p&gt;

&lt;p&gt;This one is sneaky because the type name looks perfectly reasonable.&lt;/p&gt;

&lt;p&gt;var _recorder: AudioStreamRecorder = null&lt;/p&gt;

&lt;p&gt;AudioStreamRecorder does not exist in Godot 4. It existed in Godot 3. The migration renamed or removed it, and the compiler simply tells you the type cannot be found. When you see could not find type in the current scope, the first thing to check is whether the type still exists in Godot 4 at all. Sometimes the right answer is to use Variant, or to use the replacement class. In this case AudioEffectRecord is the closest living relative.&lt;/p&gt;

&lt;p&gt;Trap Four, Label Autowrap Constants Moved and Changed&lt;/p&gt;

&lt;p&gt;I set label text wrapping the way I always had.&lt;/p&gt;

&lt;p&gt;label.autowrap_mode = Label.AUTOWRAP_WORD_SMART&lt;/p&gt;

&lt;p&gt;Godot 4 moved these constants from TextServer to Label, and the values changed. The safest path is to use the integer values directly.&lt;/p&gt;

&lt;p&gt;const AUTOWRAP_OFF = 0&lt;br&gt;
const AUTOWRAP_ARBITRARY = 1&lt;br&gt;
const AUTOWRAP_WORD = 2&lt;br&gt;
const AUTOWRAP_WORD_SMART = 3&lt;/p&gt;

&lt;p&gt;label.autowrap_mode = 2&lt;/p&gt;

&lt;p&gt;The lesson is general. When you migrate, do not trust that a constant name survived. Check where it moved and whether its value changed. The same applied to my BoxContainer alignment code.&lt;/p&gt;

&lt;p&gt;bubble.alignment = BoxContainer.ALIGNMENT_START&lt;/p&gt;

&lt;p&gt;That constant is gone. In Godot 4 the alignment values are integers, and the mapping is not what you expect. ALIGNMENT_BEGIN is negative one, ALIGNMENT_CENTER is zero, ALIGNMENT_END is one. So the correct code uses raw numbers, and you have to be careful which one means which.&lt;/p&gt;

&lt;p&gt;Trap Five, PhysicsRayQueryParameters3D Flags&lt;/p&gt;

&lt;p&gt;I was doing a raycast and setting flags the old way.&lt;/p&gt;

&lt;p&gt;query.flags = PhysicsRayQueryParameters3D.FILTER_MASK_ALL&lt;/p&gt;

&lt;p&gt;FILTER_MASK_ALL does not exist in Godot 4. The replacement is two boolean properties.&lt;/p&gt;

&lt;p&gt;query.collide_with_areas = true&lt;br&gt;
query.collide_with_bodies = true&lt;/p&gt;

&lt;p&gt;This pattern of a flag constant becoming two booleans shows up across the engine. When a constant disappears, look for the new property style instead of hunting for the same constant under a new name.&lt;/p&gt;

&lt;p&gt;Trap Six, get_world_3d Moved to Node3D&lt;/p&gt;

&lt;p&gt;In Godot 3 I could call get_world_3d from almost anywhere. In Godot 4, if your class extends Node and not Node3D, this call fails.&lt;/p&gt;

&lt;p&gt;var space_state = get_world_3d().direct_space_state&lt;/p&gt;

&lt;p&gt;The fix is to obtain the world through the active camera.&lt;/p&gt;

&lt;p&gt;var cam = get_viewport().get_camera_3d()&lt;br&gt;
var space_state = cam.get_world_3d().direct_space_state&lt;/p&gt;

&lt;p&gt;The general rule for Godot 4 migration, if a method is suddenly unavailable, check which class it moved to. Godot 4 tightened the class hierarchy, and methods that used to live high up now live closer to where they belong.&lt;/p&gt;

&lt;p&gt;Trap Seven, Array.pop_front Was Removed&lt;/p&gt;

&lt;p&gt;This one broke a lot of my queue code.&lt;/p&gt;

&lt;p&gt;var item = array.pop_front()&lt;/p&gt;

&lt;p&gt;pop_front no longer exists in Godot 4. The replacement is pop_at with an index of zero.&lt;/p&gt;

&lt;p&gt;var item = array.pop_at(0)&lt;/p&gt;

&lt;p&gt;Same behavior, different name. This is the kind of rename that search and replace will not catch, because you have to know the new name exists.&lt;/p&gt;

&lt;p&gt;Trap Eight, GDScript Uses Tab Indentation, Not Spaces&lt;/p&gt;

&lt;p&gt;I had a method body that was not indented after its signature.&lt;/p&gt;

&lt;p&gt;func _process(delta: float) with a void return type:&lt;br&gt;
    _process_wake_word(delta)&lt;/p&gt;

&lt;p&gt;Godot 4 treats this as a parse error. GDScript requires Tab indentation. Mixing tabs and spaces causes mysterious parser failures that look like the parser is broken. It is not. It is the indentation. Use tabs consistently, and if you are coming from Python or JavaScript, unlearn spaces for this language.&lt;/p&gt;

&lt;p&gt;Trap Nine, Complex List Comprehensions Can Break the Parser&lt;/p&gt;

&lt;p&gt;GDScript supports list comprehensions, but the parser is not as forgiving as Python.&lt;/p&gt;

&lt;p&gt;var story_text = "\n".join(spot.get("stories", Array.new()))&lt;/p&gt;

&lt;p&gt;This can fail with confusing errors. The safe approach is to simplify, or use a traditional loop.&lt;/p&gt;

&lt;p&gt;var story_text = "\n".join(spot.get("stories", Array.new()))&lt;/p&gt;

&lt;p&gt;When a comprehension is doing too much, the parser chokes. Simplify it. Your future self will thank you.&lt;/p&gt;

&lt;p&gt;Trap Ten, Autoload Singletons Do Not Need Class Name&lt;/p&gt;

&lt;p&gt;I added class_name to an autoload singleton.&lt;/p&gt;

&lt;p&gt;class_name GameServiceManager&lt;br&gt;
extends Node&lt;/p&gt;

&lt;p&gt;In Godot 4 this can cause circular reference errors, because the autoload is already registered globally. The fix is to remove class_name entirely. The singleton is managed through autoload, it does not need a global class name.&lt;/p&gt;

&lt;p&gt;But removing class_name breaks type checks that referenced the class.&lt;/p&gt;

&lt;p&gt;if child is GameServiceManager:&lt;br&gt;
    return child&lt;/p&gt;

&lt;p&gt;With no class_name, that check fails to compile. The alternative is to check by node name.&lt;/p&gt;

&lt;p&gt;if child.name == "GameServiceManager":&lt;br&gt;
    return child&lt;/p&gt;

&lt;p&gt;This also means static methods cannot use the custom class as a return type.&lt;/p&gt;

&lt;p&gt;static func get_instance() with GameServiceManager return type:&lt;/p&gt;

&lt;p&gt;Without class_name, this does not compile. Use a base type instead.&lt;/p&gt;

&lt;p&gt;static func get_instance() with Node return type:&lt;/p&gt;

&lt;p&gt;The whole cluster of class name, type check, and static return type is a single design decision in Godot 4. Remove the class_name, and adjust all three places together.&lt;/p&gt;

&lt;p&gt;Trap Eleven, Do Not Edit Files While the Editor Is Running&lt;/p&gt;

&lt;p&gt;This one cost me a file. When the Godot editor is running, directly editing GDScript files can truncate them. The editor holds a lock on the project. The right workflow is to quit the editor, edit the files, then reopen the editor. I know it feels slower. It is faster than recovering a truncated file.&lt;/p&gt;

&lt;p&gt;Trap Twelve, Unexplained Parse Errors, Clear the Cache&lt;/p&gt;

&lt;p&gt;Godot 4 keeps a cache in the .godot folder of your project. When you see parse errors that should not exist, clear it.&lt;/p&gt;

&lt;p&gt;rm -rf /path/to/project/.godot&lt;/p&gt;

&lt;p&gt;This has fixed problems that made no sense at the code level. Do it before you go down a debugging rabbit hole.&lt;/p&gt;

&lt;p&gt;Trap Thirteen, Check Your Brackets with a Script&lt;/p&gt;

&lt;p&gt;A lot of mysterious Godot 4 errors trace back to unbalanced brackets in a file. Before opening the editor, run a quick bracket count.&lt;/p&gt;

&lt;p&gt;with open('script.gd', 'r') as f:&lt;br&gt;
    content = f.read()&lt;/p&gt;

&lt;p&gt;pairs = {40: 41, 91: 93, 123: 125}&lt;br&gt;
for open_code, close_code in pairs.items():&lt;br&gt;
    print(chr(open_code), content.count(chr(open_code)), chr(close_code), content.count(chr(close_code)))&lt;/p&gt;

&lt;p&gt;If any pair does not match, that file has the problem. This simple check has saved me more times than I can count.&lt;/p&gt;

&lt;p&gt;The Error Message Quick Reference&lt;/p&gt;

&lt;p&gt;After all this pain, I compiled a quick reference that maps the error message to the cause and the fix. It lives in the open source guide, but here are the highlights.&lt;/p&gt;

&lt;p&gt;Cannot find member in base, means a constant or method does not exist in Godot 4. Check the API migration.&lt;/p&gt;

&lt;p&gt;Function has the same name as a previously declared function, means you have a duplicate definition. Check the inheritance chain.&lt;/p&gt;

&lt;p&gt;Expected closing bracket after array elements, means an unclosed array. Check multiline arrays.&lt;/p&gt;

&lt;p&gt;Native class cannot be constructed as it is abstract, means you instantiated an abstract class. Use a factory method or subclass.&lt;/p&gt;

&lt;p&gt;Could not find type in the current scope, means the type does not exist. Check the name, or use Variant.&lt;/p&gt;

&lt;p&gt;Static function called from an instance, means you called a static function through an instance. Call it through the class name instead.&lt;/p&gt;

&lt;p&gt;The Pre-Commit Checklist&lt;/p&gt;

&lt;p&gt;Before committing Godot code, I now run this checklist every time. All brackets are balanced. All constants use correct values. All types exist and are correct. No abstract classes are instantiated. Tab indentation is used consistently. The Godot editor is closed before batch editing files. The cache is cleared before testing.&lt;/p&gt;

&lt;p&gt;This checklist is boring. That is the point. Every item on it is a mistake I actually made, and the checklist exists so I never make it twice.&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;Godot 4 is a better engine than Godot 3. The migration pain is real, but it is not random. Almost every trap follows one of four patterns. A constant moved to a new class. A method was renamed or removed. A type stopped existing. A syntax rule got stricter. Once you see the four patterns, you stop being surprised, and you start checking the right place first.&lt;/p&gt;

&lt;p&gt;That is why I wrote everything down. Not to complain, but to turn pain into a reference. Every wrong example in the guide is a real compile error I hit. Every right example is the fix I shipped. No theory, no speculation. Just the traps that cost time and the corrections that worked.&lt;/p&gt;

&lt;p&gt;Get the Full Guide&lt;/p&gt;

&lt;p&gt;The complete collection is open source and free, with all thirteen traps in full detail, the error message quick reference, and the pre-commit checklist, formatted so you can install it as an agent skill for your Godot development workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Kim-FengLei/godot4-gdscript-pitfalls" rel="noopener noreferrer"&gt;https://github.com/Kim-FengLei/godot4-gdscript-pitfalls&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. Star it if it saves you time, fork it if you want to extend it, and share it with anyone who is migrating to Godot 4 right now.&lt;/p&gt;

&lt;p&gt;Your engine got better. Your code can too.&lt;/p&gt;

&lt;p&gt;Built by KIM, Founder of FENGLEI YI, 风雷益, 天施地生，其益无方. Technical exchange, &lt;a href="mailto:kimsunjian@vip.qq.com"&gt;kimsunjian@vip.qq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Your AI Agent Has No Memory. Here Is a Memory System That Actually Learns</title>
      <dc:creator>KIM · 风雷益 FENGLEI YI</dc:creator>
      <pubDate>Fri, 14 Aug 2026 16:02:30 +0000</pubDate>
      <link>https://dev.to/kimfenglei/your-ai-agent-has-no-memory-here-is-a-memory-system-that-actually-learns-316m</link>
      <guid>https://dev.to/kimfenglei/your-ai-agent-has-no-memory-here-is-a-memory-system-that-actually-learns-316m</guid>
      <description>&lt;p&gt;Every AI agent I have built has the same disease. It remembers everything and learns nothing. The chat history grows, the context window overflows, the vector database fills up, and yet on the next task it starts from zero again, asking the same questions, making the same mistakes. If that sounds familiar, this article is for you.&lt;/p&gt;

&lt;p&gt;I spent months fighting this problem in production. I tried bigger context windows, better embedding models, more sophisticated retrieval pipelines. None of it worked, because I was solving the wrong problem. The problem is not storage. The problem is learning. This article explains the mental shift that finally fixed it, and the complete four layer memory methodology I now use with every agent I build. It is open source, zero dependency, and you can apply it today.&lt;/p&gt;

&lt;p&gt;The Warehouse Problem&lt;/p&gt;

&lt;p&gt;Most agent memory systems work like a warehouse. One event happens, you record one entry. One conversation ends, you save one snippet. One bug is fixed, you drop one log. Over time the warehouse gets fuller, and the useful things get buried deeper.&lt;/p&gt;

&lt;p&gt;Here is what actually happens after six months of this pattern. Your agent has ten thousand memory entries. Retrieval becomes fishing with a needle. You know the answer is in there somewhere, but the search returns noise. The agent ends up redoing work it already did, because the record of how it solved the problem last time is buried under nine thousand nine hundred entries about nothing.&lt;/p&gt;

&lt;p&gt;I call this hoarding, not memory. A warehouse of facts is not the same as a learned skill. You can store a thousand deployment logs and still deploy wrong the next time, because none of those logs taught the agent a rule. Stored a lot, never really learned.&lt;/p&gt;

&lt;p&gt;Why Vector Databases Do Not Fix This&lt;/p&gt;

&lt;p&gt;Let me be direct. Vector databases, embeddings, RAG pipelines, these are retrieval infrastructure, not learning systems. They answer the question of how to find something. They do not answer the question of what deserves to be kept, or how raw facts become reusable judgment.&lt;/p&gt;

&lt;p&gt;I built a system with a vector store, semantic search, everything shiny. It was fast and it was useless. Why. Because I was still recording everything, so retrieval was still noisy. Because I was still treating each record as a standalone fact, so no patterns ever emerged. Because nothing in the pipeline ever promoted a repeated lesson into a rule.&lt;/p&gt;

&lt;p&gt;The infrastructure was excellent. The methodology was missing. That is the gap this article is about.&lt;/p&gt;

&lt;p&gt;The Shift: Memory Is Training Data, Not Inventory&lt;/p&gt;

&lt;p&gt;Here is the one sentence that changed everything for me.&lt;/p&gt;

&lt;p&gt;A piece of information that cannot improve future judgment does not deserve long term retention.&lt;/p&gt;

&lt;p&gt;Think of it that way and the whole design changes. Memory is not a place to keep things. Memory is training data. Its only job is to make the next decision better. If a record does not make the agent faster, more accurate, or more careful next time, it should not be in long term memory.&lt;/p&gt;

&lt;p&gt;This leads to a second principle that matters just as much.&lt;/p&gt;

&lt;p&gt;What can be promoted into a skill should not stay at log level.&lt;/p&gt;

&lt;p&gt;Logs are raw ore. Skills are the refined weapon. The goal of a memory system is not to accumulate ore. The goal is to keep refining ore into weapons. When you see it this way, the entire architecture of your agent memory changes, and the four layer design below is the result.&lt;/p&gt;

&lt;p&gt;The Four Layer Architecture&lt;/p&gt;

&lt;p&gt;I organize long term memory into four layers. The higher the layer, the closer to learned. The whole job of the system is to keep pushing facts upward.&lt;/p&gt;

&lt;p&gt;Layer one, world facts. These are the stable background facts of the collaboration. Who the user is and how they prefer to work. Where the project directory lives. What the deployment conventions are. What the current product direction is. This layer does not change often, but every task needs it. It lives in a single file called MEMORY.md.&lt;/p&gt;

&lt;p&gt;Layer two, experience facts. These are traces of real actions. What changed in this round. How a problem was located. Which version was synced where. Which pipeline was verified working. This layer lives in daily logs named by date, for example 2026-08-14.md, and it is the raw material for everything above it.&lt;/p&gt;

&lt;p&gt;Layer three, observations. These are patterns distilled from repeated facts. Why a certain type of problem keeps recurring. Where a certain testing convention tends to misjudge. How a certain type of requirement converges most reliably. This layer is where memory starts to become intelligence, because it is no longer about one event, it is about the rule behind many events.&lt;/p&gt;

&lt;p&gt;Layer four, skills and mental models. This is the highest value layer. When a pattern is stable enough and will be used repeatedly, it stops being a memory and becomes a skill. It gets condensed into a skill pack, a standard operating procedure, a checklist, a judgment standard. From now on the agent calls the skill instead of searching the archives.&lt;/p&gt;

&lt;p&gt;A real example makes this concrete. Early in my work I hit a frontend bug where several buttons on a page all stopped responding at the same time. I recorded it as an experience fact. A few weeks later it happened again, same symptom, different page. Now I had two facts, so I could form an observation. When multiple touchpoints fail at once on the frontend, check for a JavaScript syntax error first, because one broken script can take down every handler on the page. That observation became a layer four skill. Today my agent checks JavaScript syntax first whenever multiple UI elements fail together. It never has to rediscover that lesson again.&lt;/p&gt;

&lt;p&gt;The Four Elements Every Memory Needs&lt;/p&gt;

&lt;p&gt;Once you accept that memory is training data, the next question is what a well formed memory looks like. I require four elements in every effective memory entry, and I reject entries that lack them.&lt;/p&gt;

&lt;p&gt;Time. When it happened. A date, a version, a milestone. Without time you cannot tell old facts from new facts, and stale information quietly poisons decisions.&lt;/p&gt;

&lt;p&gt;Context. In what task or environment it happened. Deployment stage, testing phase, which project. Without context a fact is a floating island that nothing can connect to.&lt;/p&gt;

&lt;p&gt;Conclusion. What the fact is and how it was solved. This is the part that actually carries value. If an entry only describes a symptom without a solution, it is not a memory, it is a complaint.&lt;/p&gt;

&lt;p&gt;Next step. How to reuse it and what to watch out for later. This is the element that most people skip, and it is the one that turns a record into training. A deployment entry that ends with the rule, all long running processes must be started in background mode with nohup so they survive the session, is worth ten entries that just say, deployment failed today.&lt;/p&gt;

&lt;p&gt;The Five Quality Gates&lt;/p&gt;

&lt;p&gt;Before writing anything to long term memory, I run it through five gates. All five must pass, or the entry does not get written.&lt;/p&gt;

&lt;p&gt;Reusable. Will this be needed again. If it is a one off fact with no future use, it does not belong in long term memory.&lt;/p&gt;

&lt;p&gt;Has a conclusion. Is there a clear conclusion or solution. An entry that only describes what happened, with no lesson, fails this gate.&lt;/p&gt;

&lt;p&gt;Has boundaries. Are the applicable conditions and risks stated. Mindless rules like always do this are dangerous. The rule needs to say when it holds and when it does not.&lt;/p&gt;

&lt;p&gt;Retrievable. Can it be found later. If the entry has no context and no keywords, it will never be retrieved, so it might as well not exist.&lt;/p&gt;

&lt;p&gt;Timely. Is the time or version marked. Old and new information mixed together creates false confidence.&lt;/p&gt;

&lt;p&gt;The five gates have a beautiful side effect. They force the agent to think before writing. Most bad memory systems fail not because retrieval is bad, but because the writing gate is wide open and everything floods in. Close the gate and the whole system gets cleaner.&lt;/p&gt;

&lt;p&gt;The Lifecycle: Write, Retrieve, Reflect, Promote, Clean&lt;/p&gt;

&lt;p&gt;Memory is not write once and keep forever. It has a full lifecycle with five stages.&lt;/p&gt;

&lt;p&gt;Write. Record per the four element rules, through the five quality gates.&lt;/p&gt;

&lt;p&gt;Retrieve. Actually use it in later tasks. A memory that is never retrieved is decoration.&lt;/p&gt;

&lt;p&gt;Reflect. After multiple uses, distill the stable pattern underneath.&lt;/p&gt;

&lt;p&gt;Promote. When the pattern is stable, upgrade it into a skill or an SOP.&lt;/p&gt;

&lt;p&gt;Clean. Expired, merged, or skill covered records get archived or deleted.&lt;/p&gt;

&lt;p&gt;I run this on a cadence. Daily, at the end of the day, scan today's log and mark items that can be promoted. Weekly, summarize observation type memories and merge duplicates. Monthly, formally promote the stable patterns into skill packs. The cadence matters because promotion is not automatic, it is a discipline.&lt;/p&gt;

&lt;p&gt;Three Layer Retrieval&lt;/p&gt;

&lt;p&gt;Retrieval follows a strict order, and the order is the point.&lt;/p&gt;

&lt;p&gt;Layer one, call the corresponding skill first if one exists. Skills are refined weapons. If a skill covers this type of task, use it. Do not go digging through raw history first.&lt;/p&gt;

&lt;p&gt;Layer two, search recent memory, the MEMORY.md file and recent logs.&lt;/p&gt;

&lt;p&gt;Layer three, only as a last resort, read raw logs and historical conversations.&lt;/p&gt;

&lt;p&gt;The order must not be reversed. Most agents search raw history first, which is exactly why they drown in noise. The skill layer exists so the agent does not have to re derive the lesson every single time. And when retrieval fails, the system does not give up. It searches with synonyms, it expands from daily log to weekly log to special report, and if it still finds nothing, that is a signal the memory was poorly recorded, and it writes an observation about the retrieval blind spot so the system improves itself.&lt;/p&gt;

&lt;p&gt;Four Common Mistakes&lt;/p&gt;

&lt;p&gt;After using this system for months, I have a list of the mistakes that kill agent memory, and every one of them is a behavior, not a technical problem.&lt;/p&gt;

&lt;p&gt;Mistake one, record everything. The belief that more records mean better memory. The result is bloat, slow retrieval, and useful information drowned in noise. The fix is the five quality gates.&lt;/p&gt;

&lt;p&gt;Mistake two, record but never act. Entries are written and never reviewed, never promoted, so memory stays loose logs forever. The fix is the daily, weekly, monthly cadence.&lt;/p&gt;

&lt;p&gt;Mistake three, record but never retrieve. The next task starts from zero anyway, so the memory is a museum. The fix is making retrieval a default action, check skills and memory first every time a task starts.&lt;/p&gt;

&lt;p&gt;Mistake four, keep everything forever. The belief that deleting memory is a loss. In reality expired memory only interferes with judgment. The fix is cleaning on schedule and keeping the memory lean.&lt;/p&gt;

&lt;p&gt;How to Start Today&lt;/p&gt;

&lt;p&gt;You do not need a vector database to start. You need a file and a discipline.&lt;/p&gt;

&lt;p&gt;Step one, create a MEMORY.md file with the stable facts about your project and your user. This is your layer one.&lt;/p&gt;

&lt;p&gt;Step two, keep a daily log named by date, and write every experience fact with the four elements. Time, context, conclusion, next step.&lt;/p&gt;

&lt;p&gt;Step three, at the end of each week, look at the daily logs and ask one question. What pattern showed up more than once. That pattern becomes an observation, and the observation is the seed of a skill.&lt;/p&gt;

&lt;p&gt;That is the whole system in its simplest form. The full version in the open source project adds the writing rules, the retrieval techniques, the lifecycle management, the five quality criteria, the memory templates, and the common pitfalls, all formatted so you can install it directly as an agent skill.&lt;/p&gt;

&lt;p&gt;Get Fenglei Memory&lt;/p&gt;

&lt;p&gt;The methodology is called Fenglei Memory, and its motto is learn, don't store. It is open source, free, and MIT licensed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Kim-FengLei/fenglei-memory" rel="noopener noreferrer"&gt;https://github.com/Kim-FengLei/fenglei-memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the complete SKILL.md file that you can install directly into your agent, plus a full README with the architecture, the workflow, and the quick start. Star it if it helps you, fork it if you want to adapt it, and share it with anyone whose agent keeps forgetting.&lt;/p&gt;

&lt;p&gt;Your agent already stores everything. It is time to teach it to learn.&lt;/p&gt;

&lt;p&gt;Built by KIM, Founder of FENGLEI YI, 风雷益, 天施地生，其益无方. Technical exchange, &lt;a href="mailto:kimsunjian@vip.qq.com"&gt;kimsunjian@vip.qq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>memory</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Godot 4 GDScript Pitfalls: Every Mistake I Made So You Do Not Have To</title>
      <dc:creator>KIM · 风雷益 FENGLEI YI</dc:creator>
      <pubDate>Thu, 13 Aug 2026 11:11:18 +0000</pubDate>
      <link>https://dev.to/kimfenglei/godot-4-gdscript-pitfalls-every-mistake-i-made-so-you-do-not-have-to-bhc</link>
      <guid>https://dev.to/kimfenglei/godot-4-gdscript-pitfalls-every-mistake-i-made-so-you-do-not-have-to-bhc</guid>
      <description>&lt;p&gt;I spent months fighting Godot 4. The errors made no sense. The crashes came from nowhere. The worst part? The documentation told me the syntax, but never the traps hiding underneath.&lt;/p&gt;

&lt;p&gt;So I wrote down every single mistake I made, and how I fixed each one. Now it is an open source guide called godot4-gdscript-pitfalls, and it is completely free on GitHub.&lt;/p&gt;

&lt;p&gt;What is inside:&lt;/p&gt;

&lt;p&gt;Signals and Callables. Connecting signals the wrong way, passing arguments that silently fail, and the one pattern that always works.&lt;/p&gt;

&lt;p&gt;Nodes and Lifecycle. Why _ready runs before you think it does, and how to stop fighting the scene tree.&lt;/p&gt;

&lt;p&gt;Typing and Inference. The type errors that only appear at runtime, and how to let the compiler protect you.&lt;/p&gt;

&lt;p&gt;Resource and Memory. The leaks that eat your framerate, and the clean pattern to avoid them.&lt;/p&gt;

&lt;p&gt;Every entry has the broken code, the error message, and the proven fix. No theory. Just mistakes that are real and fixes that are tested.&lt;/p&gt;

&lt;p&gt;If you build games with Godot 4, this guide will save you the weeks I lost. Star it, share it, and never step on the same trap twice.&lt;/p&gt;

&lt;p&gt;Special thanks to Marcus Kim. His feedback made this guide better: use named enums instead of magic numbers, pin your Godot 4 minor version, and run a headless project parse in CI. All three are now in the guide. One good comment can save a hundred developers.&lt;/p&gt;

&lt;p&gt;Find it here:&lt;br&gt;
github.com/Kim-FengLei/godot4-gdscript-pitfalls&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gdscript</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>How to Give Your AI Agent a Memory That Actually Learns</title>
      <dc:creator>KIM · 风雷益 FENGLEI YI</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:16:30 +0000</pubDate>
      <link>https://dev.to/kimfenglei/how-to-give-your-ai-agent-a-memory-that-actually-learns-500n</link>
      <guid>https://dev.to/kimfenglei/how-to-give-your-ai-agent-a-memory-that-actually-learns-500n</guid>
      <description>&lt;p&gt;Fenglei Memory · 风雷记忆 · 学而非存&lt;/p&gt;

&lt;p&gt;Your AI agent keeps forgetting. You tell it your preferences, it nods, and next session it asks again. The usual fix is to store more: bigger context, longer logs, a vector database. But storage is not memory. A warehouse is not a brain.&lt;/p&gt;

&lt;p&gt;Fenglei Memory is a zero-dependency methodology that teaches agents to learn from collaboration instead of just storing content. Here is how it works, and how to apply it today.&lt;/p&gt;

&lt;p&gt;Step One: Record only what has long-term value&lt;/p&gt;

&lt;p&gt;Do not dump every chat into memory. Before saving, ask one question: will I need this next week, next month, or in every future session? If yes, record it. If no, let it go. Raw facts are raw material, not the final product.&lt;/p&gt;

&lt;p&gt;Step Two: Ask what you learned after every round&lt;/p&gt;

&lt;p&gt;At the end of each collaboration, ask: what did I learn here? Extract the pattern, not just the event. A failed deployment is a fact. The reason it failed, and the check that prevents it next time, is the lesson. Store the lesson.&lt;/p&gt;

&lt;p&gt;Step Three: Promote on repetition&lt;/p&gt;

&lt;p&gt;When the same action repeats two or more times, or the same pitfall hits two or more times, promote it. Turn it into a rule, a checklist, or a skill pack. This is how raw records become reusable judgment. This is the difference between hoarding and learning.&lt;/p&gt;

&lt;p&gt;The four layers&lt;/p&gt;

&lt;p&gt;Fenglei Memory organizes everything into four layers. L1 World Facts: stable background like goals and conventions. L2 Experience Facts: traces of real actions and what changed. L3 Observations: patterns distilled from repeated facts. L4 Skills and Mental Models: stable patterns promoted into callable skills. The goal is to keep pushing facts upward, from raw records to reusable skills.&lt;/p&gt;

&lt;p&gt;The full lifecycle&lt;/p&gt;

&lt;p&gt;Write, Retrieve, Reflect, Promote, Clean. Daily, scan for promotable items. Weekly, merge duplicates. Monthly, formalize stable patterns into skill packs. Memory is not written once and permanent. It is maintained, like a garden.&lt;/p&gt;

&lt;p&gt;Why it matters&lt;/p&gt;

&lt;p&gt;Most agents today store a lot but never really learn. They can recall yesterday, but they cannot improve. A memory that learns changes that. Every session makes the agent sharper. Every mistake becomes a checklist. Every repeated task becomes a skill.&lt;/p&gt;

&lt;p&gt;Get it&lt;/p&gt;

&lt;p&gt;Fenglei Memory is open source and free, MIT licensed. Try it and give your agents a memory that actually learns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Kim-FengLei/fenglei-memory" rel="noopener noreferrer"&gt;https://github.com/Kim-FengLei/fenglei-memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by KIM, Founder of FENGLEI YI, 风雷益, 天施地生，其益无方。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>memory</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Learn, Don't Store — A Zero-Dependency Memory Methodology for AI Agents</title>
      <dc:creator>KIM · 风雷益 FENGLEI YI</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:13:47 +0000</pubDate>
      <link>https://dev.to/kimfenglei/learn-dont-store-a-zero-dependency-memory-methodology-for-ai-agents-16l6</link>
      <guid>https://dev.to/kimfenglei/learn-dont-store-a-zero-dependency-memory-methodology-for-ai-agents-16l6</guid>
      <description>&lt;p&gt;Fenglei Memory · 风雷记忆 · 学而非存&lt;/p&gt;

&lt;p&gt;Most AI agents today treat memory like a warehouse: pile up every chat, every file, every context, and hope retrieval finds what matters. It doesn't work. Information grows, but the truly reusable methods get buried deeper every day.&lt;/p&gt;

&lt;p&gt;Fenglei Memory takes the opposite approach. It teaches agents to learn from collaboration instead of just storing content, distilling reusable experience into sharper and sharper forms, until stable, callable judgment standards, operating procedures, and skill packs emerge.&lt;/p&gt;

&lt;p&gt;Why It Matters&lt;/p&gt;

&lt;p&gt;The old pattern usually looks like this. One event happens, then record one entry. One conversation ends, then save one snippet. One fix is done, then drop one log. The result: memory becomes a warehouse, retrieval becomes fishing with a needle. You have done it before, yet you still have to rethink from scratch. Stored a lot, but never really learned. That is not long-term collaboration. That is hoarding.&lt;/p&gt;

&lt;p&gt;The Four Layers of Long-Term Memory&lt;/p&gt;

&lt;p&gt;Fenglei Memory organizes memory into four layers, and the higher the layer, the closer to learned.&lt;/p&gt;

&lt;p&gt;L1 World Facts: stable background such as leader, conventions and project direction, stored in MEMORY.md.&lt;br&gt;
L2 Experience Facts: traces of a real action, what changed and how it was located, stored in daily logs named YYYY-MM-DD.md.&lt;br&gt;
L3 Observations: patterns distilled from repeated facts, stored in MEMORY.md or spec docs.&lt;br&gt;
L4 Skills and Mental Models: stable patterns promoted into callable skills, stored as skill packs, SOPs and checklists.&lt;/p&gt;

&lt;p&gt;The goal is to keep pushing facts upward, from raw records to reusable skills.&lt;/p&gt;

&lt;p&gt;Core Workflow&lt;/p&gt;

&lt;p&gt;Record facts, only the ones with long-term value. Ask what did I learn in each round. Promote on repetition. Skills take priority over raw records.&lt;/p&gt;

&lt;p&gt;Promotion triggers, any one of these. Same action repeated two or more times. Same pitfall hit two or more times. Forgetting once causes significant rework. The pattern holds across multiple tasks.&lt;/p&gt;

&lt;p&gt;Memory is not written once and permanent. It has a full lifecycle: Write, Retrieve, Reflect, Promote, Clean.&lt;/p&gt;

&lt;p&gt;Review cadence: daily scan for promotable items, weekly merge duplicates, monthly formalize stable patterns into skill packs.&lt;/p&gt;

&lt;p&gt;What Makes It Different&lt;/p&gt;

&lt;p&gt;Zero dependency: it is a methodology, not infrastructure. No vector database, no heavy framework, works in any agent runtime.&lt;br&gt;
Skills over records: the end goal is forming mental models, not archiving.&lt;br&gt;
Inspired by Hindsight: retain, recall, reflect, with the final destination being learned behavior, not a bigger archive.&lt;/p&gt;

&lt;p&gt;Get It&lt;/p&gt;

&lt;p&gt;Fenglei Memory is open source and free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Kim-FengLei/fenglei-memory" rel="noopener noreferrer"&gt;https://github.com/Kim-FengLei/fenglei-memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. Star it, fork it, and give your agents a memory that actually learns.&lt;/p&gt;

&lt;p&gt;Built by KIM, Founder of FENGLEI YI, 风雷益, 天施地生，其益无方。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>memory</category>
    </item>
  </channel>
</rss>
