<?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: Nickolay Selyutin (Niki)</title>
    <description>The latest articles on DEV Community by Nickolay Selyutin (Niki) (@hawkn113).</description>
    <link>https://dev.to/hawkn113</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%2F1968281%2F47ecb0da-703e-4806-9ba6-fdaa63535035.png</url>
      <title>DEV Community: Nickolay Selyutin (Niki)</title>
      <link>https://dev.to/hawkn113</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hawkn113"/>
    <language>en</language>
    <item>
      <title>CRAFTER Technical Mastery: Seeing the System Through the Syntax (Part 4)</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:57:43 +0000</pubDate>
      <link>https://dev.to/hawkn113/crafter-technical-mastery-seeing-the-system-through-the-syntax-part-4-3mch</link>
      <guid>https://dev.to/hawkn113/crafter-technical-mastery-seeing-the-system-through-the-syntax-part-4-3mch</guid>
      <description>&lt;p&gt;You know what you need to build․ You've worked out the requirements and have no other blockers to completing the project․ You've defined what success would look like․ You've found time to work on the project without distractions․ There is one more factor to consider:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you know the system you are trying to build?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern software tools help programmers write code․ Frameworks provide higher-level abstractions and other benefits․ Artificial intelligence tools help programmers generate new code quickly․ Even if someone writes code‚ that person may not fully comprehend the codebase․&lt;br&gt;
A recommended solution might satisfy all present and known requirements and unit tests but later prove problematic in other ways‚ including design and maintenance issues․&lt;/p&gt;

&lt;p&gt;This is where the next part of the CRAFTER framework‚ &lt;strong&gt;Technical Mastery&lt;/strong&gt;‚ can help․&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/hawkn113/crafter-clarity-why-real-engineering-starts-before-your-ide-part-2-gg7"&gt;Part 2‚ CRAFTER Clarity&lt;/a&gt;‚ we talked about preparing a solution․&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/hawkn113/crafter-focus-how-to-protect-your-hours-of-deep-work-every-day-part-3-50nd"&gt;Part 3‚ CRAFTER Focus&lt;/a&gt;‚ we talked about ways to protect the mental resources required to do complex engineering tasks․&lt;/p&gt;

&lt;p&gt;Now we discuss strategies for gaining problem-related knowledge and reducing distractions to increase knowledge about technical issues related to the problem․&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 What Is Technical Mastery in CRAFTER?
&lt;/h2&gt;

&lt;p&gt;CRAFTER defines Technical Mastery as: 1․&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mastery is the ability to see the system through the syntax.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This distinction is fundamental․ Syntax knowledge allows programmers to use a programming language effectively․ Technical knowledge allows programmers to predict the consequences of running code and whether other systems are affected and under what conditions․ Engineers need information that is not available in API documentation or other resources about specific software frameworks or code snippets․&lt;br&gt;
The purpose of education is to understand the mechanisms beneath abstractions‚ which you can then use to design other systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintainable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecturally sound&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CRAFTER describes three foundational principles related to Technical Expertise․&lt;/p&gt;

&lt;p&gt;1․ &lt;strong&gt;Low-Level Understanding&lt;/strong&gt;&lt;br&gt;
2․ &lt;strong&gt;Constant R&amp;amp;D&lt;/strong&gt;&lt;br&gt;
3․ &lt;strong&gt;Architectural Reasoning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The practical use of its rules is another benefit:&lt;/p&gt;

&lt;p&gt;Spend 10% of your workweek discovering "How" to do things‚ as well as "What" to do․&lt;/p&gt;

&lt;p&gt;And it mentions an anti-pattern:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Copy-paste" engineering and the use of tools not understood by the user․&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's consider examples of everyday software development to illustrate these concepts․&lt;/p&gt;




&lt;h2&gt;
  
  
  🔬 1. Low-Level Understanding: Look Beneath the Abstraction
&lt;/h2&gt;

&lt;p&gt;Abstractions benefit programmers․ Programmers use frameworks‚ dependency injection software‚ object-relational mapping software‚ messaging software‚ and cloud-based services to program at a higher level of abstraction․ Abstractions don't eliminate complexity; they just move it․ Programmers who understand the implementation details of an abstraction can contribute more to solving some problems than programmers who only know how to use the abstraction's interface․&lt;/p&gt;

&lt;p&gt;Consider an ORM․&lt;/p&gt;

&lt;p&gt;You can write a query with the same LINQ expressions that produces the same result․&lt;/p&gt;

&lt;p&gt;But do you understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What SQL will this generate?&lt;/li&gt;
&lt;li&gt;What indexes does it use?&lt;/li&gt;
&lt;li&gt;Whether the query is causing unnecessary database round trips?&lt;/li&gt;
&lt;li&gt;What is the performance impact of using change tracking?&lt;/li&gt;
&lt;li&gt;What happens if more than one transaction tries to update the same data?&lt;/li&gt;
&lt;li&gt;How the database execution plan changes with additional data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is useful to know Entity Framework Core․&lt;/p&gt;

&lt;p&gt;Understanding what happens between your LINQ query and the database is a different skill․&lt;/p&gt;

&lt;p&gt;Similar issues exist for other technologies․&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abstraction&lt;/th&gt;
&lt;th&gt;Knowledge required to understand it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ORM&lt;/td&gt;
&lt;td&gt;SQL and query plans‚ debugging‚ transaction management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP Client&lt;/td&gt;
&lt;td&gt;Connection pooling and timeout‚ retry‚ and cancellation features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Broker&lt;/td&gt;
&lt;td&gt;Message delivery guarantee and ordering capabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency Injection&lt;/td&gt;
&lt;td&gt;Object lifetimes and scopes‚ disposal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asynchronous Programming&lt;/td&gt;
&lt;td&gt;Process scheduling and synchronization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distributed Cache&lt;/td&gt;
&lt;td&gt;Consistency‚ expiration‚ invalidation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You don't need to understand the internal workings of libraries you are using․ There is no point or need to understand them․ You do need to understand the layers involved in your solution to ensure its quality and maintainability․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An abstraction is an aid to engineering productivity․ It is not a replacement for knowledge․&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 2. Constant R&amp;amp;D: Make Learning Part of Engineering Work
&lt;/h2&gt;

&lt;p&gt;Technical information becomes outdated․ New software frameworks and tools are released․ Systems evolve․ Old technical solutions don't scale․ Engineers who don't keep learning make poor decisions about systems․ The CRAFTER methodology encourages engineers to include research and development efforts in normal working hours‚ in addition to or instead of working on the weekends and other free time․ A recommended practice in the CRAFTER methodology is described․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spend approximately 10% of your work time learning the "How" of your job's "What․"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a general guideline for technical work․ What time someone spends on a job will depend on their specific job responsibilities and other workplace considerations․&lt;/p&gt;

&lt;p&gt;The purpose is to allow time for a technical evaluation․&lt;/p&gt;

&lt;h3&gt;
  
  
  What should you investigate?
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;Learn more about how a feature in a framework works․&lt;/li&gt;
&lt;li&gt;Build using an architecture you are not familiar with․&lt;/li&gt;
&lt;li&gt;Talk about possible solutions to a technical problem․&lt;/li&gt;
&lt;li&gt;Investigate a performance problem․&lt;/li&gt;
&lt;li&gt;Create a small proof-of-concept project․&lt;/li&gt;
&lt;li&gt;Compare the limitations of a library already used in production․&lt;/li&gt;
&lt;li&gt;Learn about new technologies that may improve existing engineering solutions to problems․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Key difference: using &lt;code&gt;vitamin D&lt;/code&gt; vs․ &lt;code&gt;learning about it&lt;/code&gt;․ Reading documentation is useful․ But trying a small experiment yourself gives you some hands-on knowledge of the topic․ Document your results․&lt;/p&gt;

&lt;h3&gt;
  
  
  The R&amp;amp;D loop
&lt;/h3&gt;

&lt;p&gt;A simple approach:&lt;/p&gt;

&lt;p&gt;1․ &lt;strong&gt;Question&lt;/strong&gt;: State something you do not fully understand․&lt;/p&gt;

&lt;p&gt;2․ &lt;strong&gt;Research&lt;/strong&gt;: Study manuals and other materials and technical discussion forums related to the technology․&lt;/p&gt;

&lt;p&gt;3․ &lt;strong&gt;Experiment&lt;/strong&gt;: Build a basic prototype․&lt;/p&gt;

&lt;p&gt;4․ &lt;strong&gt;Evaluate&lt;/strong&gt;: Compare expected and observed behaviors․&lt;/p&gt;

&lt;p&gt;5․ &lt;strong&gt;Documentation&lt;/strong&gt;: Describe uses other than the one studied and problems discovered․&lt;/p&gt;

&lt;p&gt;Not all experiments have to become production code․ Sometimes the key result of a project is that you learn to pass up a potential opportunity․ That is a step forward in engineering․&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ 3. Architectural Reasoning: Understand the Consequences of Decisions
&lt;/h2&gt;

&lt;p&gt;Technical Expertise is particularly valuable to engineers who communicate with others about different aspects of a project․ Actions taken by local engineers during implementation may affect other elements of a system․ A new abstraction creates new dependencies․ Useful integration features may create risks․ Simple data design choices may have high future costs․ Architectural thinking includes weighing the pros and cons of various design options․ Architectural thinking does not mean making all implementation decisions at an architectural level․ Architectural thinking does mean avoiding certain implementation decisions with future costs․&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluate trade-offs, not just implementation speed
&lt;/h3&gt;

&lt;p&gt;Consider other factors‚ in addition to implementation time․ Here are three approaches to background tasks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Advantages&lt;/th&gt;
&lt;th&gt;Disadvantages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Synchronous processing&lt;/td&gt;
&lt;td&gt;Ease of implementation&lt;/td&gt;
&lt;td&gt;Response times and availability issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background worker&lt;/td&gt;
&lt;td&gt;Separation of request and processing&lt;/td&gt;
&lt;td&gt;Higher operational costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message broker&lt;/td&gt;
&lt;td&gt;Decoupling and independent scaling&lt;/td&gt;
&lt;td&gt;Message delivery guarantees and other distributed-computing concerns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is no correct answer to this question․ The best method depends on several factors related to system design and other considerations that affect system performance․ An engineer with an architectural background asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What issue are we addressing?&lt;/li&gt;
&lt;li&gt;What assumptions does this design make?&lt;/li&gt;
&lt;li&gt;What happens if one of the components fails?&lt;/li&gt;
&lt;li&gt;What are the implications of this approach as the system grows?&lt;/li&gt;
&lt;li&gt;What operational challenges will arise?&lt;/li&gt;
&lt;li&gt;Is this a style other engineers can easily understand and support?&lt;/li&gt;
&lt;li&gt;When would this proposed action no longer be appropriate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The aim is not to prepare for every future requirement․ The aim is to make smart decisions about present needs․&lt;/p&gt;

&lt;h3&gt;
  
  
  Make important decisions visible
&lt;/h3&gt;

&lt;p&gt;If a technical decision has long-term architectural impacts‚ document it․ Documented technical decisions are known as &lt;code&gt;Architecture Decision Records (ADRs)&lt;/code&gt; and may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context and problem․&lt;/li&gt;
&lt;li&gt;Considered alternatives․&lt;/li&gt;
&lt;li&gt;The selected approach․&lt;/li&gt;
&lt;li&gt;Reasons for making the decision․&lt;/li&gt;
&lt;li&gt;Expected risks and limitations․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents loss of valuable technical knowledge held only by one individual․ This approach also makes it easier to modify the work in the future․&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ The Anti-Pattern: Copy-Paste Engineering
&lt;/h2&gt;

&lt;p&gt;One of the anti-patterns directly listed by CRAFTER Technical Mastery is &lt;strong&gt;Copy-paste engineering&lt;/strong&gt;․ Copying code isn't necessarily unethical․ It's common and often encouraged for developers to rely on others' sample code and designs‚ along with preexisting libraries and patterns․ Unethical behavior includes copying without making an effort to learn․ Consider the following situation․ A software engineer encounters a new technical problem and finds a relevant code sample online․ She copies the code sample and makes small modifications for use in her own project․ The project is completed successfully‚ though the engineer does not know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reasons for the initial decision․&lt;/li&gt;
&lt;li&gt;Assumptions made in favor of it․&lt;/li&gt;
&lt;li&gt;Whether the assumptions hold for the current system․&lt;/li&gt;
&lt;li&gt;Other dependencies required by the plugin․&lt;/li&gt;
&lt;li&gt;Error handling․&lt;/li&gt;
&lt;li&gt;Whether the copied answer is relevant to the current system architecture․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result will include working code but lack conceptual depth․&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is blind copying and pasting risky?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1․ Context is lost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Code written for one environment may take advantage of features not available in other environments․&lt;br&gt;
An implementation approach that works for small applications is not appropriate for distributed systems․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2․ Complexity accumulates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copied code increases the number of abstraction layers and other requirements and maintenance activities․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3․ Implicit assumptions are a form of technical debt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A solution may work in situations that are not specified or recorded․&lt;br&gt;
When these conditions change‚ the code may be difficult to troubleshoot․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4․ Debugging becomes guesswork&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the engineer is unfamiliar with the component‚ testing the component may involve a process of elimination․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5․ Knowledge doesn't grow or expand&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The immediate emergency need is met․ Other technical needs are not met․&lt;br&gt;
The same risk applies to AI-generated code․&lt;/p&gt;

&lt;p&gt;An AI assistant can implement a solution․ Code produced by an AI assistant may not be secure or appropriate for other reasons to use in your system․ The engineer must be aware of and confirm the outcome․&lt;/p&gt;

&lt;h3&gt;
  
  
  A better approach: Learn‚ Try‚ Confirm
&lt;/h3&gt;

&lt;p&gt;Instead of imitating the design‚ use a systematic process:&lt;/p&gt;

&lt;p&gt;1․ &lt;strong&gt;Understand&lt;/strong&gt;: Learn about the functionality of the original code․&lt;br&gt;
2․ &lt;strong&gt;Evaluate&lt;/strong&gt;: Check assumptions and other requirements and assess effectiveness․&lt;br&gt;
3․ &lt;strong&gt;Adaptation&lt;/strong&gt;: Modify the solution to fit current systems and constraints․&lt;br&gt;
4․ &lt;strong&gt;Test&lt;/strong&gt;: Test under normal and abnormal operation and failure conditions․&lt;br&gt;
5․ &lt;strong&gt;Explain&lt;/strong&gt;: Be ready to discuss the pros and cons of adopting this practice․&lt;/p&gt;

&lt;p&gt;A practical engineering test is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you explain what this code does and how and why it might be affected by changes to underlying assumptions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no‚ additional research may be needed on implementation․&lt;br&gt;
The purpose is not to decrease code reuse․&lt;br&gt;
It is to discourage recycling of code mindlessly․&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 Technical Mastery in the Age of AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;AI coding tools are changing the economics of software development․ Software can be produced more quickly with AI coding tools․ Faster production of software does not always lead to better engineering․&lt;br&gt;
In fact‚ the ability to generate large amounts of code makes Technical Expertise more valuable․&lt;/p&gt;

&lt;p&gt;An engineer who understands the system can apply AI technologies to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore implementation alternatives․&lt;/li&gt;
&lt;li&gt;Generate repetitive code․&lt;/li&gt;
&lt;li&gt;Investigate unfamiliar APIs․&lt;/li&gt;
&lt;li&gt;Create test cases․&lt;/li&gt;
&lt;li&gt;Prototype architectural approaches․&lt;/li&gt;
&lt;li&gt;Improve documentation and other research efforts․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the engineer should verify the results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the generated code follow the system's stylistic guidelines? &lt;/li&gt;
&lt;li&gt;Does it introduce additional dependencies?&lt;/li&gt;
&lt;li&gt;Are concurrency and failure scenarios handled appropriately?&lt;/li&gt;
&lt;li&gt;Does it fit with the domain model?&lt;/li&gt;
&lt;li&gt;Can the implementation be maintained?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI tools should be used to enhance an engineer's capabilities‚ not substitute for an engineer's judgment․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The value of an engineer is not determined by the quantity of code they write but by the quality of the decisions they make about the code they write․&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Technical Mastery as an Engineering Expectation
&lt;/h2&gt;

&lt;p&gt;Technical Mastery in &lt;strong&gt;CRAFTER&lt;/strong&gt; is more than a learning preference․ It is an expectation for CRAFTER engineers․ The &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Engineering.md#-the-crafter-expectations" rel="noopener noreferrer"&gt;CRAFTER Engineering Culture&lt;/a&gt; document describes CRAFTER engineers as self-correcting systems․ One belief associated with Technical Mastery is that technical knowledge is a useful asset that declines with disuse․ Some applications of this belief include the following․&lt;/p&gt;

&lt;h3&gt;
  
  
  Understand before implementing
&lt;/h3&gt;

&lt;p&gt;Expectation at Cognitive Clarity:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you can't answer the questions Why? and How?‚ you're not prepared to write code․&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An engineer should be able to explain and give examples of a problem and the solution to that problem‚ as well as fundamental concepts related to the solution․&lt;/p&gt;

&lt;h3&gt;
  
  
  Reinvest in technical skills
&lt;/h3&gt;

&lt;p&gt;Technical knowledge is not permanent․ Technology and other elements can make previous knowledge obsolete․ Engineers are expected to acquire new technical knowledge every week through exploration and other activities․&lt;/p&gt;

&lt;h3&gt;
  
  
  Protect the conditions for mastery
&lt;/h3&gt;

&lt;p&gt;Technical skills require time and attention․ The Focus principle encourages providing time and attention for workers to learn about new processes and choices․ Technical skills may otherwise be only minimally developed․&lt;/p&gt;

&lt;h3&gt;
  
  
  Make technical decisions explicit
&lt;/h3&gt;

&lt;p&gt;Technical conversations should be formalized․ When making a decision with technical consequences‚ document relevant technical details about the decision and other options‚ as well as expected outcomes․&lt;br&gt;
CRAFTER deals with Decisions and Dispenses with Discussions: Technical decisions should be recorded in ADRs․ Other agreements made in discussions and meetings should not remain undocumented․&lt;/p&gt;

&lt;h3&gt;
  
  
  Take responsibility for what you build
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Technical Skills are linked with Ownership&lt;/strong&gt;․ Engineers shouldn't only be able to write code that compiles․ They should understand the internals of their implementations and other technical information and be interested in and concerned with edge cases and having ownership of their work from beginning to end․ Activities like these can help align individual engineers' interests with the interests of the organization as a whole․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mastery is not best measured by self-assessments of engineers but by how well engineers reason‚ make design choices‚ and create systems․&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Measuring Technical Mastery
&lt;/h2&gt;

&lt;p&gt;Technical skills are hard to evaluate․ Comparing engineers by the number of courses completed and technologies learned is not a good way to evaluate technical skills․ The number of courses and technologies learned tells us nothing about an engineer's technical judgment․&lt;br&gt;
CRAFTER defines three diagnostic indicators of technical skills․ These indicators are intended to identify improvements in engineering capability and should not be used as performance measures to evaluate and monitor an engineer's productivity․&lt;/p&gt;

&lt;h3&gt;
  
  
  1․ Complexity Handling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it measures&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Monitoring completion of more advanced architectural tasks․&lt;/p&gt;

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

&lt;p&gt;An engineer's technical skills are best measured by the engineer's ability to understand and implement more complex engineering tasks․ It doesn't matter how many engineering tasks an engineer has implemented․ What matters is how much more complex an engineering task an engineer can implement․&lt;/p&gt;

&lt;h3&gt;
  
  
  2․ Solution Quality
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it measures&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The number of regression defects found on completed tasks within 30 days of release․&lt;/p&gt;

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

&lt;p&gt;A solution is not valid just because it succeeds in early tests․ Its effectiveness can be tested by using it in its intended environment and with other system elements․ Such tests may reveal problems with testing or design of the component or system․&lt;/p&gt;

&lt;h3&gt;
  
  
  3․ Automation Ratio
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it measures&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The percentage of repetitive manual tasks successfully automated this month․&lt;/p&gt;

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

&lt;p&gt;Repeated manual tasks indicate that you should spend time engineering tools and solutions to eliminate manual tasks․&lt;/p&gt;

&lt;p&gt;Automation reduces errors caused by people and frees engineers to work on more important‚ higher-value projects․&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Mastery Metrics at a glance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Complexity Handling&lt;/td&gt;
&lt;td&gt;Successfully complete all high-architecture assignments&lt;/td&gt;
&lt;td&gt;Evaluate technical skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solution Quality&lt;/td&gt;
&lt;td&gt;Number of bugs and regressions found in completed tasks within 30 days of release&lt;/td&gt;
&lt;td&gt;Identify quality risks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation Rate&lt;/td&gt;
&lt;td&gt;Percentage of routine manual tasks automated this month&lt;/td&gt;
&lt;td&gt;Identify tasks suitable for automation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These actions should be taken into account with other information․&lt;/p&gt;

&lt;p&gt;For example‚ regressive practices may result from poor understanding of customer requirements‚ not a lack of technical skills․ A low level of automation may result from few opportunities to use automation in the job․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metrics are not a type of monitoring․ They are measurements&lt;/strong&gt;․&lt;/p&gt;

&lt;p&gt;Their job is to evaluate the company's engineering processes and look for improvements․&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 What's Next?
&lt;/h2&gt;

&lt;p&gt;Technical skills allow engineers to develop strong systems and make technical judgments․ But knowledge does not automatically result in good outcomes․ &lt;/p&gt;

&lt;p&gt;In the next part of &lt;strong&gt;CRAFTER&lt;/strong&gt;‚ we will address &lt;strong&gt;Execution&lt;/strong&gt;‚ the engineer's capacity to deliver quality outcomes based on knowledge and other inputs․&lt;/p&gt;




&lt;h2&gt;
  
  
  🧬 Conclusion: Mastery Is the Ability to See Beyond the Code
&lt;/h2&gt;

&lt;p&gt;Software engineering is not simply the act of translating requirements into source code. It is the discipline of understanding systems, evaluating constraints, managing complexity, and making decisions that remain useful beyond the immediate implementation. &lt;strong&gt;Technical Mastery&lt;/strong&gt; is built through continuous investigation and deliberate practice.&lt;/p&gt;

&lt;p&gt;It requires engineers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the mechanisms beneath important abstractions.&lt;/li&gt;
&lt;li&gt;Invest time in research and experimentation.&lt;/li&gt;
&lt;li&gt;Reason about architectural consequences.&lt;/li&gt;
&lt;li&gt;Evaluate trade-offs instead of following trends.&lt;/li&gt;
&lt;li&gt;Avoid blind copy-paste engineering.&lt;/li&gt;
&lt;li&gt;Verify generated and borrowed solutions.&lt;/li&gt;
&lt;li&gt;Learn from defects and improve technical decisions.&lt;/li&gt;
&lt;li&gt;Share knowledge so that expertise becomes part of the engineering system, not a single person's advantage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cognitive Clarity helps identify the right problem. Focus protects the ability to work on it.&lt;br&gt;
Technical Mastery develops the knowledge and judgment required to solve it well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is not to know every technology. It is to understand enough to make the right engineering decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is Technical Mastery in CRAFTER.&lt;/p&gt;




&lt;p&gt;Software engineering is more than coding a software product․ Software engineering involves learning about systems and making future-oriented decisions․ Building expertise in software engineering requires continuous education and experience․&lt;/p&gt;

&lt;p&gt;It requires engineers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn about the fundamental concepts of important abstractions․&lt;/li&gt;
&lt;li&gt;Take time to research and experiment․&lt;/li&gt;
&lt;li&gt;Consider architectural issues․&lt;/li&gt;
&lt;li&gt;Make trade-offs instead of decisions based on fashion trends․&lt;/li&gt;
&lt;li&gt;Do not simply reuse objects without checking if they are appropriate․&lt;/li&gt;
&lt;li&gt;Review current and proposed solutions․&lt;/li&gt;
&lt;li&gt;Use defect reports to make better technical decisions․&lt;/li&gt;
&lt;li&gt;Share knowledge to help other members of the engineering team gain your expertise․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cognitive Clarity helps you identify problems to work on․ Concentration helps you stay focused on the problems you're working on․&lt;br&gt;
Technical knowledge helps ensure that the person asked to address the issue has the necessary knowledge and skills to do so․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is not to be familiar with all technologies․ The goal is to be familiar enough with each technology to make responsible engineering decisions․&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is Technical Mastery in CRAFTER․&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS" rel="noopener noreferrer"&gt;CRAFTER-OS Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/CRAFTER.md#-t--technical-mastery" rel="noopener noreferrer"&gt;CRAFTER Framework - Technical Mastery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Engineering.md#-the-crafter-expectations" rel="noopener noreferrer"&gt;CRAFTER Engineering Culture - The CRAFTER Expectations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Metrics.md#-t--technical-mastery" rel="noopener noreferrer"&gt;CRAFTER Metrics - Technical Mastery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Playbook.md" rel="noopener noreferrer"&gt;CRAFTER Playbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.braingrid.ai/blog/architecture-decision-records-for-ai-coding-agents" rel="noopener noreferrer"&gt;Architecture Decision Records for AI Coding Agents, BrainGrid AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>CRAFTER Focus: How to protect your hours of Deep Work every day (Part 3)</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:28:49 +0000</pubDate>
      <link>https://dev.to/hawkn113/crafter-focus-how-to-protect-your-hours-of-deep-work-every-day-part-3-50nd</link>
      <guid>https://dev.to/hawkn113/crafter-focus-how-to-protect-your-hours-of-deep-work-every-day-part-3-50nd</guid>
      <description>&lt;p&gt;You know what's required for the project․ You know the project limitations and deliverables․ You know what to build for the project․&lt;/p&gt;

&lt;p&gt;You open your IDE․ You write code․ You make progress․&lt;/p&gt;

&lt;p&gt;Then you get a message․ A meeting is scheduled․ A new time-sensitive task arises․ You're asked to review some code․ When you return to your original task‚ you may have forgotten some information about it․&lt;/p&gt;

&lt;p&gt;The problem is not self-control․&lt;/p&gt;

&lt;p&gt;It is the absence of protection for sustained effort․&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/hawkn113/crafter-clarity-why-real-engineering-starts-before-your-ide-part-2-gg7"&gt;Part 2&lt;/a&gt;‚ we discussed reasons that real engineering means clarity‚ not coding․&lt;/p&gt;

&lt;p&gt;Now‚ my next question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Once you have a plan‚ what strategies can you use to maintain mental resources for executing the plan?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a function of &lt;strong&gt;Focus&lt;/strong&gt;‚ one of the &lt;strong&gt;F&lt;/strong&gt; in CRAFTER․&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Cost of Multitasking
&lt;/h2&gt;

&lt;p&gt;Modern software engineering is typically a group effort․&lt;/p&gt;

&lt;p&gt;A developer's day could include tasks such as using an IDE and other collaboration software‚ including Slack and Teams‚ reviewing and working on pull requests‚ attending meetings‚ checking production alerts‚ and engaging in other conversations about unrelated tasks․&lt;/p&gt;

&lt;p&gt;Individual activities may be fine․ Frequent and unpredictable switches between activities are a concern․&lt;/p&gt;

&lt;p&gt;Consider a developer working on a complex business rule․ That developer learns about the domain and business rule and other relevant information and begins writing code to implement the business rule․&lt;/p&gt;

&lt;p&gt;Then they receive a notification․&lt;/p&gt;

&lt;p&gt;The interruption could last one minute․ Costs of the interruption include the time it takes the developer to resume work‚ including recalling prior thoughts and tasks and any assumptions helpful to completing the task․&lt;/p&gt;

&lt;p&gt;This is an additional cost of context switching․&lt;/p&gt;

&lt;p&gt;The cost is not only the time spent replying to the message․ It also includes time spent refocusing on what you were working on before receiving the message․&lt;/p&gt;

&lt;p&gt;Repeated interruptions can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additional time required for orientation․&lt;/li&gt;
&lt;li&gt;Increased risk of overlooking corner cases․&lt;/li&gt;
&lt;li&gt;Longer debugging time and development cycle․&lt;/li&gt;
&lt;li&gt;More unfinished and poorly made work․&lt;/li&gt;
&lt;li&gt;Less confidence in estimates or other commitments made about delivery times․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to prevent collaboration․ Software engineering is a collaborative process․&lt;/p&gt;

&lt;p&gt;The goal of the project is to develop conventions for working together that make it possible for engineering workers to perform difficult cognitive tasks․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus is not the same as working more․ Focus means reducing distractions that keep you from doing other work&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Deep Work as a Protected Engineering Resource
&lt;/h2&gt;

&lt;p&gt;Deep Work is prolonged‚ focused concentration on a challenging task․&lt;/p&gt;

&lt;p&gt;Options for software engineers include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Educating yourself about a topic that you know little about․&lt;/li&gt;
&lt;li&gt;Implementing well․&lt;/li&gt;
&lt;li&gt;Testing a production defect․&lt;/li&gt;
&lt;li&gt;Refactoring a complex part․&lt;/li&gt;
&lt;li&gt;Evaluating architectural trade-offs․&lt;/li&gt;
&lt;li&gt;Proof of concept․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These projects require skills beyond those needed to write code using an IDE․ They require skills related to maintaining mental models over time․&lt;/p&gt;

&lt;p&gt;CRAFTER sees &lt;strong&gt;Deep Work as a useful guide and resource&lt;/strong&gt;․&lt;/p&gt;

&lt;p&gt;A general aim for most jobs is to dedicate 2-4 hours a day to Deep Work‚ if that much time is available during the workday․ This can be a goal for most people in most jobs․ It is not a general requirement or average time dedication for most jobs․&lt;/p&gt;

&lt;p&gt;Some days include more meetings‚ code reviews‚ help with other people's problems‚ pair programming‚ system outages‚ and other interruptions․ Less time may be appropriate on some days․&lt;/p&gt;

&lt;p&gt;The operational goal is not to earn a specific number of hours․&lt;/p&gt;

&lt;p&gt;It is intended to &lt;strong&gt;protect time for work-related activities from other demands&lt;/strong&gt;․&lt;/p&gt;

&lt;p&gt;For framework principles‚ see &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/CRAFTER.md#-f--focus" rel="noopener noreferrer"&gt;CRAFTER‚ (F) Focus&lt;/a&gt;․&lt;/p&gt;

&lt;h3&gt;
  
  
  Plan the code block outside the IDE
&lt;/h3&gt;

&lt;p&gt;A focus group should have a purpose․&lt;/p&gt;

&lt;p&gt;Instead of writing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Work on payment processing․&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Define a concrete outcome:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Monitor payment status updates and identify the missing validation․ Develop a minimal implementation with tests․&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Having a clear agenda reduces the amount of discussion required during the meeting․&lt;/p&gt;

&lt;p&gt;Before starting‚ establish:&lt;/p&gt;

&lt;p&gt;1․ &lt;strong&gt;Outcome&lt;/strong&gt;: What statement should be true at the end of a session?&lt;br&gt;
2․ &lt;strong&gt;Boundaries&lt;/strong&gt;: What parts of the system are included?&lt;br&gt;
3․ &lt;strong&gt;Next steps&lt;/strong&gt;: What is the first concrete step to take?&lt;br&gt;
4․ &lt;strong&gt;Interruptibility policy&lt;/strong&gt;: What other events can interrupt the session?&lt;/p&gt;

&lt;p&gt;This learning outcome is associated with the Focus concept taught in the CRAFTER course module Cognitive Clarity․&lt;/p&gt;

&lt;p&gt;Clarity provides direction․ Persistence ensures you can continue on the path․&lt;/p&gt;




&lt;h2&gt;
  
  
  🔕 The Zero-Noise Protocol
&lt;/h2&gt;

&lt;p&gt;The Zero-Noise Protocol is a technique for protecting work time from interruptions and other distractions․&lt;/p&gt;

&lt;p&gt;During the block:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slack and Teams notifications are turned off․&lt;/li&gt;
&lt;li&gt;Notifications on the phone are disabled․&lt;/li&gt;
&lt;li&gt;Email notifications disabled․&lt;/li&gt;
&lt;li&gt;Unrelated browser tabs and programs are closed․&lt;/li&gt;
&lt;li&gt;Incoming requests are executed at the end of each block except in cases of predefined interrupt conditions․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The purpose is not to become unreachable․&lt;/p&gt;

&lt;p&gt;It is to distinguish between &lt;strong&gt;default&lt;/strong&gt; and &lt;strong&gt;mandatory&lt;/strong&gt; availability․&lt;/p&gt;

&lt;h3&gt;
  
  
  Define an emergency exception
&lt;/h3&gt;

&lt;p&gt;A protocol that fails to handle emergent situations is not good engineering practice․&lt;/p&gt;

&lt;p&gt;Teams should plan how to respond to emergency situations․ Possible responses include an emergency chat channel‚ phone call‚ and other incident-related approaches․&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Production problems with the customer experience can break the blackout period․&lt;/li&gt;
&lt;li&gt;A security incident may result in a block being compromised․&lt;/li&gt;
&lt;li&gt;A common status-related question can be answered later․&lt;/li&gt;
&lt;li&gt;Optional code review during a future shared work period․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specific requirements depend on the team's needs and objectives․&lt;/p&gt;

&lt;p&gt;The main concern is making exceptions explicit‚ not according to how urgent other warnings are believed to be․&lt;/p&gt;

&lt;h3&gt;
  
  
  Make the protocol visible
&lt;/h3&gt;

&lt;p&gt;A status label can inform other employees about the arrangement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deep Work through 11:00․ Ways to reach me for general questions: leave a message․ Way to reach me for production crises: same as before․&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This tells your coworkers when you are available without them having to guess when you are available․&lt;/p&gt;

&lt;h3&gt;
  
  
  Protect the group‚ not just the individual․
&lt;/h3&gt;

&lt;p&gt;Zero-Noise works best as a team practice․&lt;/p&gt;

&lt;p&gt;If one engineer does not want to receive notifications and the other engineers want rapid responses‚ this process will be difficult to sustain․&lt;/p&gt;

&lt;p&gt;Teams can take steps to mitigate these problems‚ including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Predictable collaboration windows․&lt;/li&gt;
&lt;li&gt;Designated authority to provide emergency services․&lt;/li&gt;
&lt;li&gt;Explicit response-time expectations․&lt;/li&gt;
&lt;li&gt;Policies about how to escalate incidents․&lt;/li&gt;
&lt;li&gt;Time off meetings‚ where possible․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Zero-Noise is not a communication method․ Zero-Noise is an agreement between team members to reduce disruptions to focused work while remaining available for operational purposes&lt;/strong&gt;․&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Default Asynchronous Communication Tools
&lt;/h2&gt;

&lt;p&gt;Some interviews can be done other than in person․&lt;/p&gt;

&lt;p&gt;Many discussions between engineers can be done asynchronously to allow them to participate in discussions at times that suit them best and other work activities․&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Routine status updates․&lt;/li&gt;
&lt;li&gt;Justifications that do not interfere with work․&lt;/li&gt;
&lt;li&gt;Code review comments․&lt;/li&gt;
&lt;li&gt;Documentation questions․&lt;/li&gt;
&lt;li&gt;Design proposals․&lt;/li&gt;
&lt;li&gt;Feedback requests where timing is not important․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asynchronous communication does not mean failing to communicate․ Asynchronous communication means choosing the right communication channels‚ depending on the complexity and urgency of the topic․&lt;/p&gt;

&lt;h3&gt;
  
  
  Write texts to reduce communication effort
&lt;/h3&gt;

&lt;p&gt;A good communication from an engineer provides enough information that the recipient of the communication does not have to ask questions to learn more about the problem․&lt;/p&gt;

&lt;p&gt;A practical structure is:&lt;/p&gt;

&lt;p&gt;1․ &lt;strong&gt;Context&lt;/strong&gt;: What project are you working on?&lt;br&gt;
2․ &lt;strong&gt;Problem&lt;/strong&gt;: What is unclear or hard to understand?&lt;br&gt;
3․ &lt;strong&gt;Evidence&lt;/strong&gt;: What have you already checked?&lt;br&gt;
4․ &lt;strong&gt;Decision required&lt;/strong&gt;: Response or other action needed from you?&lt;br&gt;
5․ &lt;strong&gt;Timeline&lt;/strong&gt;: How quickly does the person need the information?&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;: I am mapping payment statuses․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: The status value returned by the external API is not one of the defined enum values in our application․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence&lt;/strong&gt;: Existing maps show three possible statuses․ The latest answer adds a new value to the possible set of values․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision required&lt;/strong&gt;: Map the new status to an existing internal status or add a new internal status?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deadline&lt;/strong&gt;: I need to know by the end of today's map-making session․&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is better than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you do me a favor when you have time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first message gives the recipient useful information for making a decision․ It also explicitly tells the recipient what decision to make․&lt;/p&gt;

&lt;h3&gt;
  
  
  Use collaboration windows
&lt;/h3&gt;

&lt;p&gt;A team can establish times when team members will respond to general communications․&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Morning hours are typically reserved for planning and other urgent work․&lt;/li&gt;
&lt;li&gt;Midday: answering questions and collaborating with other employees․&lt;/li&gt;
&lt;li&gt;Afternoon: more study time‚ if needed‚ depending on other commitments․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are recommendations‚ not rules․ Teams should adapt these recommendations to their locale and other team considerations․&lt;/p&gt;

&lt;p&gt;The aim is to reduce interruptions while not substantially increasing total communication time․&lt;/p&gt;

&lt;h3&gt;
  
  
  When synchronous communication is needed
&lt;/h3&gt;

&lt;p&gt;Some issues are best resolved in a short phone conversation․ I would use this method in the following situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a complicated problem with several ways to interpret it․&lt;/li&gt;
&lt;li&gt;Multiple individuals need to reach a decision through negotiation․&lt;/li&gt;
&lt;li&gt;The team is responding to an incident․&lt;/li&gt;
&lt;li&gt;Written debates are getting in the way of communication․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asynchronous communication should be the default for many work tasks‚ not a religious stance against other types of communication․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The policy is to communicate using whatever method is easiest for you to use that effectively resolves the problem without creating other problems&lt;/strong&gt;․&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Context Switching and Technical Responsibility
&lt;/h2&gt;

&lt;p&gt;Interruptions are one source of fragmentation․ Work in process is another source of fragmentation․&lt;/p&gt;

&lt;p&gt;When an engineer has multiple tasks to complete‚ these competing tasks distract the engineer․ In the absence of other distractions‚ the engineer will be thinking frequently about how to prioritize tasks and recall information about incomplete projects․&lt;/p&gt;

&lt;p&gt;This creates internal context switching․&lt;/p&gt;

&lt;p&gt;CRAFTER offers a solution with a simple rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limit Work In Progress (WIP) to no more than three active projects&lt;/strong&gt;․&lt;/p&gt;

&lt;p&gt;This is a policy imposed to encourage good prioritizing․ It is not a policy that every engineer or team should have exactly three tasks․&lt;/p&gt;

&lt;p&gt;The idea is not to overextend yourself and to finish important projects․&lt;/p&gt;

&lt;h3&gt;
  
  
  Differentiate current jobs from queued jobs
&lt;/h3&gt;

&lt;p&gt;A task need not be completely forgotten because we are not currently performing it․&lt;/p&gt;

&lt;p&gt;Have a list of potential future projects ready‚ but work on a limited number of projects․&lt;/p&gt;

&lt;p&gt;For each task you were given‚ include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its intended outcome․&lt;/li&gt;
&lt;li&gt;Its current state․&lt;/li&gt;
&lt;li&gt;The next step in the process․&lt;/li&gt;
&lt;li&gt;Any blocking dependency․&lt;/li&gt;
&lt;li&gt;Rules for deciding when an investigation is complete․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a new request is made‚ do not add it to the list of current requests․&lt;/p&gt;

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

&lt;p&gt;1․ Is it more important than what you're doing now?&lt;br&gt;
2․ Do I need to act now?&lt;br&gt;
3․ If it needs to be active‚ what other process will be delayed?&lt;br&gt;
4․ Who should know about this change?&lt;/p&gt;

&lt;p&gt;This makes it clear about extras and prevents additional requests from being added without the requester's knowledge․&lt;/p&gt;

&lt;h3&gt;
  
  
  Ownership means maintaining continuity
&lt;/h3&gt;

&lt;p&gt;Technical ownership doesn't mean you will be working alone․&lt;/p&gt;

&lt;p&gt;An engineer can depend on other engineers and peer reviews‚ as well as a product owner․ Responsibilities of an engineer include maintaining the continuity of a project and other forms of communication about the work done on the project․&lt;/p&gt;

&lt;p&gt;A task should not depend on the memory of a single person․&lt;/p&gt;

&lt;p&gt;Document important decisions or assumptions and next steps in an appropriate place‚ such as a ticket‚ pull request‚ or Architecture Decision Record (ADR)․&lt;/p&gt;

&lt;p&gt;This can speed your recovery from interruptions and help you work with others by assigning tasks and providing information․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good ownership reduces the mental burden of picking up work on projects for engineers and other staff&lt;/strong&gt;․&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Methods for Measuring Employee Focus Without Surveillance
&lt;/h2&gt;

&lt;p&gt;CRAFTER offers Focus tools to help spot trends that make it harder to implement engineering solutions․&lt;/p&gt;

&lt;p&gt;Metrics are best used to identify issues․ They are not good for evaluating or monitoring engineers' performance or progress․&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deep Work Time&lt;/td&gt;
&lt;td&gt;Recommended goal: 2–4 hours per day‚ depending on role and other considerations&lt;/td&gt;
&lt;td&gt;Determine if sufficient time is available for deep work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WIP Limit&lt;/td&gt;
&lt;td&gt;Three or fewer tasks in progress&lt;/td&gt;
&lt;td&gt;Reduce multitasking and task switching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notifications&lt;/td&gt;
&lt;td&gt;Record interruptions while engaged in Deep Work&lt;/td&gt;
&lt;td&gt;Identify sources of avoidable distraction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These actions are useful only with other information․&lt;/p&gt;

&lt;p&gt;A low Deep Work score could mean you attended many meetings and completed other collaborative tasks․ It could also mean you had a busy day in other ways․ A low Deep Work score doesn't necessarily indicate poor performance․&lt;/p&gt;

&lt;p&gt;A high level of interruptions for a team suggests that process problems may exist for the team as a whole‚ including unclear escalation rules‚ rather than personal problems with a single team member․&lt;/p&gt;

&lt;p&gt;Likewise‚ meeting a numerical objective does not mean good engineering has been performed․&lt;/p&gt;

&lt;p&gt;The goal is to ask better questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do engineers have enough uninterrupted time for complex work?&lt;/li&gt;
&lt;li&gt;Are interruptions preventing other work from being done at planned times?&lt;/li&gt;
&lt;li&gt;Do you have several tasks to work on?&lt;/li&gt;
&lt;li&gt;Do interruptions occur in particular workflows or processes?&lt;/li&gt;
&lt;li&gt;What small change can we implement to make things better for team members?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use answers to improve the system․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure the conditions of execution‚ not the engineer's worth as an engineer&lt;/strong&gt;․&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Metrics.md#-f--focus" rel="noopener noreferrer"&gt;CRAFTER Focus Metrics&lt;/a&gt; on this GitHub repository page for metric definitions related to the framework․&lt;/p&gt;




&lt;h2&gt;
  
  
  🗓️ Your Daily Priorities Process
&lt;/h2&gt;

&lt;p&gt;CRAFTER's daily activities follow the Focus process principles․&lt;/p&gt;

&lt;h3&gt;
  
  
  1․ Pre-Flight‚ 10 minutes
&lt;/h3&gt;

&lt;p&gt;Before beginning demanding work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review current priorities․&lt;/li&gt;
&lt;li&gt;Choose one key task to focus on․&lt;/li&gt;
&lt;li&gt;Help establish the goal or objective․&lt;/li&gt;
&lt;li&gt;Determine relationships and knowledge gaps․&lt;/li&gt;
&lt;li&gt;Prepare equipment and disable notifications for apps you don't need․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The purpose of the warm-up is to prepare for activities in the session rather than spend some session time deciding what to do in the session․&lt;/p&gt;

&lt;h3&gt;
  
  
  2․ Deep Work‚ Breaking the Noise Barrier
&lt;/h3&gt;

&lt;p&gt;Focus on completing the assigned task without other interruptions․&lt;/p&gt;

&lt;p&gt;Remind yourself why you are doing something․ Don't get distracted by new tasks because you think they are interesting or important․&lt;/p&gt;

&lt;p&gt;If you need to work together‚ write a question and use other communication methods as needed‚ unless an exception to the block agreement applies․&lt;/p&gt;

&lt;p&gt;The length of protected time should be reasonable given the length of the project and the workday․ It's better to protect less time than to set unachievable goals․&lt;/p&gt;

&lt;h3&gt;
  
  
  3․ 20-Minute Rule
&lt;/h3&gt;

&lt;p&gt;If meaningful progress isn't being made over a period of 20 minutes‚ stop using strategies that aren't working․&lt;/p&gt;

&lt;p&gt;Pause and reassess․&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set goals for yourself․&lt;/li&gt;
&lt;li&gt;Assess what you know and what you don't know․&lt;/li&gt;
&lt;li&gt;Present a flowchart or other graphic illustrating the relevant relationships․&lt;/li&gt;
&lt;li&gt;Assess assumptions and other facts․&lt;/li&gt;
&lt;li&gt;Determine if other actions or help may be needed․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This policy is not designed to prevent students from attempting to work through difficult problems for 20 minutes․ Rather‚ it is designed to encourage students to try different approaches if they work on a problem for 20 minutes without success․&lt;/p&gt;

&lt;p&gt;Sometimes the best option is to do more research․ Sometimes the best option is to seek advice from a subject-matter expert․ Sometimes the best option is to reconsider the question itself․&lt;/p&gt;

&lt;p&gt;The important thing is to perform the next step mindfully․&lt;/p&gt;

&lt;h3&gt;
  
  
  4․ Postflight‚ 10 minutes
&lt;/h3&gt;

&lt;p&gt;End the session with a review of session highlights․&lt;/p&gt;

&lt;p&gt;Possible applications are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a commit․&lt;/li&gt;
&lt;li&gt;Creating or updating a pull request․&lt;/li&gt;
&lt;li&gt;Reporting the results of the study․&lt;/li&gt;
&lt;li&gt;Updating status information for the task․&lt;/li&gt;
&lt;li&gt;Documenting a decision or challenge․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;strong&gt;introduce an action item for the next meeting&lt;/strong&gt;: Note an action step to be performed at the next meeting․&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Next: Test for an unknown payment status․ Use the results of the test to modify the mapping function according to your expected internal state․&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This small step can save time and effort in reestablishing project background information later․&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Playbook.md#-daily-protocol-the-core-loop" rel="noopener noreferrer"&gt;CRAFTER Daily Protocol: The Core Loop&lt;/a&gt;for instructions on this process․&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Quick Answer: Introduce Focus This Week
&lt;/h2&gt;

&lt;p&gt;You don't need to do anything differently than what your team members are doing to begin․&lt;/p&gt;

&lt;p&gt;Try a small experiment:&lt;/p&gt;

&lt;p&gt;1․ &lt;strong&gt;Choose a task&lt;/strong&gt;․ Look for a task you can continue working on․&lt;br&gt;
2․ &lt;strong&gt;Set aside time specifically for work&lt;/strong&gt;․ 45-90 minutes may work well‚ accounting for other obligations․&lt;br&gt;
3․ &lt;strong&gt;Suppressing‌ Other Alerts&lt;/strong&gt;․ Disable other alerts and specify a way‌ to alert workers in an emergency․&lt;br&gt;
4․‌ &lt;strong&gt;Limit work in progress&lt;/strong&gt;․ Train staff to handle no more than three tasks at once and make trade-offs visible when‌ priorities change․&lt;br&gt;
5․ &lt;strong&gt;Provide feedback&lt;/strong&gt;․ Take time to record accomplishments and next steps before starting other tasks․&lt;br&gt;
6․ &lt;strong&gt;Evaluate the experiment&lt;/strong&gt;․ Determine which interruptions could have been avoided during the experiment and ways to prevent interruptions in future experiments․&lt;/p&gt;

&lt;p&gt;Don't evaluate the experiment based on the amount of time you spent without notifications․&lt;/p&gt;

&lt;p&gt;Determine whether it helped you finish tasks more quickly by reducing the number of times you had to switch between tasks․&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 What's Next?
&lt;/h2&gt;

&lt;p&gt;Focus aids performance on implementation-related tasks․ Other skills that help engineers throughout their careers include adaptability to new information and other implementation-related issues․&lt;/p&gt;

&lt;p&gt;In the next part of CRAFTER, we will explore &lt;strong&gt;Technical Mastery&lt;/strong&gt;: how engineers develop and apply technical expertise to build reliable systems, make sound engineering decisions, and maintain sustainable execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧬 Conclusion: Focusing Is an Engineering Skill❤️
&lt;/h2&gt;

&lt;p&gt;Engineering productivity isn't just about typing faster or responding to more emails․&lt;/p&gt;

&lt;p&gt;Complex tasks require time to understand a problem and develop and maintain knowledge of a problem‚ including considering and balancing other factors‚ to apply effective solutions․&lt;/p&gt;

&lt;p&gt;Interruptions to this kind of work have costs beyond lost time by workers completing interrupted tasks․ Other costs of interruptions include decreased worker concentration and quality and increased uncertainty about when tasks will be completed․&lt;/p&gt;

&lt;p&gt;CRAFTER Focus offers a number of practical solutions to this problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protect time for Deep Work․&lt;/li&gt;
&lt;li&gt;Apply Zero-Noise policies and have clear emergency procedures․&lt;/li&gt;
&lt;li&gt;Communicate asynchronously when you can․&lt;/li&gt;
&lt;li&gt;Decrease work in progress․&lt;/li&gt;
&lt;li&gt;Demonstrate technical knowledge and leadership by sharing visible decisions and next steps․&lt;/li&gt;
&lt;li&gt;Introduce measures to assess work conditions‚ not individual employees․&lt;/li&gt;
&lt;li&gt;Wind down at the end of each session so you can easily start the next session․&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These methods won't completely prevent interruptions․ They don't need to․ Engineering is a social profession that requires collaboration‚ responsiveness‚ and adaptability․&lt;/p&gt;

&lt;p&gt;The purpose of the method is to reduce‚ not increase‚ distractions; foster‚ not hinder‚ collaboration; and eliminate‚ not require‚ self-discipline․&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus is more than concentration․ Focus involves setting up the proper environment for concentration to be effective&lt;/strong&gt;․&lt;/p&gt;

&lt;p&gt;That is what Focus is in CRAFTER․&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS" rel="noopener noreferrer"&gt;CRAFTER-OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/CRAFTER.md#-f--focus" rel="noopener noreferrer"&gt;CRAFTER Framework: Focus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Metrics.md#-f--focus" rel="noopener noreferrer"&gt;CRAFTER Focus Metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://calnewport.com/" rel="noopener noreferrer"&gt;Deep Work — Cal Newport&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>CRAFTER Clarity: Why Real Engineering Starts Before Your IDE (part 2)</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:38:07 +0000</pubDate>
      <link>https://dev.to/hawkn113/crafter-clarity-why-real-engineering-starts-before-your-ide-part-2-gg7</link>
      <guid>https://dev.to/hawkn113/crafter-clarity-why-real-engineering-starts-before-your-ide-part-2-gg7</guid>
      <description>&lt;p&gt;Every developer has seen a bug in production that takes several days to fix and it is rarely due to a missing semicolon: it is usually due to misunderstanding a requirement. Hours were spent debugging code only to find it was solving the wrong problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is the hidden cost of unclear thinking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/hawkn113/crafter-a-cognitive-execution-layer-for-sustainable-engineering-part-1-idn"&gt;Part 1&lt;/a&gt;, we defined the engineer as the primary system and its main enemy: execution variance. Without Cognitive Clarity as the first control point, execution variance becomes much harder to control:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ambiguity -&amp;gt; Guesswork -&amp;gt; Rework -&amp;gt; Variability of Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real engineering doesn't start in the IDE. It starts on paper or in a structured design doc when you establish two explicit boundaries:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What exactly am I building?&lt;/li&gt;
&lt;li&gt;How will I know it's done?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Clarity is the compiler of your mental model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ambiguous input -&amp;gt; Ambiguous mental model -&amp;gt; Implementation variance -&amp;gt; Rework
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Garbage in, garbage out.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏛️ The 3 Pillars of Cognitive Clarity
&lt;/h2&gt;

&lt;p&gt;Cognitive Clarity is based on the principles laid out by the &lt;a href="https://github.com/HawkN113/CRAFTER-OS" rel="noopener noreferrer"&gt;CRAFTER-OS&lt;/a&gt; repository, which are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First-Principles Thinking: Break down the project into the most simple truths and constraints, rather than following patterns from a previous project or what you find online.&lt;/li&gt;
&lt;li&gt;Radical Simplification: "If you can't explain the logic in two minutes, you don't understand it yet."&lt;/li&gt;
&lt;li&gt;"Definition of Done" Awareness: Clear, unambiguous understanding of finish criteria before writing the first line of code.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;CRAFTER Rule:&lt;br&gt;
Don't touch the keyboard until you can map it out on paper.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📋 The CRAFTER Expectations
&lt;/h2&gt;

&lt;p&gt;Keeping the code readable is subject to opinion, but it is specifically mentioned that it is a requirement within &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Engineering.md#-the-crafter-expectations" rel="noopener noreferrer"&gt;The CRAFTER Expectations&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cognitive Clarity: Think from first principles and establish deterministic boundaries before touching the code.&lt;/li&gt;
&lt;li&gt;Decision, not Discussion: A written decision is the only way to maintain the rationale for critical technical decisions across iterations of execution.&lt;/li&gt;
&lt;li&gt;Standard over Mood: We don't wait for "inspiration" We follow the protocol.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The Anchor Principle:&lt;br&gt;
"If you can't explain the 'Why' and the 'How,' you are not ready to code."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the proposed engineering baseline from the CRAFTER.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ The Enemy: Guess-Driven Development (GDD)
&lt;/h2&gt;

&lt;p&gt;Guess-Driven Development (GDD) is the anti-pattern of taking on a vaguely defined problem and attempting to "figure it out as you go".&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptoms of GDD:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"I think it should work something like this..."&lt;/li&gt;
&lt;li&gt;"Let me just start coding and we'll see where it breaks."&lt;/li&gt;
&lt;li&gt;"It's all written in the ticket" (when the ticket has two lines of unverified assumptions).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Systemic Consequences:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Upstream Waste: Time spent on code and pull requests that are inevitably rewritten.&lt;/li&gt;
&lt;li&gt;Hidden Technical Debt: "Temporary" hacks born from missing context that calcify in production.&lt;/li&gt;
&lt;li&gt;Loss of Trust: Delivery promises are devalued by post-release bugfixes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 The Cognitive Foundation: Systems &amp;amp; Architecture Thinking
&lt;/h2&gt;

&lt;p&gt;Before you can use any tool or template‚ you have to get straight the underlying mental frameworks that make Clarity possible․&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ Systems Thinking
&lt;/h3&gt;

&lt;p&gt;As described in &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Engineering.md#-systems-thinking" rel="noopener noreferrer"&gt;Systems Thinking in CRAFTER&lt;/a&gt;, a CRAFTER engineer will see their execution environment as an interconnected system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks as Systems: Every feature should be a component that can be plugged into the global domain logic and have no side-effects.&lt;/li&gt;
&lt;li&gt;Errors as Signals: Errors can be diagnostic signals indicating issues with boundary contracts or processes.&lt;/li&gt;
&lt;li&gt;Processes as Optimization Targets: Any meeting, deploy step or review friction that doesn't add signal is a bottleneck to refactor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏛️ Architecture Thinking
&lt;/h3&gt;

&lt;p&gt;Architecture Thinking considers a system at the level of its component boundaries, data contracts and long-term trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distinguishing essential complexity (the domain problem) from incidental complexity (the tools).&lt;/li&gt;
&lt;li&gt;Explicitly defining where your task ends and another service's domain begins.&lt;/li&gt;
&lt;li&gt;Structural decisions that scale, as opposed to short-term hacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Connection: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without Systems Thinking, you miss hidden side effects. &lt;/li&gt;
&lt;li&gt;Without Architecture Thinking, you sacrifice long-term maintainability for short-term speed. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both provide foundational capabilities for Cognitive Clarity.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Metrics: Clarity as Operational Signals.
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Metrics.md#-c--cognitive-clarity" rel="noopener noreferrer"&gt;Metrics&lt;/a&gt;, CRAFTER uses operational signals to monitor Cognitive Clarity, which are for diagnosing system bottlenecks. They are not used for surveillance or engineering control.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operational Signal&lt;/th&gt;
&lt;th&gt;What It Measures&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Action If Off-Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Focus Level (1 - 10)&lt;/td&gt;
&lt;td&gt;Subjective daily assessment of task understanding &amp;amp; scope&lt;/td&gt;
&lt;td&gt;&amp;gt;= 7&lt;/td&gt;
&lt;td&gt;Apply the Stall Trigger to requirements immediately.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Switches&lt;/td&gt;
&lt;td&gt;Forced switches between unrelated tasks per day&lt;/td&gt;
&lt;td&gt;&amp;lt; 3 major&lt;/td&gt;
&lt;td&gt;Strengthen calendar defense and batch async updates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requirement Latency&lt;/td&gt;
&lt;td&gt;Time spent blocked waiting for domain clarification&lt;/td&gt;
&lt;td&gt;Tracked&lt;/td&gt;
&lt;td&gt;Escalate blocker asynchronously and re-scope work.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;CRAFTER Diagnostic Heuristic:&lt;br&gt;
Low Clarity + High Change Lead -&amp;gt; High Burnout Risk&lt;br&gt;
Diagnostic Action: Stop the executio, re-plan and ensure a clear state before proceeding.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔍 Diagnostic Signals: Detecting Ambiguity Early
&lt;/h2&gt;

&lt;p&gt;These qualitative signals that clarity is lacking in addition to the quantitative ones, before coding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unclear Definition of Done: Acceptance criteria must be expressed in clear and unambiguous terms.&lt;/li&gt;
&lt;li&gt;Late Clarification Requests: Asking basic business rule questions after implementation work has started.&lt;/li&gt;
&lt;li&gt;Scope Drift: Changing the scope of work within the sprint due to edge cases.&lt;/li&gt;
&lt;li&gt;PR Rework Loops: refactoring pull requests because the reviewer thought differently about the domain.&lt;/li&gt;
&lt;li&gt;Unexplained Architecture: You cannot explain architectural trade-offs to a peer in 2-3 sentences.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using the 20-Minute Stall Trigger
&lt;/h3&gt;

&lt;p&gt;As described in &lt;a href="https://dev.to/hawkn113/crafter-a-cognitive-execution-layer-for-sustainable-engineering-part-1-idn"&gt;Part 1&lt;/a&gt;, a &lt;strong&gt;20-Minute Stall Trigger&lt;/strong&gt; applies to any ambiguity in a requirement.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you've been spinning for more than 20 minutes without a clear path forward on ambiguous requirements, stop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remap the problem on paper. &lt;/li&gt;
&lt;li&gt;Asynchronously raise the issue. &lt;/li&gt;
&lt;li&gt;Request further clarification.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📜 The Mechanisms of Clarity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Definition of Done as a Contract
&lt;/h3&gt;

&lt;p&gt;First sign the contract, then open the IDE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product Dimension: What invariant properties must the output satisfy? What are the edge cases?&lt;/li&gt;
&lt;li&gt;Process Dimension: What quality gates are required (tests, reviews, database migrations, docs)?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The pre-execution mapping rule
&lt;/h3&gt;

&lt;p&gt;It is a good idea to spend a little time working out the data flow, the state machine or the pseudocode on paper or in a light design document before coding. If you cannot, it is not ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Architecture Decision Records (ADRs) and AI Tooling
&lt;/h3&gt;

&lt;p&gt;The early documentation practice of &lt;code&gt;Architecture Decision Record (ADR)&lt;/code&gt; proposed by &lt;a href="https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions" rel="noopener noreferrer"&gt;Michael Nygard&lt;/a&gt; was introduced to handle the trade-off between bureaucracy and tracking design decisions.&lt;/p&gt;

&lt;p&gt;Modern AI-assisted workflows like &lt;code&gt;Cursor&lt;/code&gt; or &lt;code&gt;Claude Code&lt;/code&gt;, can summarize these trade-offs extracted from terminal sessions and generate a historical record of the decisions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The CRAFTER Governance Principle:&lt;br&gt;
"AI can accelerate reasoning. It cannot transfer architectural responsibility."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;AI will produce options, trade-offs and draft proposals based on the context.&lt;/li&gt;
&lt;li&gt;The Engineer evaluates, verifies and approves: You validate that the solution respects domain invariants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The engineer acknowledges and implements the decision. As detailed in &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/templates/ADR-Template.md" rel="noopener noreferrer"&gt;ADR-Templat.md&lt;/a&gt;, minimal ADRs contain context, a decision and a trade-off. However, it augments context with the metadata (&lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;trigger&lt;/code&gt;, &lt;code&gt;project&lt;/code&gt;, &lt;code&gt;scope&lt;/code&gt;) to optimize for the human and AI audiences.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ Control Point: Reactive Coding vs. Structured Clarity
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Guess-Driven Mode (Reactive Execution):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10:00 AM: Open the IDE, open up an AI assist tool, paste in a 2-line ticket, hit accept on a large block of code without any other validation.&lt;/li&gt;
&lt;li&gt;01:00 PM: The happy path works, but nobody has any clue how those abstractions work.&lt;/li&gt;
&lt;li&gt;04:00 PM: An unmapped edge case breaks staging. Spend the evening wrestling with prompts to patch bugs in code you didn't design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ CRAFTER Clarity (Deterministic Execution):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10:00 AM: Spend 10 minutes writing domain invariants, definitions of the system boundary and edge cases on paper.&lt;/li&gt;
&lt;li&gt;10:15 AM: Draft an ADR listing trade-offs with AI and review, modify and approve the record.&lt;/li&gt;
&lt;li&gt;11:00 AM: Enter the IDE with a deterministic plan, implement and rework as little as possible.&lt;/li&gt;
&lt;li&gt;1 Month Later: A friend asks why you chose this pattern? Point them to &lt;code&gt;docs/adr/0014-event-driven-ingestion.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 Quick Start &amp;amp; Progress Tracking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Daily Pre-Flight Protocol (10 Minutes)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Identify Top 1-3 Outcomes: Highly-leveraged deliverables.&lt;/li&gt;
&lt;li&gt;Apply the Clarity Filter. Each outcome has a Definition of Done.&lt;/li&gt;
&lt;li&gt;Defend: Set aside protected, Deep Work time for execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  📈 Track Your Progress
&lt;/h3&gt;

&lt;p&gt;If you don't have a Definition of Done (DoD), keep a running tab of how many times you opened your IDE in one week.&lt;br&gt;
Feedback Loop: One week later, look at the log again. Look for things like the same ambiguity, switching contexts, reworking PRs because intent wasn't clear.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔮 What's Next?
&lt;/h3&gt;

&lt;p&gt;Now that we have the Cognitive Clarity pre-execution compiler in place, it's time for execution protection.&lt;br&gt;
Once you have decided what to build, how do you protect your cognitive capacity from meeting fragmentation, slack pings and context switching?&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Part 3: Focus&lt;/strong&gt;, we will look at the second letter of the CRAFTER acronym, F.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guarding Deep Work blocks using zero-noise protocols.&lt;/li&gt;
&lt;li&gt;Asynchronous communication mechanics.&lt;/li&gt;
&lt;li&gt;How to manage context switching and technical ownership.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧬 Conclusion: The clarity is an engineering standard
&lt;/h2&gt;

&lt;p&gt;Clarity is not a mood or an epiphany. Clarity is a discipline of engineering. &lt;strong&gt;Without Cognitive Clarity, every subsequent stage of execution runs idle: you cannot protect focus on a problem you don't understand and you cannot take radical ownership of an undefined outcome&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cognitive Clarity is your engineering standard&lt;/strong&gt;, based on Systems Thinking and Architecture Thinking, at its core.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Standard over Mood: We don't wait for inspiration. We execute the protocol.",&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/Engineering.md" rel="noopener noreferrer"&gt;Engineering&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📚 References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/HawkN113/CRAFTER-OS" rel="noopener noreferrer"&gt;CRAFTER-OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions" rel="noopener noreferrer"&gt;Documenting Architecture Decisions, Michael Nygard&lt;/a&gt;,  Lightweight pattern for capturing design decisions.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.braingrid.ai/blog/architecture-decision-records-for-ai-coding-agents" rel="noopener noreferrer"&gt;Architecture Decision Records for AI Coding Agents, BrainGrid AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maxhemingway.com/2026/09/08/architecture-decision-records-for-ai-systems-why-adrs-are-the-missing-governance-layer-for-agentic-ai/" rel="noopener noreferrer"&gt;ADRs for AI Systems,  Max Hemingway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>CRAFTER: A Cognitive Execution Layer for Sustainable Engineering (Part 1)</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Sun, 20 Sep 2026 11:52:49 +0000</pubDate>
      <link>https://dev.to/hawkn113/crafter-a-cognitive-execution-layer-for-sustainable-engineering-part-1-idn</link>
      <guid>https://dev.to/hawkn113/crafter-a-cognitive-execution-layer-for-sustainable-engineering-part-1-idn</guid>
      <description>&lt;p&gt;Every developer knows the slow burnout. You enter the industry to solve complex problems and build systems. Over time, though, external coordination noise, endless Slack or Teams discussions, constantly changing priorities, and needless performative status syncs started to erode the deep focus needed for engineering. I watched brilliant engineers burn out around me. I hit the wall. Most engineering practices are focused on team processes, backlog flow, delivery and organization coordination, but hardly address the individual engineer's cognitive execution system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a cognitive system, what happens to the engineer under conditions of constant context switching and noisy inputs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the last 10 years I've been working on the same concept: a lightweight framework to do engineering work more effectively, transparently, and predictably without disrupting the team's delivery practices.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏛️ The Philosophy: Human as Architecture
&lt;/h2&gt;

&lt;p&gt;At the center of this thesis is the engineer as &lt;strong&gt;the main component of the system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CRAFTER uses systems - engineering mechanisms, not as a neurological model of cognitive load but rather as an operational approach for isolating and removing cognitive friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unclear Requirements&lt;/strong&gt;: Code is written with no reference to the requirements, causing upstream bugs and inefficient runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Switching&lt;/strong&gt;: Every interruption drains finite working memory and forces costly state reloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interruptions&lt;/strong&gt;: Slack, unfiltered Slack messages and pop-up meetings fragment execution time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burnout&lt;/strong&gt;: Relying on personal heroism to offset system friction burns through biological hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a &lt;strong&gt;heuristic objective function for executing sustainable engineering&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sustainable Engineering Execution = (Value * Predictability) / Cognitive Cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To CRAFTER, this is not an equation. It is a heuristic to its fundamental optimization problem: getting the most bang for your buck in value and predictability with the lowest cognitive cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 The 3-Stage Evolution (Heroism - Bureaucracy - Minimal Core System)
&lt;/h2&gt;

&lt;p&gt;CRAFTER is based on &lt;strong&gt;cognitive science, systems engineering and personal productivity principles&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://calnewport.com/deep-work-rules-for-focused-success-in-a-distracted-world/" rel="noopener noreferrer"&gt;Deep Work&lt;/a&gt;&lt;/strong&gt;: The foundational basis for protected focus blocks and zero-noise protocols. Cal Newport.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://gettingthingsdone.com/" rel="noopener noreferrer"&gt;Getting Things Done (GTD)&lt;/a&gt;&lt;/strong&gt; - David Allen's technique of capturing, clarifying and offloading cognitive overhead to maintain operational clarity influenced the workflow process design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antifragility and Black Swans&lt;/strong&gt; - Nassim Nicholas Taleb (Antifragile and The Black Swan): The Adaptation principle came from this, seeing friction and unexpected blockers as diagnostic feedback instead of a failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systems Thinking &amp;amp; Cybernetics&lt;/strong&gt; - &lt;a href="https://donellameadows.org/systems-thinking-book-sale/" rel="noopener noreferrer"&gt;Donella Meadows&lt;/a&gt;, Norbert Wiener (Cybernetics): Inspired the systems - engineering metaphor ("Human as Architecture") and the closed - loop feedback architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Decision Records (ADR)&lt;/strong&gt; - &lt;a href="https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions" rel="noopener noreferrer"&gt;Michael Nygard&lt;/a&gt;: Provided the lightweight pattern for capturing important design choices without heavy bureaucracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting there was anything but a straight road. It was a normal engineering development process with various failure modes:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 Stage 1: Heroism (The TechNIKO Manifesto)
&lt;/h3&gt;

&lt;p&gt;At the outset of my career, I tried to compensate for the inefficiencies of the workflow through pure discipline and willpower: I codified my ethic into the &lt;strong&gt;TechNIKO Manifesto&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Technical Mastery&lt;/strong&gt;: Master your tools and domain relentlessly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infinite Adaptation&lt;/strong&gt;: Adapt capabilities to changing environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mentor the Strong&lt;/strong&gt;: Share what you learn and raise others up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictatorship of Reputation&lt;/strong&gt;: Honor professional integrity above all.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The mode of failure: Heroism gets results, but at high personal friction. Willpower is a finite resource, not a sustainable system architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Stage 2: Bureaucracy
&lt;/h3&gt;

&lt;p&gt;When willpower didn't work, I was too strict or over-controlled. I had a very deep set of rules, daily lists, formal reviews and detailed tracking.&lt;/p&gt;

&lt;p&gt;How it failed: It generated overheads in administration, and fell apart if the dynamic priorities were complicated or the degree of parallelism was high.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Stage 3: Minimal Core System
&lt;/h3&gt;

&lt;p&gt;In lieu of the abstracted administrative glut, I have boiled it down to the core closed-loop behaviors, resulting in a lightweight cognitive execution layer that is built upon the basic CRAFTER principles.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CRAFTER Framework: A Cognitive Execution Layer
&lt;/h2&gt;

&lt;p&gt;CRAFTER does not replace Agile on the team level. It runs one layer below an iteration. CRAFTER describes how an engineer takes agreed work and makes it focused, visible and predictable.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
    A["Team &amp;amp; Delivery Practices:&amp;lt;br/&amp;gt;Agile / Scrum / Kanban"] --&amp;gt;|Planning, Backlog &amp;amp; Business Alignment| B[CRAFTER Execution Layer]
    B --&amp;gt;|Cognitive Flow &amp;amp; Focused Execution| C[Engineered Software Output]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;By eliminating and managing ambiguity, interruptions, context switching and unmanaged blockers, CRAFTER systematically reduces the variance in execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ambiguity + Interruptions + Context Switching + Unmanaged Blockers --&amp;gt; Execution Variance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ​🔁 The Feedback-Controlled Loop
&lt;/h3&gt;

&lt;p&gt;CRAFTER is a closed-loop execution system based on seven principles that guide its continuous learning and antifragile adaptation.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
    CC[Cognitive Clarity] --&amp;gt; F[Focus]
    F --&amp;gt; TM[Technical Mastery]
    TM --&amp;gt; E[Execution]
    E --&amp;gt; Resp[Responsibility]
    Resp --&amp;gt; A[Adaptation]
    A --&amp;gt; Rep[Reputation]
    Rep --&amp;gt;|Feedback Loop| CC&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;🟦 &lt;strong&gt;C - Cognitive Clarity:&lt;/strong&gt; Do everything possible to clarify requirements before execution, and make uncertainty or missing specs explicit to prevent upstream waste.&lt;/li&gt;
&lt;li&gt;🟥 &lt;strong&gt;F - Focus:&lt;/strong&gt; Guard protected focus blocks (typically targeting cumulative 2 - 4 hours (can be less) of Deep Work daily where team context allows) using zero-noise protocols.&lt;/li&gt;
&lt;li&gt;🟨 &lt;strong&gt;T - Technical Mastery:&lt;/strong&gt; Continuously sharpen architectural reasoning, engineering depth, and domain expertise so that technical complexity becomes cheaper to reason about and execute.&lt;/li&gt;
&lt;li&gt;🟧 &lt;strong&gt;E - Execution:&lt;/strong&gt; Retain speed on single-task completion, communicate steps clearly, and show disciplined progress tracking.&lt;/li&gt;
&lt;li&gt;🟪 &lt;strong&gt;R - Responsibility:&lt;/strong&gt; From reactive ticket processing to radical ownership of technical commitments, quality, and outcomes.&lt;/li&gt;
&lt;li&gt;🟩 &lt;strong&gt;A - Adaptation (Antifragility):&lt;/strong&gt;  Mistakes, runtime blockers and friction are indicators for a permanent fix in your workflow, not indicators for a failure or wrong decision.&lt;/li&gt;
&lt;li&gt;⬜ &lt;strong&gt;R - Reputation:&lt;/strong&gt; Build earned trust across the organization through consistent, transparent, and predictable execution.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📈 Operational Principles as Diagnostic Signals
&lt;/h2&gt;

&lt;p&gt;To keep CRAFTER grounded in the real world of engineering, the main elements are expressed as diagnostic signals:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Predictability Score as a Planning Reliability Signal
&lt;/h3&gt;

&lt;p&gt;It is calculated over a defined measurement period (for instance, a sprint, or a rolling window, depending on team context):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: A planning reliability signal that measures plan stability and estimation calibration, helping engineers find hidden external dependencies. Not a raw completion KPI to game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nuance&lt;/strong&gt;: scope changes, emergency overrides and external blockers are seen as diagnostic signals to recalibrate future commitments rather than individual failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The 20-Minute Stall Escalation Trigger
&lt;/h3&gt;

&lt;p&gt;Hitting an unexpected blocker while executing a task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0 - 20 Minutes:&lt;/strong&gt; Explore individually and document initial observations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At 20 Minutes:&lt;/strong&gt; Stop unstructured trial-and-error. Re-map the problem. Document and escalate the blocker as an asynchronous task, re-scope the task or consciously decide to investigate this further on your own with a plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Acts as a classification trigger that prevents unreported silent spinning on blockers without imposing artificial limits on complex reasoning in architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Reputation or Earned Trust
&lt;/h3&gt;

&lt;p&gt;Reputation refers to &lt;strong&gt;the trust engendered by observed reliability&lt;/strong&gt;. Metrics and artifacts (such as predictable output or transparent asynchronous communication) are not vanity scores, but diagnostic indicators that reliability has been established.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Core Behaviors vs. Modular Artifacts
&lt;/h2&gt;

&lt;p&gt;The CRAFTER framework avoids excessive cost by strictly separating the &lt;strong&gt;minimal behaviors from the modular artifacts&lt;/strong&gt; that are conditionally included.&lt;/p&gt;

&lt;p&gt;Design Constraint: The entire repository supports operational modules. Minimal effort to adopt the repository fosters only a core set of behaviors. Artifacts are not end-goals, they are merely a means to achieve execution.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Core Behaviors&lt;/th&gt;
&lt;th&gt;Modular &amp;amp; Conditional Artifacts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Upfront cognitive clarity &amp;amp; explicit uncertainty&lt;/td&gt;
&lt;td&gt;Architecture Decision Records (ADRs for long-lived decisions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protected focus blocks &amp;amp; zero-noise protocols&lt;/td&gt;
&lt;td&gt;Daily personal execution checklists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asynchronous status transparency&lt;/td&gt;
&lt;td&gt;Weekly / Monthly reset templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-Minute stall escalation trigger&lt;/td&gt;
&lt;td&gt;Detailed self-assessment rubrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feedback-driven workflow adaption&lt;/td&gt;
&lt;td&gt;Superior team playbooks and execution templates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An engineer can adopt the core CRAFTER model by simply following these behaviors, without filling out a single optional template.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ Reality Check: Availability vs. Productivity
&lt;/h2&gt;

&lt;p&gt;CRAFTER directly addresses one of the most pervading myths in modern technology culture: that &lt;strong&gt;availability alone by itself makes engineers efficient&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;❌ Without CRAFTER (Reactive Mode):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;09:00 AM:&lt;/strong&gt; Respond to 20 unread slack messages in different threads with half the context missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10:00 AM:&lt;/strong&gt; Attend a 30-minute standup that turns into a 50-minute debate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11:00 AM:&lt;/strong&gt; Open the IDE, look at a ticket with imprecise requirements, and stop working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;02:00 PM:&lt;/strong&gt; Jump between PR review, ad-hoc calls and troubleshooting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;06:00 PM:&lt;/strong&gt; Close laptop exhausted from eight hours of doing busy work, little of which overlaps directly with the software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;✅ With CRAFTER (Structured Execution):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;09:00 AM:&lt;/strong&gt; The next undistracted block of Deep Work is dedicated to the logic of the core module, followed by checking notifications &lt;em&gt;(from team context)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10:15 AM:&lt;/strong&gt; Batch-process notifications and send a high-signal async update, short and sweet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11:00 AM:&lt;/strong&gt; Begin work on a task with well-defined requirements and acceptance criteria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;02:09 PM:&lt;/strong&gt; After hitting a blocker apply the Stall Escalation Trigger: re-map the issue, document the bottleneck, escalate if necessary, re-scope the task or purposefully continue the investigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;05:30 PM:&lt;/strong&gt; Finish working day with predictability and clear PRs, a responsible rhythm, and no cowboy open loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  👥 Who This Framework is For
&lt;/h2&gt;

&lt;p&gt;CRAFTER is designed for &lt;strong&gt;Senior and Staff Engineers, Tech Leads and Autonomous Developers&lt;/strong&gt;, working in complex areas with the autonomy, acceptance of trade-offs and an appetite to negotiate boundaries, to take ownership of their work and stay focused on outcomes.&lt;/p&gt;

&lt;p&gt;It was designed for a world where developers effectively reduced coordination noise, created predictable delivery cadences and could maintain high-quality engineering for years.&lt;/p&gt;

&lt;p&gt;See Roles &amp;amp; Applicability Matrix on the &lt;a href="https://github.com/HawkN113/CRAFTER-OS/blob/main/docs/Roles.md" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Quick Start
&lt;/h2&gt;

&lt;p&gt;You don't need any special tooling or daily forms in order to start getting value from CRAFTER. Just commit to these three low-effort core habits of the cognitive execution layer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🎯 &lt;strong&gt;Enforce Pre-Execution Clarity&lt;/strong&gt;: Never open your IDE on a non-trivial task until boundary conditions, edge cases and completion criteria are explicitly defined.&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Establish a Focus Shield&lt;/strong&gt;: Negotiate protected focus blocks with your team every day, entirely free of notification tracking.&lt;/li&gt;
&lt;li&gt;⏱️ &lt;strong&gt;Use the 20-Minute Stall Trigger&lt;/strong&gt;: i.e. if you get stuck on a blocker for 20 minutes, you should re-map, escalate, rescope or deliberately continue to investigate with clear reasoning.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Refer to the official &lt;a href="https://github.com/HawkN113/CRAFTER-OS" rel="noopener noreferrer"&gt;CRAFTER-OS Repository&lt;/a&gt; for the complete source and core behavior patterns, plus some optional templates.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>ISO 4217 Currency Reference for .NET — Strongly Typed and Production-Ready</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Fri, 12 Dec 2025 10:41:35 +0000</pubDate>
      <link>https://dev.to/hawkn113/iso-4217-currency-reference-for-net-strongly-typed-and-production-ready-ck5</link>
      <guid>https://dev.to/hawkn113/iso-4217-currency-reference-for-net-strongly-typed-and-production-ready-ck5</guid>
      <description>&lt;p&gt;Working with currencies in .NET often looks simple — until it becomes a mess. String-based codes, inconsistent casing, withdrawn currencies, special units, and edge cases that silently break your logic. If you’ve ever dealt with payments, rates, accounting, or financial integrations, you’ve likely seen horrors like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currencyCode&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"usd"&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;currencyCode&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Usd"&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;currencyCode&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or the "improved" version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (string.Equals(currencyCode, "usd", StringComparison.OrdinalIgnoreCase))
{
    // ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or even worse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (currency == "XXX") { /* ??? */ }
if (currency == "BYR") { /* replaced by BYN */ }
// ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of this happens because currencies are treated as plain strings.&lt;br&gt;
But &lt;code&gt;ISO 4217&lt;/code&gt; is a standard. We should be able to consume it in a strongly typed way.&lt;br&gt;
I explored existing solutions… but most were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;too heavy,&lt;/li&gt;
&lt;li&gt;too dynamic,&lt;/li&gt;
&lt;li&gt;not strongly typed,&lt;/li&gt;
&lt;li&gt;outdated,&lt;/li&gt;
&lt;li&gt;not auto-updated with ISO data.
So I asked myself:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;What if ISO currency types could be generated at compile time with a Source Generator?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea became:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HawkN.Currency.Reference.Iso4217&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔗 NuGet: &lt;a href="https://www.nuget.org/packages/HawkN.Currency.Reference.Iso4217" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/HawkN.Currency.Reference.Iso4217&lt;/a&gt;&lt;br&gt;
📦 GitHub: &lt;a href="https://github.com/HawkN113/Currency.Reference.Iso4217" rel="noopener noreferrer"&gt;https://github.com/HawkN113/Currency.Reference.Iso4217&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lightweight, zero-dependency, source-generated, production-ready &lt;code&gt;ISO 4217&lt;/code&gt; reference library for .NET.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Features
&lt;/h2&gt;

&lt;p&gt;✔ Strongly typed enum: &lt;code&gt;CurrencyCode&lt;/code&gt; (No more "USD" strings. Pure compile-time safety)&lt;br&gt;
✔ Historical &amp;amp; withdrawn currencies included&lt;br&gt;
EUR replacements, old European national currencies, BYR → BYN, and more.&lt;br&gt;
✔ Full ISO 4217 data embedded&lt;br&gt;
Original + friendly names + replacements + special units.&lt;br&gt;
✔ Query builder for filtering&lt;br&gt;
Get exactly the currencies you need.&lt;br&gt;
✔ Fast, static, zero-allocation lookups&lt;br&gt;
Everything is generated at compile time.&lt;br&gt;
✔ No dependencies&lt;br&gt;
Just install &amp;amp; use.&lt;br&gt;
✔ CI-driven updates&lt;br&gt;
GitHub Actions for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;auto-publishing,&lt;/li&gt;
&lt;li&gt;formatting,&lt;/li&gt;
&lt;li&gt;tests,&lt;/li&gt;
&lt;li&gt;security validation.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📦 Installation
&lt;/h2&gt;

&lt;p&gt;CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package HawkN.Currency.Reference.Iso4217 &lt;span class="nt"&gt;--version&lt;/span&gt; 8.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NuGet Package Manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Install-Package HawkN.Currency.Reference.Iso4217 &lt;span class="nt"&gt;-Version&lt;/span&gt; 8.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧩 Getting Started
&lt;/h2&gt;

&lt;p&gt;Register:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCurrencyService&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example in a console app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateDefaultBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureServices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCurrencyService&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resolve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ICurrencyService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inject (Minimal API):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/currencies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;FromServices&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ICurrencyService&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="p"&gt;...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Query currencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;currencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Includes&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fiat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpecialUnit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpecialReserve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PreciousMetal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Currency Types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Fiat&lt;/code&gt;&lt;br&gt;
Standard government-issued currencies.&lt;br&gt;
Examples: &lt;code&gt;USD&lt;/code&gt;, &lt;code&gt;EUR&lt;/code&gt;, &lt;code&gt;JPY&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;SpecialUnit&lt;/code&gt;&lt;br&gt;
Non-sovereign institutional units.&lt;br&gt;
Examples: &lt;code&gt;SDR&lt;/code&gt;, &lt;code&gt;IMF&lt;/code&gt; units, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;SpecialReserve&lt;/code&gt;&lt;br&gt;
Reserve assets used by central banks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;PreciousMetal&lt;/code&gt;&lt;br&gt;
Value pegged to metals.&lt;br&gt;
Examples: &lt;code&gt;XAU&lt;/code&gt;, &lt;code&gt;XAG&lt;/code&gt;, &lt;code&gt;XPT&lt;/code&gt;, &lt;code&gt;XPD&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only need fiat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fiat&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Includes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fiat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Excluding currencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;filtered&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Includes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fiat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Without&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Codes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EUR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Advanced search
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;selected&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Includes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fiat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Code&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="s"&gt;"EUR"&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="s"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryValidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AFN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryValidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AFN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lookup
&lt;/h3&gt;

&lt;p&gt;By string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;afn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AFN"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By enum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;afn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CurrencyCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AFN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Historical currencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;historical&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currencyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllHistorical&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;historical&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (Withdrawn: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithdrawnOn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🌟 Why This Library?
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;HawkN.Currency.Reference.Iso4217&lt;/code&gt; if you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compile-time safety instead of &lt;code&gt;EUR&lt;/code&gt; strings&lt;/li&gt;
&lt;li&gt;ISO-compliant data without manual maintenance&lt;/li&gt;
&lt;li&gt;extremely fast lookups&lt;/li&gt;
&lt;li&gt;great developer experience (IntelliSense everything)&lt;/li&gt;
&lt;li&gt;AOT-ready, reflection-free library&lt;/li&gt;
&lt;li&gt;static, deterministic data&lt;/li&gt;
&lt;li&gt;automatic updates via CI workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🙌 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project started as a small experiment — "&lt;strong&gt;Can I generate all ISO 4217 currencies with a Source Generator?&lt;/strong&gt;"&lt;br&gt;
Then it became a clean, fast, production-ready solution that removes all currency-related pain from .NET apps.&lt;br&gt;
If you deal with payments, rates, financial systems, or even basic validation — this package will save you time and bugs.&lt;br&gt;
🔗 GitHub: &lt;a href="https://github.com/HawkN113/Currency.Reference.Iso4217" rel="noopener noreferrer"&gt;https://github.com/HawkN113/Currency.Reference.Iso4217&lt;/a&gt;&lt;br&gt;
🔗 NuGet: &lt;a href="https://www.nuget.org/packages/HawkN.Currency.Reference.Iso4217" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/HawkN.Currency.Reference.Iso4217&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>opensource</category>
      <category>csharp</category>
    </item>
    <item>
      <title>FlowLite — a lightweight way to manage state in .NET without the pain</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Mon, 21 Apr 2025 20:48:45 +0000</pubDate>
      <link>https://dev.to/hawkn113/flowlite-a-lightweight-way-to-manage-state-in-net-without-the-pain-13e7</link>
      <guid>https://dev.to/hawkn113/flowlite-a-lightweight-way-to-manage-state-in-net-without-the-pain-13e7</guid>
      <description>&lt;p&gt;Managing state transitions in .NET applications — especially in domain-heavy, event-driven, or workflow-oriented systems — can quickly become complex and error-prone. Let’s break down the key challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scattered Logic&lt;/strong&gt;. In many real-world applications, state-related logic (e.g., when an order can be shipped or canceled) is scattered across services, handlers, and controllers. This leads to:

&lt;ul&gt;
&lt;li&gt;Difficulty tracing business rules;&lt;/li&gt;
&lt;li&gt;Increased risk of breaking logic when requirements change;&lt;/li&gt;
&lt;li&gt;A steep learning curve for onboarding new developers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Structure&lt;/strong&gt;. While .NET is a powerful platform, it lacks a native FSM (Finite State Machine) library. Developers often rely on if-else chains, switch statements, or even multiple methods and flags. This can cause:

&lt;ul&gt;
&lt;li&gt;Duplicated logic;&lt;/li&gt;
&lt;li&gt;Inconsistent state behavior;&lt;/li&gt;
&lt;li&gt;Hidden bugs that are difficult to debug.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficult Testing&lt;/strong&gt;. Without a clean abstraction, testing state behavior often means spinning up full services or mocking multiple dependencies. A well-designed FSM can make transition logic easy to test and reason about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency Issues&lt;/strong&gt;. In multi-threaded or asynchronous environments (like background workers or async pipelines), state transitions must be thread-safe to prevent race conditions or unpredictable behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing Auditability&lt;/strong&gt;. Enterprise applications often need to track state changes — when and why transitions occur. Ad-hoc solutions don’t make this easy to implement or maintain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Built FlowLite 🔥
&lt;/h2&gt;

&lt;p&gt;As a backend developer, I often encountered systems with complex state behavior - such as order processing, approval chains, and multi-step workflows. Existing solutions were either too limited or too heavy. I wanted something that:&lt;br&gt;
✅Felt idiomatic to .NET;&lt;br&gt;
✅Provided compile-time safety;&lt;br&gt;
✅Avoided reflection or dynamic proxies;&lt;br&gt;
✅Was easy to test, debug, and observe.&lt;br&gt;
That’s why I built &lt;a href="https://www.nuget.org/packages/FlowLite" rel="noopener noreferrer"&gt;FlowLite&lt;/a&gt; - a &lt;strong&gt;modern, focused FSM engine that combines performance with clarity&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How FlowLite helps 💡
&lt;/h2&gt;

&lt;p&gt;FlowLite addresses these challenges with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flexible configuration via a fluent builder pattern;&lt;/li&gt;
&lt;li&gt;Asynchronous and thread-safe transition execution;&lt;/li&gt;
&lt;li&gt;Custom logic hooks (on state change, entry (entity), or transition failure);&lt;/li&gt;
&lt;li&gt;Persistence support via JSON or in-memory storage;&lt;/li&gt;
&lt;li&gt;A lightweight, fast, developer-friendly, and testable core.
FlowLite provides a &lt;strong&gt;clear, composable, and observable way to manage state transitions&lt;/strong&gt; without the boilerplate. It’s built with real-world usage in mind and focuses on developer experience and maintainability.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;✅&lt;strong&gt;Lightweight &amp;amp; Fast&lt;/strong&gt; — Optimized for high-performance applications;&lt;br&gt;
✅&lt;strong&gt;Asynchronous &amp;amp; Thread-Safe&lt;/strong&gt; — Ensures smooth execution in concurrent environments;&lt;br&gt;
✅&lt;strong&gt;Declarative API&lt;/strong&gt; — Define state transitions with a clean and fluent syntax;&lt;br&gt;
✅&lt;strong&gt;State Persistence&lt;/strong&gt; — Supports JSON-based storage, in-memory storage;&lt;br&gt;
✅&lt;strong&gt;Event Hooks&lt;/strong&gt; — Capture and log every state change for debugging and auditing (check state, check entry, delete entry);&lt;br&gt;
✅&lt;strong&gt;Cycle Prevention&lt;/strong&gt; — Detects and prevents cyclic transitions;&lt;br&gt;
✅&lt;strong&gt;Error Handling&lt;/strong&gt; — Graceful fallback mechanisms for invalid transitions (internal logs);&lt;br&gt;
✅&lt;strong&gt;Final States&lt;/strong&gt; — Define terminal states where transitions are restricted;&lt;br&gt;
✅&lt;strong&gt;Flexible Configuration&lt;/strong&gt; — Supports builder pattern for easy transition setup;&lt;br&gt;
✅&lt;strong&gt;Parallel &amp;amp; Sequential State Execution&lt;/strong&gt; — Suitable for multi-threaded workflows;&lt;br&gt;
✅&lt;strong&gt;Custom Transition Conditions&lt;/strong&gt; — Add business logic to control transitions;&lt;br&gt;
✅&lt;strong&gt;Dependency Injection Support&lt;/strong&gt; — Seamless integration into DI containers;&lt;br&gt;
✅&lt;strong&gt;Storage-Agnostic&lt;/strong&gt; — Plug in your own storage strategy;&lt;br&gt;
✅&lt;strong&gt;Diagram Export&lt;/strong&gt; — Export transitions as Mermaid.js or Graphviz DOT.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started with FlowLite 🚀
&lt;/h2&gt;

&lt;p&gt;You can install FlowLite via the .NET CLI or NuGet Package Manager using the &lt;a href="https://www.nuget.org/packages/FlowLite" rel="noopener noreferrer"&gt;link&lt;/a&gt;. The FSM engine works in all kinds of projects: Console Apps, Web APIs, microservices, etc.&lt;/p&gt;
&lt;h3&gt;
  
  
  Define your state and trigger enums
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Pending&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Created&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Shipped&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Canceled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Completed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Deleted&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Ship&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Cancel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Fail&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Delete&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create the entity class
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;AddressLine1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;City&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Postalcode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Country&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;TotalAmount&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create the state diagram
&lt;/h3&gt;

&lt;p&gt;We’ll use a simple Mermaid diagram to illustrate the state logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stateDiagram-v2
    Pending --&amp;gt; Created: Create
    Created --&amp;gt; Shipped: Ship
    Shipped --&amp;gt; Completed: Complete
    Shipped --&amp;gt; Canceled: Cancel
    Canceled --&amp;gt; Failed: Cancel
    Canceled --&amp;gt; Failed: Fail
    Failed --&amp;gt; Deleted: Delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1h22lwh0w1xa1qivlp8.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.amazonaws.com%2Fuploads%2Farticles%2Fi1h22lwh0w1xa1qivlp8.png" alt=" " width="480" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring State Transitions
&lt;/h3&gt;

&lt;p&gt;FlowLite supports two storage types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; (ideal for development and review)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-memory&lt;/strong&gt; (recommended for production)
You can register it in your &lt;code&gt;IServiceCollection&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFlowLiteStorage&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
    &lt;span class="n"&gt;StorageType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"C:\\Experiments\\FlowLite\\"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Define transition logic using FlowTransitionBuilder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stateFlowConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FlowTransitionBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Created&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; Created"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ship&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shipped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shipped&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; Shipped"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shipped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Complete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Completed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moveTo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Completed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; Completed"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;moveTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shipped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsFinal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shipped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Canceled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Canceled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; Canceled"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Canceled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; Failed (via Cancel)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Canceled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;TransitionHistory&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; Failed (via Fail)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Deleted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;orderApiClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DeleteOrderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;!.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MarkForDeletion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsFinal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 What’s Happening?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.AddTransition(...)&lt;/code&gt; defines a trigger and what should happen;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ctx&lt;/code&gt;(context) gives access to the entity (possible to change properties);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;moveTo(...)&lt;/code&gt; allows calling other transitions dynamically (e.g. rerouting on error);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.AsFinal()&lt;/code&gt; prevents further transitions from that state;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.Build()&lt;/code&gt; compiles and validates all transitions (cycle-safe).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you are ready to call FireAsync(trigger).&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens When You Call FireAsync(trigger) in FlowLite 🔥
&lt;/h2&gt;

&lt;p&gt;The method &lt;code&gt;FireAsync(trigger)&lt;/code&gt; is the primary way to tell FlowLite. But what actually happens under the hood?&lt;/p&gt;

&lt;h3&gt;
  
  
  🧭 Step-by-Step Execution
&lt;/h3&gt;

&lt;p&gt;Let’s walk through the full process:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Triggering the Transition&lt;/strong&gt;&lt;br&gt;
You start by calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FireAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ship&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fsm is your state machine instance (&lt;code&gt;StateFlowMachine&amp;lt;TState, TTrigger, TKey, TEntity&amp;gt;&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OrderTrigger.Ship&lt;/code&gt; is the trigger that you want to fire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FlowLite now prepares to execute the corresponding transition based on your current state and trigger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Locating the Current State&lt;/strong&gt;&lt;br&gt;
FlowLite looks at the entity’s current state (e.g., &lt;code&gt;Created&lt;/code&gt;) and retrieves the corresponding configuration block from the internal transition map.&lt;/p&gt;

&lt;p&gt;It checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this state known?&lt;/li&gt;
&lt;li&gt;Are there transitions registered for this trigger?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Validating the Transition&lt;/strong&gt;&lt;br&gt;
Once a valid transition is found, FlowLite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifies any guard conditions;&lt;/li&gt;
&lt;li&gt;Ensures the transition is currently allowed;&lt;/li&gt;
&lt;li&gt;Confirms that no final state has been reached (i.e., you can still transition).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the transition is invalid (e.g., trying to &lt;code&gt;Ship&lt;/code&gt; an order in &lt;code&gt;Pending&lt;/code&gt;), the execution stop and skip here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Executing the Transition&lt;/strong&gt;&lt;br&gt;
If the transition is valid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;OnExit&lt;/code&gt;: Any logic associated with the current state’s exit is executed;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transition Logic&lt;/strong&gt;: The core action of the transition is performed;&lt;/li&gt;
&lt;li&gt;This is where you update your entity, call services, or even trigger internal transitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these actions can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous&lt;/strong&gt; (i.e., return a &lt;code&gt;Task&lt;/code&gt; or &lt;code&gt;ValueTask&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Updating State&lt;/strong&gt;&lt;br&gt;
After all actions are completed successfully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The entity’s state is updated (e.g., &lt;code&gt;Created&lt;/code&gt; → &lt;code&gt;Shipped&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The transition history is recorded internally (for diagnostics or testing)&lt;/li&gt;
&lt;li&gt;The transition result is stored (accessible via &lt;code&gt;fsm.CurrentState&lt;/code&gt;, &lt;code&gt;fsm.CurrentEntity&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an exception occurs during the transition, the process is halted, and — if enabled — rollback logic may be invoked in future versions (see roadmap).&lt;/p&gt;
&lt;h2&gt;
  
  
  Example Flow 🧪
&lt;/h2&gt;

&lt;p&gt;Given the finite state machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pending → Created → Shipped → Completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FireAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ship&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check that the current state is &lt;code&gt;Created&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Validate that &lt;code&gt;Ship&lt;/code&gt; is allowed;&lt;/li&gt;
&lt;li&gt;Execute the transition logic (e.g., update the &lt;code&gt;Order.Status&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;Move the entity to the &lt;code&gt;Shipped&lt;/code&gt; state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calling FireAsync(trigger) in FlowLite means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validating the transition is allowed.&lt;/li&gt;
&lt;li&gt;Executing optional exit logic from the current state.&lt;/li&gt;
&lt;li&gt;Performing the main transition logic.&lt;/li&gt;
&lt;li&gt;Entering the new state with optional entry logic.&lt;/li&gt;
&lt;li&gt;Updating the entity and FSM context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s asynchronous, safe, extensible, and clear — with minimal effort on your side.&lt;/p&gt;

&lt;h2&gt;
  
  
  FlowLite.Diagnostics
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/FlowLite.Diagnostics/" rel="noopener noreferrer"&gt;FlowLite.Diagnostics&lt;/a&gt; is an &lt;strong&gt;optional extension that adds logging, telemetry, and observability to your FSMs&lt;/strong&gt;. Configure it in your &lt;code&gt;IServiceCollection&lt;/code&gt; before creating FSM instances:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFlowLiteDiagnostics&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnableGlobalDiagnostics&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Telemetry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseConsole&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseLogger&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoggerFactory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildServiceProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ILoggerFactory&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiagnosticObserver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Console logs of transitions;&lt;/li&gt;
&lt;li&gt;Diagnostic events;&lt;/li&gt;
&lt;li&gt;Compatibility with OpenTelemetry metrics via System.Diagnostics.Metrics;&lt;/li&gt;
&lt;li&gt;Global tracking of all state flow instances for specific state, trigger, entry type. You do not apply diagnostics configuration to every FlowLite FSM instance;
If you’re building workflows in production — &lt;strong&gt;this is a must-have&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FlowLite.Testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/FlowLite.Testing" rel="noopener noreferrer"&gt;FlowLite.Testing&lt;/a&gt; is a &lt;strong&gt;minimalistic and fluent testing library designed for writing expressive and structured unit tests for your FlowLite FSM workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Testing Features
&lt;/h3&gt;

&lt;p&gt;✅ Trigger Assertions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Allow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;NotAllow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ State Assertions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;BeIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Paid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Entity Assertions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;NotNullEntity&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;HaveEntity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Log Assertions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Logs&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ContainFinalStateLog&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Logs&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Warning&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"invalid transition"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ History Assertions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Should&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;History&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Created&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HaveInHistory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Paid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shipped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Paid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HaveLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ship&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Trigger-Only DSL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Allow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;NotAllow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderTrigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FlowLite.Testing makes regression-proof testing easy and declarative — a key feature for large systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  FlowLite.Diag
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/FlowLite.Diag/" rel="noopener noreferrer"&gt;FlowLite.Diag&lt;/a&gt; is a &lt;strong&gt;cross-platform .NET CLI tool for visualizing finite state machine (FSM) state transitions based on &lt;code&gt;FlowTransitionBuilder&lt;/code&gt; code from the FlowLite library&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flowlite-diag &lt;span class="nt"&gt;--source&lt;/span&gt; &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\O&lt;/span&gt;&lt;span class="s2"&gt;rders&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; --format "&lt;/span&gt;mermaid&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stateDiagram-v2
    Pending --&amp;gt; Created: Create
    Created --&amp;gt; Shipped: Ship
    Shipped --&amp;gt; Completed: Complete
    Shipped --&amp;gt; Canceled: Cancel
    Canceled --&amp;gt; Failed: Cancel
    Canceled --&amp;gt; Failed: Fail
    Failed --&amp;gt; Deleted: Delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Export to Mermaid or DOT format and paste it into documentation, wikis, or visualization tools like Graphviz. This simple diagram becomes a powerful visualization tool — especially when integrated with FlowLite.Diag to automatically generate diagrams from your codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use FlowLite?
&lt;/h2&gt;

&lt;p&gt;✅ Use FlowLite if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your system relies on clearly defined state transitions;&lt;/li&gt;
&lt;li&gt;You want explicit and testable business rules;&lt;/li&gt;
&lt;li&gt;You care about observability and developer experience;&lt;/li&gt;
&lt;li&gt;You want to avoid hidden state bugs in large teams.
❌ Avoid FlowLite if:&lt;/li&gt;
&lt;li&gt;You only need simple event routing (&lt;strong&gt;FlowLite is not an event bus&lt;/strong&gt;);&lt;/li&gt;
&lt;li&gt;You require dynamic, runtime-defined states (&lt;strong&gt;FlowLite uses strong typing&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;p&gt;As part of future development, FlowLite to introduce the planned features:&lt;br&gt;
🔌 &lt;strong&gt;ASP.NET Core Middleware integration for state orchestration, IoT management&lt;/strong&gt;;&lt;br&gt;
🧭 &lt;strong&gt;Undo/Rollback support for failed transitions&lt;/strong&gt;;&lt;br&gt;
🔁 &lt;strong&gt;Sub-state machine support (hierarchical FSMs)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;State management in .NET doesn’t have to be painful, scattered, or hard to maintain. With FlowLite, you get a clean and composable way to model, control, and observe state transitions with full type-safety, testability, and performance in mind.If you care about clean architecture, business logic clarity, and maintainable code — FlowLite might be exactly what your project needs. The Github repository is available with the &lt;a href="https://github.com/HawkN113/FlowLite" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Supercharge your .NET Configuration with Flash.Configuration</title>
      <dc:creator>Nickolay Selyutin (Niki)</dc:creator>
      <pubDate>Mon, 21 Apr 2025 12:46:00 +0000</pubDate>
      <link>https://dev.to/hawkn113/supercharge-your-net-configuration-with-flashconfiguration-fdd</link>
      <guid>https://dev.to/hawkn113/supercharge-your-net-configuration-with-flashconfiguration-fdd</guid>
      <description>&lt;p&gt;Configuration is the backbone of any modern .NET application. Whether you’re setting up connection strings, feature flags, or API keys, managing configuration effectively can make or break your app’s scalability and maintainability.&lt;/p&gt;

&lt;p&gt;.NET provides built-in configuration providers (like &lt;code&gt;appsettings.json&lt;/code&gt; and environment variables), but let’s be real — they have their limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Static at Runtime — Once your app is running, changing configuration usually means a restart (without &lt;code&gt;reloadOnChange: true&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hard to Modify Post-Build — Need to update a setting after deployment? Good luck scripting that manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Messy Environment Handling — Maintaining multiple &lt;code&gt;appsettings.{Environment}.json&lt;/code&gt; files quickly becomes a nightmare.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tired of static, hard-to-manage .NET configuration that requires restarts and complex scripts just to update? Wouldn’t it be great if your .NET configuration was dynamic, environment-aware, and easy to modify post-build?? That’s where Flash.Configuration comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Flash.Configuration — Your New Best Friend
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/Flash.Configuration" rel="noopener noreferrer"&gt;Flash.Configuration&lt;/a&gt; is a &lt;strong&gt;powerful configuration library&lt;/strong&gt; that solves the pain points of built-in .NET configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Dynamic Parsing&lt;/strong&gt; — Easily modify settings without restarting your app.&lt;br&gt;
✅ &lt;strong&gt;Environment-Specific Configs&lt;/strong&gt; — Automatically apply different settings for Dev, Staging, and Production.&lt;br&gt;
✅ &lt;strong&gt;Post-Build Updates&lt;/strong&gt; — Modify appsettings.json after deployment.&lt;br&gt;
✅ &lt;strong&gt;Strongly Typed Configuration&lt;/strong&gt; – No more IConfiguration["SomeSetting"]; use strongly typed classes.&lt;/p&gt;

&lt;p&gt;In the next section, we’ll walk through a practical example to demonstrate how Flash.Configuration simplifies .NET configuration.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started with Flash.Configuration 🚀
&lt;/h2&gt;

&lt;p&gt;Use the packages on &lt;a href="https://www.nuget.org/" rel="noopener noreferrer"&gt;nuget.org&lt;/a&gt;. &lt;a href="https://www.nuget.org/packages/Flash.Configuration/" rel="noopener noreferrer"&gt;Flash.Configuration&lt;/a&gt; supports Console Applications, Web APIs, Class Libraries, Worker Services, and Web API (Native AOT). If you’re working with WPF, install &lt;a href="https://www.nuget.org/packages/Flash.Configuration.Wpf/" rel="noopener noreferrer"&gt;Flash.Configuration.Wpf&lt;/a&gt;. For Windows applications, use &lt;a href="https://www.nuget.org/packages/Flash.Configuration.WinForms/" rel="noopener noreferrer"&gt;Flash.Configuration.WinForms&lt;/a&gt;.&lt;br&gt;
📦 GitHub: &lt;a href="https://github.com/HawkN113/Flash.Configuration" rel="noopener noreferrer"&gt;https://github.com/HawkN113/Flash.Configuration&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Defining Strongly Typed Configuration
&lt;/h2&gt;

&lt;p&gt;Instead of dealing with &lt;code&gt;IConfiguration&lt;/code&gt;, define a strongly typed class and use &lt;code&gt;[FlashConfig]&lt;/code&gt; attributes to map settings dynamically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConnectionStrings&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server=dev.db;Database=DevDB;User=dev;Password=123;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server=prod.db;Database=ProdDB;User=prod;Password=123;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DefaultConnection&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enabled"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  💡 What’s Happening Here?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;ConnectionStrings&lt;/code&gt; class maps to &lt;code&gt;appsettings.Development.json&lt;/code&gt; and &lt;code&gt;appsettings.Production.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment-specific values&lt;/strong&gt; are set dynamically. In the project and in the output project location (i.e: /bin/Debug or /bin/Release)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No magic strings&lt;/strong&gt; — just clean, strongly typed config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Flash.Configuration, you don’t need to edit application configuration manually! It automatically updates config files based on environment settings.&lt;/p&gt;

&lt;p&gt;After switching to &lt;strong&gt;Development&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Server=dev.db;Database=DevDB;User=dev;Password=123;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After switching to &lt;strong&gt;Production&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Server=prod.db;Database=ProdDB;User=prod;Password=123;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more manual edits. No more &lt;strong&gt;incorrect environment settings&lt;/strong&gt;. 🎯&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignoring Configuration Sections
&lt;/h2&gt;

&lt;p&gt;To ignore specific configuration sections, use the &lt;code&gt;[FlashIgnore]&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FlashIgnore&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConnectionStrings&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server=dev.db;Database=DevDB;User=dev;Password=123;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server=prod.db;Database=ProdDB;User=prod;Password=123;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DefaultConnection&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enabled"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to ignore a specific property for a given environment, use &lt;code&gt;[FlashValueIgnore]&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FileLogging"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FileLogging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Staging"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileLogging&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enabled"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValueIgnore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Staging"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"LogFilePath"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FlashValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"logs/app-stg-log.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Staging"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LogFilePath&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"logs/app-log.txt"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After switching to root configuration &lt;code&gt;appSettings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"FileLogging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"LogFilePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logs/app-log.txt"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After switching to &lt;strong&gt;Staging&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"FileLogging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"LogFilePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logs/app-stg-log.txt"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find more features on &lt;a href="https://medium.com/@nselyutin/supercharge-your-net-configuration-with-flash-configuration-0a4c29d58246" rel="noopener noreferrer"&gt;original post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Use Flash.Configuration? 🤔
&lt;/h2&gt;

&lt;p&gt;If you’re building .NET 8 applications and tired of wrestling with static configuration, Flash.Configuration is the ultimate solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 Top Benefits
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Eliminates Configuration Headaches&lt;/strong&gt; — Provides strongly typed, structured, and automated configuration management.&lt;br&gt;
✅ &lt;strong&gt;Seamless Integration&lt;/strong&gt; — Works effortlessly with existing .NET apps without requiring major rewrites.&lt;br&gt;
✅ &lt;strong&gt;Post-Build Configuration Handling&lt;/strong&gt; — Automatically modifies configuration files after build, adapting settings for different environments (Development, Staging, Production).&lt;br&gt;
✅ &lt;strong&gt;Built-in Validation &amp;amp; Error Handling&lt;/strong&gt; — Detects and reports misconfigurations with logging and troubleshooting support.&lt;br&gt;
✅ &lt;strong&gt;Dynamic Parsing&lt;/strong&gt; — Reads and structures JSON-based configuration for easy access and manipulation.&lt;br&gt;
✅ &lt;strong&gt;IOptions Support&lt;/strong&gt; — Fully compatible with .NET’s IOptions pattern for strongly typed configuration.&lt;br&gt;
✅ &lt;strong&gt;Faster Deployments&lt;/strong&gt; — Eliminates manual post-build tweaks, saving valuable time.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Ideal Use Cases
&lt;/h2&gt;

&lt;p&gt;🚀 &lt;strong&gt;Microservices &amp;amp; Cloud-Native Apps&lt;/strong&gt; — Ensures scalable and dynamic configuration management.&lt;br&gt;
🏢 &lt;strong&gt;Enterprise-Level Projects&lt;/strong&gt; — Perfect for complex applications requiring environment-based settings.&lt;br&gt;
🛠 &lt;strong&gt;Small &amp;amp; Medium Projects&lt;/strong&gt; — Simplifies configuration handling without extra complexity.&lt;/p&gt;

&lt;p&gt;With Flash.Configuration, managing application settings becomes effortless — so you can focus on building great software! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flash.Configuration&lt;/strong&gt; transforms .NET configuration from a static headache into a dynamic, scalable experience. If you build modern apps with evolving environments, this library is for you.&lt;/p&gt;

&lt;p&gt;By integrating Flash.Configuration, you can:&lt;br&gt;
✅ &lt;strong&gt;Streamline configuration workflows&lt;/strong&gt; — Strongly typed, structured, and automated settings.&lt;br&gt;
✅ &lt;strong&gt;Enhance security&lt;/strong&gt; — Ensure that sensitive data, such as API keys and credentials, is properly managed and protected.&lt;br&gt;
✅ &lt;strong&gt;Improve scalability &amp;amp; maintainability&lt;/strong&gt; — Easily adapt to evolving application needs.&lt;br&gt;
✅ &lt;strong&gt;Future-proof your architecture&lt;/strong&gt; — Designed to work seamlessly with .NET 8 and beyond.&lt;/p&gt;

&lt;p&gt;As part of future development, Flash.Configuration aims to introduce advanced &lt;strong&gt;sensitive data protection mechanisms&lt;/strong&gt;, such as &lt;strong&gt;secure storage integrations&lt;/strong&gt; and &lt;strong&gt;automated secret management&lt;/strong&gt;, to further enhance security.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@nselyutin/supercharge-your-net-configuration-with-flash-configuration-0a4c29d58246" rel="noopener noreferrer"&gt;Original Medium Post&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
