<?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: canonical</title>
    <description>The latest articles on DEV Community by canonical (@canonical).</description>
    <link>https://dev.to/canonical</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%2F3578743%2Feccf1f85-53c3-4e4a-9948-7737f0c99a91.jpeg</url>
      <title>DEV Community: canonical</title>
      <link>https://dev.to/canonical</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/canonical"/>
    <language>en</language>
    <item>
      <title>Mission Driver: A General Reference Implementation of Loop Engineering</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Fri, 31 Jul 2026 23:26:30 +0000</pubDate>
      <link>https://dev.to/canonical/mission-driver-a-general-reference-implementation-of-loop-engineering-5gb5</link>
      <guid>https://dev.to/canonical/mission-driver-a-general-reference-implementation-of-loop-engineering-5gb5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;How a universal AI task-driven engine achieves local fault tolerance and stability guarantees through nested loops.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Part 1: Getting Started
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. The Problem: From Vibe Coding to Autonomous Operation
&lt;/h2&gt;

&lt;p&gt;Current mainstream AI-assisted development is still Vibe Coding: a human prompts, the AI responds, the human corrects, and the AI responds again. This can be called the Human in the Loop model. Every output requires human confirmation and correction; human and AI work in alternation.&lt;/p&gt;

&lt;p&gt;This model has two problems.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;loss of quality control&lt;/strong&gt;. AI execution is essentially a probabilistic sampling process. Without an external control structure intervening, the AI can easily veer off course—for example, changing other code halfway through a task, forgetting to run tests after making changes, falling into an infinite loop upon failure, or losing state after a crash and having to start over. Even more dangerous is self-declared completion—claiming something is done without actually implementing it.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;capacity limitation&lt;/strong&gt;. When a human is in the loop, the ultimate bottleneck remains human working time and energy. A person works 8 hours a day; even if AI assistance triples efficiency, the ceiling is only 24 person-hours. To truly unleash AI productivity, we must move toward Human on the Loop: AI runs fully autonomously 7×24, the human steps out of the loop and becomes a control factor that intervenes on demand.&lt;/p&gt;

&lt;p&gt;This is not just a shift in operating mode, but a change in cost structure. When AI can run autonomously 7×24, working hours are no longer the constraint. A weaker model may take longer and consume more tokens to complete a job, but it is cheap enough to run at night without occupying human time. Multiple missions can process different roadmap work items in parallel. Cost accounting changes from "output per person-hour" to "intelligent output per dollar."&lt;/p&gt;

&lt;p&gt;Mission Driver is a concrete control structure that realizes this transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What is Mission Driver (One-Minute Version)
&lt;/h2&gt;

&lt;p&gt;Mission Driver is a declarative task-driven engine. You give it a goal (described via a roadmap), and it automatically enters a loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check health status (initial, once) → Review plans → Execute plans → Draft new plans → (back to Review plans) → When no new plans can be drafted → Deep audit → (back to Review plans)...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop runs until the goal is achieved or the audit budget is exhausted. Each step is an independent AI subprocess or script function; failure of a single step does not affect the overall loop.&lt;/p&gt;

&lt;p&gt;It is a component of Attractor-Guided Engineering (open-source repository links at the end of the article), and it is not limited to software development. By configuring custom flows, prompts, and commands, it can be naturally generalized to scenarios such as data processing and document analysis—a universal mechanism for fully autonomous AI operation.&lt;/p&gt;

&lt;p&gt;It is suitable for complex tasks that require long-running execution, clear acceptance criteria, and multi-step iteration.&lt;/p&gt;

&lt;p&gt;Loop Engineering is a design methodology rapidly emerging in the AI engineering field—using loop structures instead of linear prompts to let AI systems run autonomously until goals are met. It is not a proprietary feature of any particular tool, but an engineering pattern that can be designed independently of specific tools. Mission Driver is a general reference implementation of Loop Engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. How It Works: Loop Nesting and Local Fault Tolerance
&lt;/h2&gt;

&lt;p&gt;If we view Vibe Coding as a single infinite loop, the core of Mission Driver is decomposing that single loop into nested multi-layer loops—Mission Driver's main loop (the five-step closed loop) is the outer layer, with embedded inner layers: the Plan Loop (the execute → check → audit → verify cycle in the EXEC_PLANS subflow) and an optional Audit Loop (the multi-dimensional audit cycle in the DEEP_AUDIT subflow). Understanding this nested structure is key to understanding why it can run stably for long periods.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr3g8ftzrjxk1vz8laewh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr3g8ftzrjxk1vz8laewh.png" alt="mission-driver-loop" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suppose there are 3 active plans, and the execution of plan-002 encounters a blockage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXEC_PLANS:
  ├── plan-001: EXECUTE ✓ → CHECK ✓ → BUILD ✓ → completed ✓
  ├── plan-002: EXECUTE ✗ → retried 3 times still failed → subflow failed
  │              → executing agent finds a prerequisite not met
  │              → moves the blocked item to Deferred But Adjudicated, records trigger conditions
  │              → remaining phases continue → completed (with Follow-up items)
  └── plan-003: EXECUTE ✓ → CHECK ✓ → BUILD ✓ → completed ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The execution blockage of plan-002 has no impact on plan-001 and plan-003. The blockage is confined within the subflow and does not propagate to sibling subflows or the parent loop. This is the local fault tolerance brought by loop nesting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;During plan execution, the AI decides based on the actual situation: locally blocked items are moved to &lt;code&gt;Deferred But Adjudicated&lt;/code&gt; with successor trigger conditions recorded, while the rest of the scope completes normally; if the entire direction of the plan is falsified, it is marked as &lt;code&gt;superseded&lt;/code&gt; or &lt;code&gt;cancelled&lt;/code&gt;. The status of the plan's &lt;code&gt;.md&lt;/code&gt; file is always managed by the AI agent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The execution state of each step is persisted to disk (checkboxes in the plan file). After a process crash and restart, the engine scans the checkbox marks on disk and resumes from the breakpoint without replaying history.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 2: Starting Out
&lt;/h1&gt;

&lt;h2&gt;
  
  
  4. Quick Start
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The source project for Mission Driver is in the AGE Template project. Typically, we add a &lt;code&gt;tools/mission-driver.sh&lt;/code&gt; script in our own project to proxy calls to Mission Driver, and point to the Mission Driver source directory via the &lt;code&gt;MISSION_DRIVER_HOME&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Getting started flow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the AGE template, let AI read and adapt it to your project (adjust document structure, configure commands, initialize roadmap)&lt;/li&gt;
&lt;li&gt;Ensure test commands are executable (&lt;code&gt;npm test&lt;/code&gt; / &lt;code&gt;mvn test&lt;/code&gt; / Playwright)&lt;/li&gt;
&lt;li&gt;In daily AI conversations, draft plans into the plans directory according to the plan guide, accumulating plans and logs&lt;/li&gt;
&lt;li&gt;Start the mission
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate mission config + roadmap&lt;/span&gt;
./tools/mission-driver.sh draft &lt;span class="s2"&gt;"your goal description"&lt;/span&gt;

&lt;span class="c"&gt;# Validate config&lt;/span&gt;
node &lt;span class="nv"&gt;$MISSION_DRIVER_HOME&lt;/span&gt;/src/mission-check.mjs missions/&amp;lt;name&amp;gt;.json &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Dry-run to verify flow orchestration&lt;/span&gt;
./tools/mission-driver.sh run &amp;lt;name&amp;gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nt"&gt;--no-monitor&lt;/span&gt;

&lt;span class="c"&gt;# Formal run&lt;/span&gt;
./tools/mission-driver.sh run &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Mission Driver has a built-in visual monitoring page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5zmuqv0jx018ntxnd81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5zmuqv0jx018ntxnd81.png" alt="misson-driver-monitor" width="800" height="371"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open http://localhost:9300              &lt;span class="c"&gt;# Browser dashboard&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;_tmp/&amp;lt;runDir&amp;gt;/run-state.json        &lt;span class="c"&gt;# Read state&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; _tmp/&amp;lt;runDir&amp;gt;/&amp;lt;mission&amp;gt;.log     &lt;span class="c"&gt;# Follow logs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Interruption and Recovery&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ctrl-C safe interrupt (engine catches signal, cleans up child processes)&lt;/span&gt;
&lt;span class="c"&gt;# Rerunning automatically resumes&lt;/span&gt;
./tools/mission-driver.sh run &amp;lt;name&amp;gt;

&lt;span class="c"&gt;# Resume from a specific step&lt;/span&gt;
./tools/mission-driver.sh run &amp;lt;name&amp;gt; &lt;span class="nt"&gt;--from-step&lt;/span&gt; EXEC_PLANS

&lt;span class="c"&gt;# Fast mode (skip DEEP_AUDIT)&lt;/span&gt;
./tools/mission-driver.sh run &amp;lt;name&amp;gt; &lt;span class="nt"&gt;--fast&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Postmortem&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./tools/mission-driver.sh analyze           &lt;span class="c"&gt;# Analyze most recent run&lt;/span&gt;
./tools/mission-driver.sh analyze &amp;lt;runId&amp;gt;   &lt;span class="c"&gt;# Analyze a specific run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postmortem scans all events and logs, runs a postmortem agent, and writes a structured report to the memory directory. Subsequent missions for the same module will automatically load these lessons learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Four-Layer Definition System
&lt;/h2&gt;

&lt;p&gt;Mission Driver consists of four layers of definitions, used through configuration rather than programming.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Mission Config (&lt;code&gt;missions/&amp;lt;name&amp;gt;.json&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Pure static configuration, declaring what to do, where to do it, and how to verify:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medical-qa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Generate QA training dataset from medical papers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roadmapPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docs/backlog/medical-qa-roadmap.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plansDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docs/plans/medical-qa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commands"&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;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python scripts/check_quality.py --min-records 500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typecheck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python -c &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;import dataflow&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; echo OK"&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;"promptsDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"missions/prompts/data-processing"&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;&lt;code&gt;commands.test&lt;/code&gt; is a required field; CHECK and BUILD_VERIFY both run it. &lt;code&gt;build&lt;/code&gt;/&lt;code&gt;lint&lt;/code&gt;/&lt;code&gt;typecheck&lt;/code&gt; are optional and skipped if missing. Runtime state is in &lt;code&gt;_tmp/&amp;lt;runId&amp;gt;/run-state.json&lt;/code&gt; and is not written to &lt;code&gt;mission.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Flow Definition
&lt;/h3&gt;

&lt;p&gt;The engine core is a &lt;strong&gt;generic state machine DSL executor&lt;/strong&gt; (&lt;code&gt;FlowEngine&lt;/code&gt;, with zero project-specific logic). Flow definitions declare how steps are orchestrated, how transitions occur, and what to do on errors. The engine advances the state machine according to the flow description, not bound to any fixed steps.&lt;/p&gt;

&lt;p&gt;A simplified flow structure:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-flow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CHECK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&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;"CHECK"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"promptPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prompts/health-check.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"transitions"&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;"pass"&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;"goto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NEXT_STEP"&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;"fail"&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;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"failed"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"NEXT_STEP"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"subflow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"flow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-subflow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"forEach"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"activePlans()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"transitions"&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;"all_complete"&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;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step types&lt;/strong&gt;: &lt;code&gt;agent&lt;/code&gt; (AI subprocess), &lt;code&gt;script&lt;/code&gt; (JS function), &lt;code&gt;subflow&lt;/code&gt; (nested subflow), &lt;code&gt;group&lt;/code&gt; (grouped steps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control flow&lt;/strong&gt;: &lt;code&gt;transitions&lt;/code&gt; define jumps between steps (&lt;code&gt;goto&lt;/code&gt;/&lt;code&gt;done&lt;/code&gt;/&lt;code&gt;retry&lt;/code&gt;); &lt;code&gt;forEach&lt;/code&gt; iterates over a collection launching a subflow per element; &lt;code&gt;when&lt;/code&gt;/&lt;code&gt;otherwise&lt;/code&gt; for conditional skipping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling&lt;/strong&gt;: each step can configure &lt;code&gt;maxRetries&lt;/code&gt;, &lt;code&gt;onMaxRetries&lt;/code&gt;, &lt;code&gt;onError&lt;/code&gt;, &lt;code&gt;onUnknown&lt;/code&gt;; the engine also provides global infinite-loop detection (&lt;code&gt;ping_pong&lt;/code&gt; + &lt;code&gt;max_cycles&lt;/code&gt; + &lt;code&gt;max_total_steps&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The built-in default flow&lt;/strong&gt; (&lt;code&gt;flows/mission-driver.json&lt;/code&gt;) is the cycle we've been discussing. Its actual structure is: CHECK runs only once at the entry, then enters the loop body REVIEW_PLANS → EXEC_PLANS → DRAFT_PLANS; when DRAFT_PLANS has no new plans to draft, it enters DEEP_AUDIT, then returns to the loop body. It is not hardcoded, just a &lt;strong&gt;default configuration&lt;/strong&gt;. EXEC_PLANS and DEEP_AUDIT themselves are subflows (&lt;code&gt;plan-execution.json&lt;/code&gt; / &lt;code&gt;deep-audit-loop.json&lt;/code&gt;) that can be replaced independently.&lt;/p&gt;

&lt;p&gt;This means &lt;strong&gt;entirely new workflows can be designed&lt;/strong&gt;—for example, a code review workflow that doesn't need Plan orchestration can be written as a four-step flow: FETCH_PR → RUN_LINT → AI_REVIEW → POST_COMMENT. Place custom flow JSON in the &lt;code&gt;missions/flows/&lt;/code&gt; directory and set &lt;code&gt;"flowName": "&amp;lt;custom&amp;gt;"&lt;/code&gt; in mission.json; the engine remains unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Plan Files
&lt;/h3&gt;

&lt;p&gt;A Plan is the smallest unit of work, automatically generated by AI following a specific format. Its core is not just defining a to-do list, but defining the closure contract for how to judge completion. Its standard structure is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# 01 Purchase Order Approval Workflow Integration&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Plan Status: draft&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; Last Reviewed: 2026-07-25&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; Source: roadmap item "Core Business Logic M1"&lt;/span&gt;

&lt;span class="gu"&gt;## Current Baseline&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; ErpPurOrder entity modeled, CRUD generated
&lt;span class="p"&gt;-&lt;/span&gt; No approval logic yet

&lt;span class="gu"&gt;## Goals&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Purchase orders support submit→approve→reject/approve status transitions
&lt;span class="p"&gt;-&lt;/span&gt; After approval, trigger inventory posting

&lt;span class="gu"&gt;## Non-Goals&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; No multi-level approval
&lt;span class="p"&gt;-&lt;/span&gt; No approval delegation

&lt;span class="gu"&gt;### Phase 1 - Approval State Machine&lt;/span&gt;
Status: planned
&lt;span class="p"&gt;
-&lt;/span&gt; [ ] Implement submitForApproval / approve / reject methods
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Status validation: only DRAFT can be submitted

Exit Criteria:
&lt;span class="p"&gt;-&lt;/span&gt; [ ] After submit→approve, posted=true
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Unit tests cover all state transitions

&lt;span class="gu"&gt;## Closure Gates&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] End-to-end: complete chain submit→approve→posting→reversal verified
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Independent sub-agent closure audit passed
&lt;span class="p"&gt;-&lt;/span&gt; [ ] mvn test all green
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Top three lines of status markers, Goals + Non-Goals (to prevent scope drift), each Phase has Status + checkboxes + Exit Criteria, and Closure Gates are plan-level final checks. Checkboxes are machine-readable persistent state; the engine resumes from breakpoints by scanning checkboxes. Before marking completed, all checkboxes must be checked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In AGE practice, humans generally do not need to read Plans; they are created and updated entirely by AI autonomously.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Roadmap
&lt;/h3&gt;

&lt;p&gt;The Roadmap is a human-readable, controllable macro plan. According to the &lt;code&gt;docs/backlog/00-roadmap-authoring-guide.md&lt;/code&gt; specification, work items are grouped by milestones, carrying only three states: &lt;code&gt;todo&lt;/code&gt;/&lt;code&gt;ready&lt;/code&gt;/&lt;code&gt;done&lt;/code&gt;; milestones themselves carry no state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Core Business Roadmap&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Prerequisites: All CRUD completed&lt;/span&gt;

&lt;span class="gu"&gt;## Work Item Status&lt;/span&gt;

&lt;span class="gu"&gt;### Milestone M1 — Core Business Cycle&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Purchase requisition approval→convert to order logic: &lt;span class="sb"&gt;`done`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Sales quotation approval→convert to order logic: &lt;span class="sb"&gt;`done`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Purchase Order BizModel (approval/receiving trigger/posting): &lt;span class="sb"&gt;`done`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Sales Order BizModel (approval/shipping trigger/posting): &lt;span class="sb"&gt;`done`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Three-way matching logic: &lt;span class="sb"&gt;`done`&lt;/span&gt;

&lt;span class="gu"&gt;### Milestone M2 — Business-Finance Integration End-to-End&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Procure-to-Pay full chain (PO→Receive→Invoice→Pay): &lt;span class="sb"&gt;`done`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Order-to-Cash full chain (SO→Delivery→Invoice→Receipt): &lt;span class="sb"&gt;`done`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Period-end closing full process: &lt;span class="sb"&gt;`todo`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Return-to-Refund full chain: &lt;span class="sb"&gt;`todo`&lt;/span&gt;

&lt;span class="gu"&gt;### Milestone M3 — Extended Domain Business Logic&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; HR Shift Scheduling Engine: &lt;span class="sb"&gt;`todo`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Payroll Calculation: &lt;span class="sb"&gt;`todo`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; APS Production Scheduling: &lt;span class="sb"&gt;`todo`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DRAFT_PLANS launches an AI agent: reads the full roadmap + deferred items in historical plans → reads project context and planGuide → selects the next 1–3 work items → drafts plan drafts (&lt;code&gt;Status: draft&lt;/code&gt;) → calls an independent sub-agent to review; upon approval, marks them &lt;code&gt;active&lt;/code&gt;. When no remaining work can be drafted, it returns &lt;code&gt;nothing&lt;/code&gt;, and the engine decides whether to enter an audit round based on this.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Configuration and Customization
&lt;/h2&gt;

&lt;p&gt;The Mission Driver engine is completely generic. Customization can be achieved through configuration and prompt overrides, with absolutely no need to modify code. In general, you only need to add a &lt;code&gt;mission-driver.sh&lt;/code&gt; script in your own project; it calls the Mission Driver implementation from the AGE template project via paths configured in environment variables.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Customization Layer&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Override&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;missions/prompts/&amp;lt;name&amp;gt;.md&lt;/code&gt; overrides built-in&lt;/td&gt;
&lt;td&gt;EXECUTE prompt for data processing says "call script" instead of "modify code"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow Tuning&lt;/td&gt;
&lt;td&gt;Override a same-name flow in &lt;code&gt;missions/flows/mission-driver.json&lt;/code&gt;, add/remove/modify steps&lt;/td&gt;
&lt;td&gt;Insert a compliance audit step after CHECK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brand New Flow&lt;/td&gt;
&lt;td&gt;Write &lt;code&gt;missions/flows/&amp;lt;custom&amp;gt;.json&lt;/code&gt;, set &lt;code&gt;flowName: "&amp;lt;custom&amp;gt;"&lt;/code&gt; in mission.json&lt;/td&gt;
&lt;td&gt;Code review flow FETCH_PR → RUN_LINT → AI_REVIEW → POST_COMMENT, without Plan orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subflow Override&lt;/td&gt;
&lt;td&gt;Place a same-name subflow JSON (e.g., &lt;code&gt;plan-execution.json&lt;/code&gt;) in &lt;code&gt;missions/flows/&lt;/code&gt; to replace built-in subflows&lt;/td&gt;
&lt;td&gt;Replace EXEC_PLANS subflow so each active plan calls external scripts before and after execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commands&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;commands&lt;/code&gt; field in &lt;code&gt;mission.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;test = quality check script&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Flow loading priority&lt;/strong&gt;: project &lt;code&gt;missions/flows/&amp;lt;flowName&amp;gt;.json&lt;/code&gt; → engine built-in &lt;code&gt;tools/mission-driver/flows/&amp;lt;flowName&amp;gt;.json&lt;/code&gt;. Same-name file in project takes precedence. Subflows follow the same chain.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;promptsDir&lt;/code&gt; configuration allows different missions to point to different prompt subdirectories, enabling the same engine with different prompt sets:&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;"promptsDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"missions/prompts/analysis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"flowName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mission-driver"&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;Engine prompt loading chain: &lt;code&gt;promptsDir&lt;/code&gt; (task-type level) → &lt;code&gt;missionsDir/prompts&lt;/code&gt; (project level) → built-in default. Behavior is unchanged when &lt;code&gt;promptsDir&lt;/code&gt; is not set.&lt;/p&gt;

&lt;p&gt;The built-in CHECK→REVIEW→EXEC→DRAFT→AUDIT applies to most software development scenarios. But for tasks like data processing and document analysis, it can be fully adapted with different flows—engine unchanged, just swap the flow file.&lt;/p&gt;

&lt;p&gt;The above customization methods fully embody the Delta customization idea from the Reversible Computation Theory, a concrete implementation of non-intrusive customization. For a detailed introduction to Delta customization, see &lt;a href="https://mp.weixin.qq.com/s/JopDTYBIw0_Pmp0ZsTuMpA" rel="noopener noreferrer"&gt;How to Achieve Custom Development Without Modifying Base Product Source Code&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 3: Practice Methodology
&lt;/h1&gt;

&lt;h2&gt;
  
  
  7. Loop as Intelligence
&lt;/h2&gt;

&lt;p&gt;The effectiveness of Mission Driver comes not only from the quality of individual AI calls, but primarily from iterative feedback improvement through loops. Feedback generated in each round of execution (test results, audit findings, human corrections) should be recorded and used to improve the next round.&lt;/p&gt;

&lt;p&gt;AGE uses two parallel improvement tracks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts for doing&lt;/strong&gt; (DRAFT/EXECUTE): When AI-generated plans or code are corrected by a human, the correction record is analyzed by a sub-agent, extracting general rules and writing them into skills. The AI automatically loads them next time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts for checking&lt;/strong&gt; (CLOSURE_AUDIT/DEEP_AUDIT): When an audit misses an issue, supplement the audit prompt with additional checking dimensions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI generates first version
  → Human modifies (modification process logged)
  → Independent sub-agent compares original and modified versions
  → Extracts general rules on "why it was changed"
  → Writes into skills or coding standards
  → AI automatically loads next time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The nop-app-erp project has accumulated 19 reusable skills, all originating from this loop-based improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. AI Auto-Generation of E2E Tests
&lt;/h2&gt;

&lt;p&gt;The manual writing and maintenance cost of E2E tests is very high; previously, few teams could maintain them broadly long-term. Now, AI can generate them automatically. The key is reducing difficulty: encapsulate the PageObject pattern, provide simplified operations like &lt;code&gt;getFieldValue(containerLocator, fieldName)&lt;/code&gt;, so AI does not need to repeatedly deal with complex DOM selectors for every page.&lt;/p&gt;

&lt;p&gt;For example, in the Nop platform's AMIS pages, every field has a stable business identifier defined in view.xml via &lt;code&gt;&amp;lt;cell id="customerName"&amp;gt;&lt;/code&gt;, which is rendered as the AMIS component's &lt;code&gt;name&lt;/code&gt; attribute. AI only needs to look up fields by business name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# AI focuses on the intent "get customer name", not the DOM path
value = getFieldValue(page, "customerName")
# The encapsulation layer internally locates the input element of the corresponding AMIS component by name attribute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This encapsulation makes AI-generated test scripts more stable—when page layout changes, only the PageObject encapsulation layer needs updating; existing test cases do not need individual modification.&lt;/p&gt;

&lt;p&gt;nop-app-erp went from 0 to 260+ specs; frequent human corrections were needed in the early phase, but later it was largely auto-generated or auto-modified.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 4: Case Study
&lt;/h1&gt;

&lt;h2&gt;
  
  
  9. nop-app-erp: 154 Modules in 22 Days
&lt;/h2&gt;

&lt;p&gt;nop-app-erp provides a publicly auditable case: how multi-layer loop nesting drove AI from an empty skeleton to produce a production-grade ERP. In this project, directories like logs/audits/plans record the execution process and reasons for all key decisions, making it fully analyzable by AI to answer any questions about the project's evolution.&lt;br&gt;
This is an inevitable result of AGE's explicit requirement that the project itself is the single source of truth: no information remains stranded in human brains, chat windows, or temporary conversations; the project's documentation and source code contain the latest project status and its complete evolutionary trajectory.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scale Metrics (Independently Audited)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Development Period&lt;/td&gt;
&lt;td&gt;22 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Domains&lt;/td&gt;
&lt;td&gt;18 + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maven Modules&lt;/td&gt;
&lt;td&gt;154&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own Entities&lt;/td&gt;
&lt;td&gt;352 + 110 reference stubs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java Tests&lt;/td&gt;
&lt;td&gt;~2890 (0 failures)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright E2E&lt;/td&gt;
&lt;td&gt;260+ specs (0 regressions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan Files&lt;/td&gt;
&lt;td&gt;187 (all double-audited)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  A Real Cycle (07-10)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;08:00 CHECK     — mvn all green
08:05 REVIEW    — 4 drafts → independent review → all active
09:30 EXEC      — 4 plans executed, all green
16:00 DRAFT     — all roadmap work items done
16:05 DEEP_AUDIT — auto-triggered deep audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;One cycle took about 8 hours. The entire roadmap across 22 days was completed through dozens of cycles.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pre-Coding Defect Interception
&lt;/h3&gt;

&lt;p&gt;On 07-10, a batch of plans had independent draft review intercept 4 P0 defects: code value conflicts, BUDGET contaminating actual financials, an erroneous architectural premise in GlBalance, and dimensional ambiguity. All were intercepted before coding. Without the Plan Loop, these defects would only surface during implementation or even runtime.&lt;/p&gt;
&lt;h3&gt;
  
  
  Knowledge Transfer Curve
&lt;/h3&gt;

&lt;p&gt;Human intervention was classified into three types: Type A (explicitly specifying platform mechanisms, concentrated early on), Type B (indicating engineering principle directions), Type C (only asking AI to self-check and compare, mainly later on).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9om336qmdm5gys6e6ap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9om336qmdm5gys6e6ap.png" alt="knowledge-transfer" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two curves crossed around 06-29 ~ 07-01; thereafter, AI autonomy became the primary working mode.&lt;/p&gt;

&lt;p&gt;"Late-stage human intervention dropped to zero not because AI learned to write code, but because the attractor had been defined (the formal definition of attractors is in §12). With the right direction, AI can advance automatically."&lt;/p&gt;

&lt;p&gt;Human attention should be spent on defining attractors, not on supervising execution. Mission Driver handles the latter. Over the entire 22 days, there were only 28 human interventions, concentrated in the early project phase. Later, as the attractor stabilized, human intervention dropped to zero, and AI advanced fully autonomously.&lt;/p&gt;
&lt;h1&gt;
  
  
  Part 5: In-Depth Analysis
&lt;/h1&gt;
&lt;h2&gt;
  
  
  10. Loop Engineering Principles
&lt;/h2&gt;

&lt;p&gt;Traditional pipelines assume each step is deterministic, but the nature of AI execution is probabilistic—the same prompt in different sessions can produce different results.&lt;/p&gt;

&lt;p&gt;Advantages of loop nesting: failure is expected (loops natively support retry and skip), quality is iterative (audit findings lead to improvement), recovery is natural (checkpoints are checkboxes on disk), isolation is structural (subflow boundaries = fault tolerance boundaries).&lt;/p&gt;

&lt;p&gt;The three basic principles of Loop Engineering are: trajectory recoverability (persisted to disk, crash recovery via disk scan), local fault tolerance (subtask failure does not propagate to the parent loop), and independent verification (completion is audited by an independent sub-agent, not self-verified by the executor).&lt;/p&gt;
&lt;h3&gt;
  
  
  Stability Guarantees
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Defense Line&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Disk Persistence&lt;/td&gt;
&lt;td&gt;All state written to disk&lt;/td&gt;
&lt;td&gt;Crash → restart → disk scan → breakpoint recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subflow Isolation&lt;/td&gt;
&lt;td&gt;Each plan in its own subflow&lt;/td&gt;
&lt;td&gt;Local errors do not spread&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry Budget&lt;/td&gt;
&lt;td&gt;Max 3 fresh sessions per step&lt;/td&gt;
&lt;td&gt;Avoid repeated failures in the same context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infinite-Loop Detection&lt;/td&gt;
&lt;td&gt;ping_pong + max_cycles + max_total_steps&lt;/td&gt;
&lt;td&gt;Prevent infinite loops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watchdog&lt;/td&gt;
&lt;td&gt;60-minute sub-agent timeout&lt;/td&gt;
&lt;td&gt;Prevent hangs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Independent Audit&lt;/td&gt;
&lt;td&gt;CLOSURE_AUDIT uses different sub-agent&lt;/td&gt;
&lt;td&gt;Prevent executor self-deception&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Recovery Mechanism
&lt;/h3&gt;

&lt;p&gt;Recovery is not replay (it does not re-execute historical steps) but disk scan (scanning disk marks). On startup, the engine scans &lt;code&gt;.md&lt;/code&gt; files in plansDir, finds plans with &lt;code&gt;Status: active&lt;/code&gt;, reads checkboxes (&lt;code&gt;[x]&lt;/code&gt; skipped, &lt;code&gt;[ ]&lt;/code&gt; resumed). The &lt;code&gt;steps&lt;/code&gt; history in &lt;code&gt;run-state.json&lt;/code&gt; is only for audit viewing and does not drive recovery.&lt;/p&gt;
&lt;h2&gt;
  
  
  11. Plan Loop and Verification System
&lt;/h2&gt;

&lt;p&gt;Each plan's execution has its own internal control loop—the Plan Loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw2thhlixbpok4lw1am3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw2thhlixbpok4lw1am3x.png" alt="plan-loop" width="797" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Core principle: generation and verification must be separated. Both draft review and closure audit are executed by independent sub-agents in fresh sessions; the auditor does not inherit the executor's context, starting from a fresh repository read.&lt;/p&gt;
&lt;h3&gt;
  
  
  Verification System: Script Checking + AI Auto-Improvement
&lt;/h3&gt;

&lt;p&gt;Audit verification of whether a plan is complete is not simply mechanical checking or pure AI auditing, but a paired collaboration of both. Scripts automatically detect issues; when issues are found, AI automatically diagnoses and fixes them, then re-runs detection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXECUTE (agent: AI executes plan)
  ↓
CLOSURE_SCRIPT_CHECK (script: checks checkboxes + evidence)
  ├── pass → BUILD_VERIFY
  └── fail → CLOSURE_AUDIT (independent sub-agent review)
               ├── fixable → back to EXECUTE
               └── not fixable → blocked items moved to Deferred/Follow-up
                              rest of plan continues → completed
BUILD_VERIFY (agent: AI runs test/build/lint)
  ├── failure → AI auto-diagnosis → fix → re-run
  └── pass → plan completed ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checkpoint&lt;/th&gt;
&lt;th&gt;Detection Method&lt;/th&gt;
&lt;th&gt;Upon Finding Issue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CHECK&lt;/td&gt;
&lt;td&gt;Confirm buildable, test-passing baseline&lt;/td&gt;
&lt;td&gt;AI auto-repair (max 3 fresh sessions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLOSURE_SCRIPT_CHECK&lt;/td&gt;
&lt;td&gt;script checks checkboxes + evidence&lt;/td&gt;
&lt;td&gt;Enter CLOSURE_AUDIT → back to EXECUTE; unfixable items moved to Deferred/Follow-up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BUILD_VERIFY&lt;/td&gt;
&lt;td&gt;AI runs test/build/lint&lt;/td&gt;
&lt;td&gt;AI diagnosis → fix → re-run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEEP_AUDIT&lt;/td&gt;
&lt;td&gt;Multi-dimensional audit + adversarial review&lt;/td&gt;
&lt;td&gt;Generate remediation plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The machine acts as referee, AI acts as improver.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. AGE Theory: Attractors and Dynamical Systems
&lt;/h2&gt;

&lt;p&gt;Mission Driver is the core implementation of AGE (Attractor-Guided Engineering) theory at the tool layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;State Space = all possible states of the repository/project
Attractor   = docs documentation system (standardized docs like design/architecture)
              Defines "what stable structure the system should converge to in the long term"
Trajectory  = plans + logs + audits recording "how we got to the current state"
Control     = health checks + execution verification + independent audits correcting deviations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the roadmap is not the attractor. The Roadmap is a human-controllable macro plan, a task-oriented projection of the attractor; the true attractor is the documentation system in docs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formation of Attractors
&lt;/h3&gt;

&lt;p&gt;Attractors are not clear from the start. They undergo a process from vague to clear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;One-sentence requirement → Grill Me clarification → Attractor prototype (docs draft + roadmap)
  → Roadmap early stage: research competitors, refine attractor
  → Roadmap mid stage: execute items, audit convergence
  → Periodic insertion: audit/refactor/rethink, correct attractor
  → Convergence complete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire roadmap is executed fully autonomously, while humans influence it through two channels: before execution (Grill Me clarification + roadmap setting) and during execution (asynchronously injecting plans into the plans directory).&lt;/p&gt;

&lt;h3&gt;
  
  
  Asynchronous Human-AI Interaction
&lt;/h3&gt;

&lt;p&gt;Mission Driver does not require real-time human interaction during execution. However, humans can asynchronously inject new tasks via the plans directory at any time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (or another AI agent) generates a new plan → places it in plans/ directory
  → Next round of REVIEW_PLANS automatically picks it up
  → draft status: independent review → promoted to active
  → active status: directly enters the execution queue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plans directory can be viewed as a shared queue on the filesystem; multiple contributors can write to it independently: human developers, Code Review agents, remediation plans generated by DEEP_AUDIT all enter the same queue. There is no need to forcibly interrupt the currently executing mission to insert extra work.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Comparison with Codex Goal
&lt;/h2&gt;

&lt;p&gt;Here we can compare Mission Driver with the Codex tool's goal mode. Through source code analysis of Codex, we can see that Codex has fairly sophisticated mechanisms (SQLite state database, goal 6-state state machine, pause/resume, token budget), but it differs significantly from Mission Driver in the following dimensions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Codex Goal&lt;/th&gt;
&lt;th&gt;Mission Driver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;State Persistence&lt;/td&gt;
&lt;td&gt;SQLite + rollout JSONL. But runtime metric state is only in-memory Mutex, lost on crash; rollout may not be materialized&lt;/td&gt;
&lt;td&gt;Checkbox disk persistence + run-state.json, all state on disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Independent Verification&lt;/td&gt;
&lt;td&gt;Continuation prompt requests self-review, but update_goal(complete) only writes DB without checking objective state&lt;/td&gt;
&lt;td&gt;Combination of script checking and AI checking; CLOSURE_AUDIT mandatory by independent sub-agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task Granularity&lt;/td&gt;
&lt;td&gt;Max 1 goal per thread (single objective + token budget)&lt;/td&gt;
&lt;td&gt;Multi-plan coexistence management: plans/ can have multiple active plans simultaneously; engine executes sequentially&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Async Interaction&lt;/td&gt;
&lt;td&gt;Can pause/resume same thread, but cannot asynchronously inject new tasks&lt;/td&gt;
&lt;td&gt;Anytime drop a plan into plans/, automatically picked up next round&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure Isolation&lt;/td&gt;
&lt;td&gt;Single goal failure contaminates context window&lt;/td&gt;
&lt;td&gt;Subflow isolation: failure of one plan does not affect others&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Termination Guarantee&lt;/td&gt;
&lt;td&gt;Token budget + blocked detection (model self-reports requires 3 rounds; after self-report, deferred table prevents continued execution)&lt;/td&gt;
&lt;td&gt;Multi-layer defenses (retry budget, infinite-loop detection, watchdog, etc.), all externally enforced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Information Visibility&lt;/td&gt;
&lt;td&gt;SQLite + JSONL require tools to parse; runtime state is memory-invisible&lt;/td&gt;
&lt;td&gt;All state is files, readable by both humans and AI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  Part 6: Vision
&lt;/h1&gt;

&lt;h2&gt;
  
  
  14. Goal-Driven Vision and Economic Paradigm
&lt;/h2&gt;

&lt;p&gt;The evolution direction of Mission Driver is a goal-driven AI system—the user states the goal, the system automatically clarifies, plans, executes, and verifies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "Analyze the differences between nop-stream and Flink, improve nop-stream until it becomes a mature distributed stream processing framework"
  → Grill Me (requirement clarification) → clarified spec
  → Auto-Detect (task type → promptsDir)
  → Generate (roadmap + mission.json)
  → Run (automatic loop execution until complete)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of these, Generate (draft command) and Run (run command) already have an implementation foundation. Grill Me (enhanced deep-interview skill) and Wrapper (entry layer) need to be built.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shift in Economic Paradigm
&lt;/h3&gt;

&lt;p&gt;§1 already pointed out that in the Human in the Loop model, the efficiency bottleneck is that the human must be inside the loop. The core change of Human on the Loop is not excluding humans, but moving the human's position from an execution node inside the loop to a control factor outside the loop. The frequency and timing of intervention are determined by the clarity of the attractor, not the AI's work rhythm.&lt;/p&gt;

&lt;p&gt;The most profound impact of this structural change is the &lt;strong&gt;inversion of model selection strategy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Human in the Loop mode, every output blocks on human confirmation. The human cannot wait, so the fastest, strongest model must be used, even if it's expensive. Response latency is the primary constraint; model cost is secondary.&lt;/li&gt;
&lt;li&gt;In fully autonomous operation mode, no one is waiting. A weaker model may be slower, consume more tokens, and require more iteration rounds to complete work, but it has a low unit cost, can run at night, and multiple missions can process different roadmap work items in parallel. Response latency changes from a constraint to a schedulable variable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cost accounting thus shifts from "output per person-hour" to "intelligent output per dollar"—the former optimizes the efficiency of a single human-computer interaction, the latter optimizes the cumulative output per unit of computing power. These two optimization objectives lead to completely different engineering choices: the former pursues single-conversation quality, the latter pursues the stability of the loop structure and the rigor of auditing.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Summary
&lt;/h2&gt;

&lt;p&gt;The value of Mission Driver lies in three aspects:&lt;/p&gt;

&lt;p&gt;First, it replaces linear pipelines with persistent, locally retryable loop nesting. AI steps are probabilistic, requiring retries, iteration, and local fault tolerance. Subflow isolation ensures the failure of one plan does not affect others.&lt;/p&gt;

&lt;p&gt;Second, it achieves customization through configuration, not programming. The engine is a generic Flow DSL executor; the built-in five-step cycle is just the default flow—you can fine-tune steps, replace subflows, or design entirely new workflows. The differences between task types are captured in three layers: flow + prompt + commands.&lt;/p&gt;

&lt;p&gt;Third, it puts all state on disk. Checkbox persistence + disk scan recovery means no data loss after a process crash.&lt;/p&gt;

&lt;p&gt;It is not limited to code development. Any complex task requiring multi-step iteration, quality auditing, and fault-tolerant recovery can be driven by it. This is exactly the realization of Loop Engineering as an engineering practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mission Driver source code: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template/tools" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template/tools&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plan authoring guide: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template/plans/00-plan-authoring-and-execution-guide.md" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template/plans/00-plan-authoring-and-execution-guide.md&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In-depth analysis of AGE theory: &lt;a href="https://mp.weixin.qq.com/s/TwMkUDLNo2-bIrXrfvPqIw" rel="noopener noreferrer"&gt;Attractor Before Harness: Methodology for Large-Scale AI Development&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nop-app-erp full case materials: &lt;a href="https://github.com/entropy-cloud/nop-app-erp" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-app-erp&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>loopengineering</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>Attractor Guidance and Trajectory Mining: The Convergence Mechanism of AI Native Engineering</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Fri, 31 Jul 2026 23:22:41 +0000</pubDate>
      <link>https://dev.to/canonical/attractor-guidance-and-trajectory-mining-the-convergence-mechanism-of-ai-native-engineering-456p</link>
      <guid>https://dev.to/canonical/attractor-guidance-and-trajectory-mining-the-convergence-mechanism-of-ai-native-engineering-456p</guid>
      <description>&lt;p&gt;AGE (Attractor Guided Engineering) is a set of AI-native engineering methodology that I developed during the creation of &lt;code&gt;nop-chaos-flux&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;https://github.com/entropy-cloud/nop-chaos-flux&lt;/code&gt; is a large-scale frontend framework project developed entirely under AI leadership.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unlike typical Harness methodologies, the conceptual origin of AGE lies in the controlled convergence picture of dynamical systems in mathematical physics. Consequently, compared to methodology summaries based on accumulated experience, its introduction carries a distinct innovative character. When large AI models directly read documents and practices related to AGE, they often miss the point, frequently falling back into the engineering language they are more familiar with. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interpreting the attractor as a boundary, guardrail, or stronger constraint;&lt;/li&gt;
&lt;li&gt;Understanding skills as the primary carrier for knowledge organization;&lt;/li&gt;
&lt;li&gt;Framing the problem of information form as "whether to unify specs";&lt;/li&gt;
&lt;li&gt;Understanding the plan as an execution checklist or approval page;&lt;/li&gt;
&lt;li&gt;Treating logs, bugs, and history as retrospective archives rather than as part of the system's convergence mechanism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the real point is not any of these.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI Is a High-Frequency Random Expansion Force; the System Must Possess Endogenous Convergence Capability
&lt;/h2&gt;

&lt;p&gt;In an engineering system, AI acts more like a high-speed expansion force with inherent randomness. If it is to continuously participate in the system's evolution without causing overall drift, the capacity for convergence cannot be entrusted to the model itself. Instead, it must be endogenous to the entire system composed of the Agent, documentation, code, and verification/audit/memory mechanisms. In other words, what truly keeps the system converging stably is neither any spontaneous sense of direction from the AI, nor the unexternalized architectural judgments residing in a few individuals' minds, but rather the structural landscape provided by this extended cognitive system.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Generic Skills Cannot Substitute for a Project-Specific Attractor
&lt;/h2&gt;

&lt;p&gt;Generic skills, at best, grasp the common knowledge of a task type or domain, but they generally lack an understanding of &lt;em&gt;why this particular project is designed this way&lt;/em&gt;. In particular, they lack a firm grasp of the project's positioning, architectural trade-offs, design philosophy, overarching principles, historical baggage, and current baseline. Therefore, they are insufficient to form a project-specific attractor. When the system can only access a mass of information lacking clear authority hierarchies, proof relations, and precedence constraints, the increase in information paradoxically amplifies conflicts and heightens system instability. What is truly needed is neither generic architectural boilerplate nor some formulaic directory structure, but rather the project's own specific design ideas, semantic authority chains, and long-term convergence direction.&lt;/p&gt;

&lt;p&gt;The substance of attractor guidance is not "writing the architecture down clearly," but organizing the project-specific design ideas, macro principles, authority relations, proof chains, and historical negation space into a systemic structure that can continuously shape subsequent evolutionary trends. That is to say, the attractor is not a document, but a stable convergence topology jointly carried by multiple repository artifacts.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Information Itself Is Independent of Form, but Form Affects the Efficiency of Intelligent Computation
&lt;/h2&gt;

&lt;p&gt;Information in itself is independent of form; the same semantics can reside in different carriers such as documents, code, tests, DSLs, and logs. However, form significantly affects the efficiency, stability, and ambiguity rate of intelligent computation. Therefore, the question is not whether a unified spec must be adopted, but whether the mode of information organization fits the domain logic. Rather than flattening knowledge into a planar list of fixed formats, a better approach is often to independently organize it by domain concepts, semantic relations, and authority levels, and to establish a topological structure through links. Domain-specific expression has greater potential to achieve efficient information organization and semantic transfer.&lt;/p&gt;

&lt;p&gt;The emphasis is not on "unified form," but on "structure submitting to the domain."&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Plan Is a Local Convergence Closed Loop and Must Accept External Auditing
&lt;/h2&gt;

&lt;p&gt;The role of the Plan is not to serve as a temporary draft within a session, but to act as a verification closed loop and convergence mechanism for a given round of local changes: why make the change this time, what the boundaries are, what defines true closure, and what follow-up obligations remain. Precisely because of this, the Plan itself and its execution results must be subjected to mandatory external auditing to avoid the self-verification trap where "the implementer defines completion and then declares completion themselves." As for the specific structure of the Plan, it does not need to be absolutely uniform; it can be dynamically adjusted based on project complexity, task risk, and the current reliability of the AI—for example, whether to introduce a skill selection review or how to set the closure gate intensity.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Trajectories Are Core Objects, and Trajectory Mining Is a Generative Mechanism for Future Convergence Capability
&lt;/h2&gt;

&lt;p&gt;From the perspective of dynamical systems, one extremely critical but frequently overlooked object is the trajectory. Most practices remain stuck at the task-driven level: once the task is done, the scaffolding seems useless, and whether the history is preserved is irrelevant. This is precisely the common blind spot.&lt;/p&gt;

&lt;p&gt;Merely focusing on whether a single task is completed is not enough; what matters more is continuously recording the system's evolutionary trajectory. The significance of the trajectory is not just to record what happened in the past, but to continuously extract trend signals and periodic signals from the system's history, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which misunderstandings recur repeatedly;&lt;/li&gt;
&lt;li&gt;Which locally correct decisions are accumulating into a directional error;&lt;/li&gt;
&lt;li&gt;Which audit false positives are wasting the system's budget;&lt;/li&gt;
&lt;li&gt;Which design debts cyclically resurge;&lt;/li&gt;
&lt;li&gt;Which temporary patches always grow back into structural problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This trajectory information should not be discarded after the task ends; rather, it should be further distilled into tendentious audit prompts, calibration rules, normative document patches, or constraining document increments, thereby forming an ever-strengthening convergence force. Compared to the current practices that still generally remain at the task-driven level, trajectory mining represents an upgrade from "completing tasks" to "shaping long-term controlled evolution."&lt;/p&gt;

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

&lt;p&gt;AI is responsible for expansion; the project-specific attractor is responsible for orientation; the Plan is responsible for local closed loops; trajectory mining is responsible for continuously strengthening the convergence capability. And all of this must be built upon an information organization that conforms to the domain's semantic topology, rather than relying on generic skills or fixed templates.&lt;/p&gt;

&lt;p&gt;What attractor guidance addresses is where the system evolves in the long run; what trajectory mining addresses is how the system continuously generates stronger convergence capability from its own history. It is the combination of these two that truly allows AGE to surpass the common narratives of skills, guardrails, workflows, and review-agents.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AGE Template: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/TwMkUDLNo2-bIrXrfvPqIw" rel="noopener noreferrer"&gt;Attractor Before Harness: A Methodology for Large-Scale AI Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/j4dZm1bAK61qB8i5RzHRWA" rel="noopener noreferrer"&gt;From Spec-Driven Development to Attractor-Guided Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/CqdHL9kIeSmQnLt5FBbDHA" rel="noopener noreferrer"&gt;Why Attractor Guided Engineering Cannot Be Downgraded to an AI Agent Skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/scTDkvSOxww3YI4YNs09mA" rel="noopener noreferrer"&gt;The Divide Between the Control Layer and the Direction Layer: OpenProse, NLAHs, and AGE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>openspec</category>
      <category>harnessengineering</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>Task-Level Tools vs. Trajectory-Level Methodology: The Fundamental Divide Between Trellis, OpenSpec, and AGE</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Fri, 31 Jul 2026 23:20:21 +0000</pubDate>
      <link>https://dev.to/canonical/task-level-tools-vs-trajectory-level-methodology-the-fundamental-divide-between-trellis-p1f</link>
      <guid>https://dev.to/canonical/task-level-tools-vs-trajectory-level-methodology-the-fundamental-divide-between-trellis-p1f</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Trellis is a third-party open-source template (&lt;code&gt;@mindfoldhq/trellis&lt;/code&gt;) that aims to "give AI coding agents a consistent engineering workflow across 14+ platforms."&lt;/li&gt;
&lt;li&gt;OpenSpec is a similar third-party open-source framework (&lt;code&gt;@fission-ai/openspec&lt;/code&gt;), targeting "spec-driven development" and managing changes through delta specs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGE (Attractor-Guided Engineering)&lt;/strong&gt; is a methodology grown out of the practice of nop-chaos-flux, with the core idea of &lt;code&gt;state space → attractor → trajectory → control&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;WeChat official account series articles:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/TwMkUDLNo2-bIrXrfvPqIw" rel="noopener noreferrer"&gt;《Attractor Before Harness: A Methodology for Large-Scale AI Development》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/j4dZm1bAK61qB8i5RzHRWA" rel="noopener noreferrer"&gt;《From Spec-Driven Development to Attractor-Guided Engineering》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/CqdHL9kIeSmQnLt5FBbDHA" rel="noopener noreferrer"&gt;《Why Attractor Guided Engineering Cannot Be Downgraded to an AI Agent Skill》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/scTDkvSOxww3YI4YNs09mA" rel="noopener noreferrer"&gt;《The Divide Between the Control Layer and the Direction Layer: OpenProse, NLAHs, and AGE》&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AGE does not presuppose many fixed tools; it stresses that tools should &lt;strong&gt;gradually emerge&lt;/strong&gt; from where failures repeat: repeated errors → bug note → lesson → skill/prompt → audit script → lint rule → CI guard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core finding&lt;/strong&gt;: The shared limitation of Trellis and OpenSpec is that both use the &lt;strong&gt;single change&lt;/strong&gt; as the organizational unit, lacking repository-wide truth and the supporting capacity to evolve toward full AI automation. This analysis starts from the theoretical framework of AGE and compares the fundamental differences among the three.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Positioning: What the Three Are
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;productized engineering framework&lt;/strong&gt;, installed via &lt;code&gt;npm install -g @mindfoldhq/trellis &amp;amp;&amp;amp; trellis init&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Provides a 3-phase workflow (Plan → Execute → Finish), task management scripts, a spec system, sub-agent dispatch, and multi-platform hooks.&lt;/li&gt;
&lt;li&gt;The toolchain is determined at design time: 12 skills such as &lt;code&gt;trellis-brainstorm&lt;/code&gt;, &lt;code&gt;trellis-check&lt;/code&gt;, &lt;code&gt;trellis-update-spec&lt;/code&gt;, &lt;code&gt;trellis-break-loop&lt;/code&gt;, and so on.&lt;/li&gt;
&lt;li&gt;5 core principles: Plan before code, Specs injected not remembered, Persist everything, Incremental development, Capture learnings.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;productized spec-driven framework&lt;/strong&gt;, installed via &lt;code&gt;npm install -g @fission-ai/openspec &amp;amp;&amp;amp; openspec init&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The core model is the spec + delta + archive cycle: &lt;code&gt;specs/&lt;/code&gt; (source of truth) ← merge ← &lt;code&gt;changes/&lt;/code&gt; (delta specs).&lt;/li&gt;
&lt;li&gt;Each change contains four artifacts — proposal → specs → design → tasks — generated according to a schema dependency graph.&lt;/li&gt;
&lt;li&gt;Delta specs use ADDED/MODIFIED/REMOVED to describe incremental modifications and are merged back into the main specs upon archive.&lt;/li&gt;
&lt;li&gt;4 philosophies: fluid not rigid, iterative not waterfall, easy not complex, brownfield-first.&lt;/li&gt;
&lt;li&gt;Supports slash command integration for 25+ AI tools.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;methodology&lt;/strong&gt;, not a product. No npm package, no install command.&lt;/li&gt;
&lt;li&gt;The AGE Template is a copy-and-use document skeleton (&lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template&lt;/a&gt;) that defines document responsibilities and processes, accompanied by generic tools (&lt;code&gt;check-doc-links&lt;/code&gt;, &lt;code&gt;check-oversized-files&lt;/code&gt;, etc.). Domain-specific tools need to be extracted from practice.&lt;/li&gt;
&lt;li&gt;The AGE author has open-sourced several large-scale example projects demonstrating complete AGE practices in different domains:

&lt;ul&gt;
&lt;li&gt;nop-chaos-flux (&lt;a href="https://github.com/entropy-cloud/nop-chaos-flux):" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-chaos-flux):&lt;/a&gt; a frontend low-code framework with 15 audit files (including 11 scanners), 22 prompts, 66 bug notes, and 72 logs.&lt;/li&gt;
&lt;li&gt;nop-entropy (&lt;a href="https://github.com/entropy-cloud/nop-entropy):" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-entropy):&lt;/a&gt; a backend full-stack framework with &lt;code&gt;docs-for-ai/&lt;/code&gt; normative docs + &lt;code&gt;ai-dev/&lt;/code&gt; development memory tracks.&lt;/li&gt;
&lt;li&gt;nop-chaos-next (&lt;a href="https://gitee.com/canonical-entropy/nop-chaos-next):" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-next):&lt;/a&gt; an application-layer project, lightweight practice with &lt;code&gt;design/&lt;/code&gt;, &lt;code&gt;input/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, &lt;code&gt;skills/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Theoretical framework: &lt;code&gt;state space → attractor → trajectory → control&lt;/code&gt;; all practice elements can be deduced from this.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Tool Origin: Preset vs. Gradually Emerged
&lt;/h3&gt;

&lt;p&gt;Trellis has 12 built-in skills; AGE’s domain tools need to be accumulated by oneself, or borrowed from other projects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trellis: Tools Determined at Design Time
&lt;/h4&gt;

&lt;p&gt;Trellis’s 12 skills exist at project creation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Origin&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-brainstorm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;requirement discovery process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;code quality checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-update-spec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;spec write-back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-break-loop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;deep bug analysis (5-dimension framework)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-before-dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;pre-development context loading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-finish-work&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;task wrap-up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-start&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;task initiation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-continue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;task resumption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trellis-meta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;framework self-operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;first-principles-thinking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;thinking method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;python-design&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;Python design guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;contribute&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;framework preset&lt;/td&gt;
&lt;td&gt;contribution guide (docs, marketplace)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These skills are generic and unrelated to any specific project. Users get these tools without needing a bug history or audit findings. Among them, &lt;code&gt;trellis-break-loop&lt;/code&gt; and &lt;code&gt;trellis-update-spec&lt;/code&gt; form a mechanism to extract knowledge from failures (see Section 3 for details).&lt;/p&gt;

&lt;h4&gt;
  
  
  AGE: Tools Extracted Gradually from Practice
&lt;/h4&gt;

&lt;p&gt;The tool growth chain in nop-chaos-flux is clearly visible:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chain 1: hardcoded type dispatch → audit script&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;Bug found: hardcoded type switch in the renderer
  → audit finding: violates the architectural contract "renderers should dispatch via registry"
  → Plan 430: eliminate-hardcoded-type-dispatch-plan
  → extracted as script: scripts/audit/find-hardcoded-type-dispatch.mjs
  → rules encoded in: scripts/audit/rules.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chain 2: missing renderer markers → audit script&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;Bug found: renderer did not output marker class as per contract
  → appeared multiple times in deep audit dimension 09
  → extracted as script: scripts/audit/find-missing-renderer-markers.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chains 3–5&lt;/strong&gt;: imprecise reactive subscriptions, async without failure path, React 19 legacy APIs → each with a corresponding audit script.&lt;/p&gt;

&lt;p&gt;nop-entropy follows the same pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bug found: bare RuntimeException used in Java code
  → convention: NopException subclasses should be used
  → extracted as ast-grep rule: ai-dev/tools/rules/java-lint-bare-runtimeexception.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Out-of-the-Box vs. Gradual Accumulation
&lt;/h4&gt;

&lt;p&gt;A new Trellis project instantly gets the complete 12 skills + workflow state machine + cross-platform hooks. A new AGE project starting from the Template has only generic tools, but can refer to open-source exemplars such as nop-chaos-flux, nop-entropy, and nop-chaos-next to quickly establish domain-specific tools. Trellis suits "starting today"; AGE suits "long-term evolution".&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Extracting Knowledge from Failures: Two Mechanisms of Different Depth
&lt;/h3&gt;

&lt;p&gt;Both Trellis and AGE extract knowledge from failures, but the artifact form and degree of automation differ.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trellis: Extract to Prose Spec
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;trellis-break-loop&lt;/code&gt; provides a structured 5-dimension bug analysis framework:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Root Cause Category&lt;/strong&gt;: 5 categories (Missing Spec / Cross-Layer Contract / Change Propagation Failure / Test Coverage Gap / Implicit Assumption)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why Fixes Failed&lt;/strong&gt;: 4 failure modes (Surface Fix / Incomplete Scope / Tool Limitation / Mental Model)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevention Mechanisms&lt;/strong&gt;: 6 mechanisms (Documentation / Architecture / Compile-time / Runtime / Test Coverage / Code Review)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systematic Expansion&lt;/strong&gt;: similar issues / design flaws / process flaws&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Capture&lt;/strong&gt;: &lt;strong&gt;mandatory update of spec files&lt;/strong&gt; ("The analysis is worthless if it stays in chat. The value is in the updated specs.")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After analysis, the knowledge is written into &lt;code&gt;.trellis/spec/&lt;/code&gt; via &lt;code&gt;trellis-update-spec&lt;/code&gt;, precipitated as prose in forms like Design Decision, Common Mistake, Case Study, etc.&lt;/p&gt;

&lt;h4&gt;
  
  
  AGE: Extract to Gradually Automated Tools
&lt;/h4&gt;

&lt;p&gt;AGE’s promotion ladder (AGE Template AGENTS.md Rule 15):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Level 0: discover repeated issues
  ↓
Level 1: bug note (docs/bugs/) — record non-obvious root causes
  ↓
Level 2: lesson (docs/lessons/) — extract reusable judgment rules
  ↓
Level 3: skill/prompt (docs/skills/) — reusable audit/diagnostic methods
  ↓
Level 4: audit script (scripts/audit/) — semi-automated scanning
  ↓
Level 5: lint rule / CI guard — fully automated interception
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;nop-chaos-flux’s &lt;code&gt;docs/skills/&lt;/code&gt; directory (22 prompt files):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill/Prompt&lt;/th&gt;
&lt;th&gt;Promotion Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;bug-diagnosis-prompt.md&lt;/code&gt; (242 lines)&lt;/td&gt;
&lt;td&gt;diagnostic methodology extracted from 66+ bug fix histories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;open-ended-adversarial-review-prompt.md&lt;/code&gt; (116 lines)&lt;/td&gt;
&lt;td&gt;open-ended discovery method extracted from multiple rounds of adversarial review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deep-audit-prompts.md&lt;/code&gt; (2141 lines, 20 dimensions)&lt;/td&gt;
&lt;td&gt;structured review framework extracted from multiple rounds of deep audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;implementation-contract-review-prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;contract review method extracted from plan closure audits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Core Differences
&lt;/h4&gt;

&lt;p&gt;Both extract knowledge from failures, but the form and automation level of the artifacts differ:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Trellis&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;analysis framework&lt;/td&gt;
&lt;td&gt;5 dimensions (break-loop)&lt;/td&gt;
&lt;td&gt;promotion ladder (5 levels)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;knowledge artifact&lt;/td&gt;
&lt;td&gt;prose spec (coding conventions, cases)&lt;/td&gt;
&lt;td&gt;prompt → script → lint rule (gradual automation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deposit location&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.trellis/spec/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;docs/skills/&lt;/code&gt; → &lt;code&gt;scripts/audit/&lt;/code&gt; → CI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automation level&lt;/td&gt;
&lt;td&gt;prose only (human-readable)&lt;/td&gt;
&lt;td&gt;prose → semi-automated scanning → fully automated interception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;escalation mechanism&lt;/td&gt;
&lt;td&gt;none (break-loop output goes directly into spec)&lt;/td&gt;
&lt;td&gt;yes (same pattern recurring promotes to higher level)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The reason AGE can escalate is that it has dedicated time-sensitive document categories (&lt;code&gt;bugs/&lt;/code&gt;, &lt;code&gt;lessons/&lt;/code&gt;, &lt;code&gt;skills/&lt;/code&gt;) to track whether a pattern repeats. Trellis precipitates knowledge into the spec once; when the same mistake is made again there is no upgrade path.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Document Organization: Domain-Adapted vs. Framework-Adapted + Normative/Historical Separation
&lt;/h3&gt;

&lt;p&gt;These are two closely intertwined dimensions: who determines the document structure, and whether normative and historical information are separated.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trellis: Framework-Preset Fixed Structure, Normative and Historical Mixed
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;.trellis/&lt;/span&gt;                  &lt;span class="c1"&gt;# top-level directory mandated by Trellis&lt;/span&gt;
&lt;span class="s"&gt;├── spec/&lt;/span&gt;                  &lt;span class="c1"&gt;# coding conventions organized by package/layer + accumulated learnings&lt;/span&gt;
&lt;span class="s"&gt;│   ├── cli/backend/&lt;/span&gt;
&lt;span class="s"&gt;│   ├── cli/unit-test/&lt;/span&gt;
&lt;span class="s"&gt;│   └── guides/&lt;/span&gt;
&lt;span class="s"&gt;├── tasks/&lt;/span&gt;                 &lt;span class="c1"&gt;# task directories named by date (archived after completion)&lt;/span&gt;
&lt;span class="s"&gt;│   └── MM-DD-name/&lt;/span&gt;
&lt;span class="s"&gt;│       ├── prd.md / implement.jsonl / check.jsonl / task.json&lt;/span&gt;
&lt;span class="s"&gt;└── workspace/&lt;/span&gt;             &lt;span class="c1"&gt;# session memory isolated by developer name (rotates at 2000 lines)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure serves Trellis’s own operation: the layering of &lt;code&gt;spec/&lt;/code&gt; serves the discovery mechanism of &lt;code&gt;get_context.py&lt;/code&gt;, the format of &lt;code&gt;tasks/&lt;/code&gt; serves the lifecycle management of &lt;code&gt;task.py&lt;/code&gt;, and the developer isolation of &lt;code&gt;workspace/&lt;/code&gt; serves multi-user scenarios. The 5 core principles (Plan before code, Persist everything, etc.) are cross-project constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normative and historical are not separated.&lt;/strong&gt; The template types of &lt;code&gt;trellis-update-spec&lt;/code&gt; (Design Decision, Common Mistake, Case Study, Gotcha) naturally encourage writing historical information into the spec. &lt;code&gt;trellis-break-loop&lt;/code&gt; also requires "update spec/guides" after the 5-dimension analysis. Trellis has no separate &lt;code&gt;bugs/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, or &lt;code&gt;lessons/&lt;/code&gt; directories — &lt;code&gt;tasks/&lt;/code&gt; are archived upon completion, and &lt;code&gt;workspace/journal&lt;/code&gt; rotates at 2000 lines. Learnings have nowhere to go but into the spec.&lt;/p&gt;

&lt;p&gt;A real example — historical content in &lt;code&gt;quality-guidelines.md&lt;/code&gt; (982 lines):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Case Study (2026-04-22): &lt;code&gt;current_phase&lt;/code&gt; / &lt;code&gt;next_action&lt;/code&gt; drift across 4 writers + type declaration" — a complete bug evolution history including "what the first audit missed," "four drift patterns," and "final integration result"&lt;/li&gt;
&lt;li&gt;"Cautionary tale — 0.6.0-beta.3 → 0.6.0-beta.4 emergency revert" — account of a version rollback incident&lt;/li&gt;
&lt;li&gt;"Case Study (2026-04-30): issue #204 &lt;code&gt;--yes&lt;/code&gt; + bootstrap recovery" — includes commit hash, discovery process, and fix process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;code&gt;workflow-state-contract.md&lt;/code&gt; (299 lines): "Two production bugs (Phase 1.3 jsonl curation skip, Phase 3.4 commit skip) hit exactly this failure mode."&lt;/p&gt;

&lt;p&gt;Case Studies mixed into the spec provide immediate causal context ("why does this rule exist"), whereas AGE requires cross-file references to obtain the same context. The cost is spec file bloat and the AI’s inability to distinguish "current specification" from "historical lesson" when reading.&lt;/p&gt;

&lt;h4&gt;
  
  
  AGE: Organized by Domain Needs, Strict Normative-Historical Separation
&lt;/h4&gt;

&lt;p&gt;AGE document organization has only two constraints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Progressive disclosure&lt;/strong&gt;: unfold from a minimal entry point (index / start-here) gradually to detailed content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of normative and time-sensitive history&lt;/strong&gt;: stable files use stable names; time-sensitive records carry dates.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Within these constraints, each project organizes its document structure according to its domain needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nop-chaos-flux (frontend low-code framework)&lt;/strong&gt;: &lt;code&gt;docs/architecture/&lt;/code&gt; organized by 4-layer priority (programme → conventions → baseline → subsystems), &lt;code&gt;docs/components/&lt;/code&gt; has 100 component design docs, &lt;code&gt;docs/references/&lt;/code&gt; compresses the most-used types into a single file. This is the domain need of a frontend framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nop-entropy (backend full-stack framework)&lt;/strong&gt;: &lt;code&gt;docs-for-ai/&lt;/code&gt; organized by numbered prefix reading order (00→04), separated from &lt;code&gt;ai-dev/&lt;/code&gt; (development process memory). Because users and developers are completely different audiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGE Template (application-layer projects)&lt;/strong&gt;: has &lt;code&gt;input/&lt;/code&gt; (raw PM input) separated from &lt;code&gt;requirements/&lt;/code&gt; (implementation-ready requirements), and &lt;code&gt;backlog/&lt;/code&gt; (priority queue). This is the domain need of application development.&lt;/p&gt;

&lt;p&gt;AGE’s normative/historical separation is explicitly stipulated by nop-chaos-flux plan guide Rule 14:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documents under &lt;code&gt;docs/architecture/&lt;/code&gt; &lt;strong&gt;only describe the latest current design state&lt;/strong&gt;. Do not write historical changes, do not write "Proposed vs Current" comparisons, do not write evolution narratives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Only three types of historically related content are allowed in normative documents: the reason for a choice (why A over B), rejected alternatives with reasons (negative space), and exception records ("intentionally retained legacy behavior"). Evolution narratives must stay in &lt;code&gt;logs/&lt;/code&gt;, &lt;code&gt;bugs/&lt;/code&gt;, &lt;code&gt;plans/&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Core Differences
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Trellis&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;document structure decider&lt;/td&gt;
&lt;td&gt;framework (&lt;code&gt;.trellis/&lt;/code&gt; three-piece suite)&lt;/td&gt;
&lt;td&gt;domain (each project differs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-cutting constraints&lt;/td&gt;
&lt;td&gt;5 core principles + framework structural mandates&lt;/td&gt;
&lt;td&gt;progressive disclosure + normative/historical separation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;history in spec&lt;/td&gt;
&lt;td&gt;allowed and encouraged (Case Study, Cautionary Tale)&lt;/td&gt;
&lt;td&gt;strictly excluded (only reason for choice and negative space retained)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;carrier for history&lt;/td&gt;
&lt;td&gt;no dedicated carrier (journal rotates, tasks archived)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bugs/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, &lt;code&gt;plans/&lt;/code&gt;, &lt;code&gt;lessons/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;spec bloat risk&lt;/td&gt;
&lt;td&gt;exists (knowledge only enters, never leaves)&lt;/td&gt;
&lt;td&gt;low (owner doc retains only current state)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;spec readability&lt;/td&gt;
&lt;td&gt;high (causal context available in place)&lt;/td&gt;
&lt;td&gt;requires cross-file references for context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Plans: Closure Contracts, Not Task Lists
&lt;/h3&gt;

&lt;p&gt;An AGE plan is not "get this thing done," but establishing verifiable closure conditions for &lt;strong&gt;fully autonomous AI execution&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Full Lifecycle of a Plan
&lt;/h4&gt;

&lt;p&gt;An AGE plan has three key gates, all completed by &lt;strong&gt;independent AI sub-agents&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Draft review&lt;/strong&gt;: an independent sub-agent audits whether the scope is honest, closure gates are real, and hidden dependencies exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt;: the AI executes around the plan, recording focused proof at each step, owner doc synchronization, and verification results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closure audit&lt;/strong&gt;: &lt;strong&gt;another independent sub-agent&lt;/strong&gt; returns to the live repository and re-checks — independently verifying code, documentation, tests, and whether the closure conditions are truly satisfied.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The nop-chaos-flux plan guide (403 lines, 24 minimal rules) explicitly requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule 8: "&lt;code&gt;completed&lt;/code&gt; must come from a separate closure audit"&lt;/li&gt;
&lt;li&gt;Rule 12: "Before marking &lt;code&gt;completed&lt;/code&gt;, a closure audit performed by an independent reviewer or independent sub-agent must be completed"&lt;/li&gt;
&lt;li&gt;Rule 11: "When closing a plan, one must distinguish 'contract surface has appeared' from 'contract semantics have landed'"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Gradually Advancing Toward Full Automation
&lt;/h4&gt;

&lt;p&gt;AGE’s overall goal is to &lt;strong&gt;gradually reduce human intervention nodes&lt;/strong&gt;. In current practice, humans still control a few key nodes (defining attractors, arbitrating conflicts, calibrating direction), but the draft review and closure audit of plans are already fully completed by independent AI sub-agents. The future direction: humans control only &lt;strong&gt;input&lt;/strong&gt; and &lt;strong&gt;final output&lt;/strong&gt;, with sampling-based monitoring of intermediate processes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;first-principles-of-agent-engineering.md&lt;/code&gt; defines the essence of an Agent: "An Agent is a system that, under goal constraints, maintains, verifies, corrects, and reuses actionable cognitive structures across time." A plan is a local carrier for verification and correction — it defines "what it truly means for this round of expansion to be complete," and then an independent sub-agent verifies it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Comparison with Trellis
&lt;/h4&gt;

&lt;p&gt;Trellis’s plan/execution system has two layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First layer: PRD (design document + requirements document)&lt;/strong&gt;. Trellis’s &lt;code&gt;prd.md&lt;/code&gt; is closer to a design document than pure requirements — containing Goal, Assumptions, Requirements, Acceptance Criteria, Out of Scope, Decisions (ADR-lite), and Technical Notes. It is co-created with the user through collaborative brainstorming in Phase 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second layer: generic execution flow&lt;/strong&gt;. &lt;code&gt;workflow.md&lt;/code&gt; defines a universal 3-phase execution list for each task: Phase 1 (1.0–1.5: create task → explore requirements → research → configure context → activate) → Phase 2 (2.1–2.3: implement → quality check → rollback) → Phase 3 (3.1–3.5: quality verification → debug post-mortem → spec update → commit → wrap-up). Phase 2 implementation and checks are done autonomously by sub-agents; the Phase 3.4 commit requires a one-shot user confirmation.&lt;/p&gt;

&lt;p&gt;Comparison of AGE’s plan vs. Trellis’s PRD + execution flow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Trellis PRD + 3-phase flow&lt;/th&gt;
&lt;th&gt;AGE Plan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;plan content&lt;/td&gt;
&lt;td&gt;PRD: design + requirements + technical approach + acceptance criteria&lt;/td&gt;
&lt;td&gt;Goals/Non-Goals/Closure Gates/execution items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;execution list&lt;/td&gt;
&lt;td&gt;generic (workflow.md 3 phases, shared by all tasks)&lt;/td&gt;
&lt;td&gt;custom (each plan has its own Fix/Decision/Proof execution items)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current Baseline&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;mandatory: check live repository before execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Goals&lt;/td&gt;
&lt;td&gt;present (Out of Scope section)&lt;/td&gt;
&lt;td&gt;mandatory: prevent scope drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Closure Gates&lt;/td&gt;
&lt;td&gt;present (Acceptance Criteria, self-checked by implementer)&lt;/td&gt;
&lt;td&gt;mandatory: closure conditions, verified by independent sub-agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Draft review&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;independent sub-agent audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Closure audit&lt;/td&gt;
&lt;td&gt;none (implementer self-checks against Acceptance Criteria)&lt;/td&gt;
&lt;td&gt;independent sub-agent returns to live repository to verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;completion decision&lt;/td&gt;
&lt;td&gt;self-check before Phase 3.4 commit&lt;/td&gt;
&lt;td&gt;evidence from independent closure audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;human role&lt;/td&gt;
&lt;td&gt;participates in PRD collaboration and commit confirmation&lt;/td&gt;
&lt;td&gt;does not review intermediate plans, controls only input and final output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automation target&lt;/td&gt;
&lt;td&gt;human always in the loop&lt;/td&gt;
&lt;td&gt;gradually advancing toward full automation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Logs: Automatically Recorded Trajectory
&lt;/h4&gt;

&lt;p&gt;AGE’s AGENTS.md mandates: "After completing any significant code change, you MUST update the daily dev log."&lt;/p&gt;

&lt;p&gt;nop-chaos-flux’s &lt;code&gt;docs/logs/2026/&lt;/code&gt; directory contains 72 daily log files, each recording: specifically which workstream of which plan was closed, which code paths were modified (precise to file:line), which focused proofs passed, which owner docs were synchronously updated, repository-wide verification status, and the subagent task ID of the independent closure audit.&lt;/p&gt;

&lt;p&gt;Trellis’s equivalent is &lt;code&gt;workspace/journal-N.md&lt;/code&gt; — personal session memory, rotating after 2000 lines. It does not record precise code paths and verification baselines, and has no connection to plans.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Audit System: Shared Executive Checks + AGE’s Unique Directional Audit
&lt;/h3&gt;

&lt;p&gt;Both AGE and Trellis have code quality gates. The difference is that AGE adds a layer of directional audit.&lt;/p&gt;

&lt;h4&gt;
  
  
  Common Ground: lint/test/typecheck as Commit Gates
&lt;/h4&gt;

&lt;p&gt;Trellis’s Phase 2.2 (Quality check) and Phase 3.1 (Quality verification) require running &lt;code&gt;pnpm lint &amp;amp;&amp;amp; pnpm typecheck &amp;amp;&amp;amp; pnpm test&lt;/code&gt;, encapsulated by the &lt;code&gt;trellis-check&lt;/code&gt; skill.&lt;/p&gt;

&lt;p&gt;AGE also has mandatory gates. nop-chaos-flux’s plan guide requires &lt;code&gt;pnpm typecheck/build/lint/test&lt;/code&gt; all green to close a plan; nop-entropy’s AGENTS.md requires &lt;code&gt;./mvnw test -pl &amp;lt;affected-module&amp;gt; -am&lt;/code&gt; passes, and Rule 13 explicitly states, "fixed rules that have entered lint, static check scripts, or CI fail-fast are non-negotiable hard constraints." nop-entropy’s pre-commit hook also enforces code formatting checks. The two are equivalent at this level.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trellis Unique: 5-Dimension Post-Mortem
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;trellis-break-loop&lt;/code&gt; provides structured bug post-mortems (Root Cause Category / Why Fixes Failed / Prevention / Systematic Expansion / Knowledge Capture), updating the spec after analysis.&lt;/p&gt;

&lt;h4&gt;
  
  
  AGE Unique: Overall Document-Code Consistency Audit
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Deep Audit&lt;/strong&gt; (&lt;code&gt;deep-audit-prompts.md&lt;/code&gt;, 2141 lines, 20 dimensions) covers 6 categories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Dimensions&lt;/th&gt;
&lt;th&gt;Audit Object&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A. Architecture &amp;amp; Module Boundaries&lt;/td&gt;
&lt;td&gt;01–03&lt;/td&gt;
&lt;td&gt;dependency graph, module responsibilities, API surface area&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B. Runtime &amp;amp; State&lt;/td&gt;
&lt;td&gt;04–08&lt;/td&gt;
&lt;td&gt;state ownership, reactive precision, async safety, lifecycle, validation consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C. Renderer &amp;amp; UI&lt;/td&gt;
&lt;td&gt;09–12&lt;/td&gt;
&lt;td&gt;renderer contract, style compliance, component usage, field modeling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D. Engineering Quality&lt;/td&gt;
&lt;td&gt;13–15&lt;/td&gt;
&lt;td&gt;type safety, test coverage, security &amp;amp; performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E. Documentation &amp;amp; Consistency&lt;/td&gt;
&lt;td&gt;16–18&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;document-code consistency&lt;/strong&gt;, &lt;strong&gt;naming consistency&lt;/strong&gt;, &lt;strong&gt;cross-package pattern consistency&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F. Runtime Robustness&lt;/td&gt;
&lt;td&gt;19–20&lt;/td&gt;
&lt;td&gt;error propagation fidelity, accessibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dimensions 16–18 &lt;strong&gt;specifically audit consistency between documentation and code&lt;/strong&gt;. Audit execution model: Phase 1 iterative deep dig (up to 10 rounds per dimension, independent sub-agent each round), Phase 2 independent re-verification (independent sub-agent returns to live code to re-confirm every finding).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-ended Adversarial Review&lt;/strong&gt; (&lt;code&gt;open-ended-adversarial-review-prompt.md&lt;/code&gt;) does not preset check dimensions, encouraging leapfrog exploration and self-negation, looping until no new findings emerge.&lt;/p&gt;

&lt;p&gt;AGE adds directional audit: whether the owner doc matches the code, whether naming matches the glossary, whether the same concept is implemented consistently across packages. Deep-audit execution costs are extremely high (multiple rounds of independent sub-agents) — a trade-off that must be weighed.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Summary of Tool Comparison Between the Two
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Trellis&lt;/th&gt;
&lt;th&gt;AGE (nop-chaos-flux / nop-entropy)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;tool origin&lt;/td&gt;
&lt;td&gt;framework preset, available on install&lt;/td&gt;
&lt;td&gt;reverse-extracted from historical trajectory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;new project startup cost&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;trellis init&lt;/code&gt; gives full toolset&lt;/td&gt;
&lt;td&gt;AGE Template has only generic tools, but can reference open exemplars (nop-chaos-flux, nop-entropy) to quickly build domain-specific tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool evolution mechanism&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;trellis update&lt;/code&gt; (framework upgrade)&lt;/td&gt;
&lt;td&gt;promotion ladder (bug → lesson → prompt → script → lint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;knowledge extraction from failures&lt;/td&gt;
&lt;td&gt;yes (break-loop 5-dimension analysis → spec prose)&lt;/td&gt;
&lt;td&gt;yes (promotion ladder → gradually automated tools)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;knowledge artifact automation&lt;/td&gt;
&lt;td&gt;prose only&lt;/td&gt;
&lt;td&gt;prose → semi-automated scanning → fully automated interception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multi-platform adaptation&lt;/td&gt;
&lt;td&gt;core capability (14+ platforms)&lt;/td&gt;
&lt;td&gt;not a focus; depends on the host project’s CI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;process automation&lt;/td&gt;
&lt;td&gt;core capability (state machine, hooks, sub-agents)&lt;/td&gt;
&lt;td&gt;limited (plan closure check scripts, pre-commit hook)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool maintenance cost&lt;/td&gt;
&lt;td&gt;low (framework maintains uniformly)&lt;/td&gt;
&lt;td&gt;high (each tool needs whitelist and rule updates as the project evolves)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;normative/historical separation&lt;/td&gt;
&lt;td&gt;not separated (history precipitated into spec)&lt;/td&gt;
&lt;td&gt;strictly separated (owner doc contains only current state)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;plan system&lt;/td&gt;
&lt;td&gt;PRD requirement description&lt;/td&gt;
&lt;td&gt;closure contract (draft review + closure audit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;code quality gates&lt;/td&gt;
&lt;td&gt;yes (Phase 2.2/3.1: lint+typecheck+test)&lt;/td&gt;
&lt;td&gt;yes (plan guide Rule 13: hard gates non-negotiable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;post-mortem analysis&lt;/td&gt;
&lt;td&gt;yes (break-loop 5-dimension bug post-mortem)&lt;/td&gt;
&lt;td&gt;yes (bug note → lesson → skill promotion)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;directional audit&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;yes (deep-audit 20 dimensions including document-code consistency)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  8. Common Limitations: Trellis and OpenSpec Are Both Task-Level Tools
&lt;/h3&gt;

&lt;p&gt;Trellis and OpenSpec have three structural deficiencies.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deficiency One: No Repository-Wide Truth
&lt;/h4&gt;

&lt;p&gt;The core organizational unit for Trellis and OpenSpec is the &lt;strong&gt;single change&lt;/strong&gt; (a task / a change), not the &lt;strong&gt;repository as a whole&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trellis: each task has its own &lt;code&gt;prd.md&lt;/code&gt;; &lt;code&gt;spec/&lt;/code&gt; is a stack of coding conventions. There is no maintenance point for "what the system as a whole currently is and what it should converge to."&lt;/li&gt;
&lt;li&gt;OpenSpec: &lt;code&gt;specs/&lt;/code&gt; claims to be source of truth, but it is an &lt;strong&gt;accumulation&lt;/strong&gt; of requirements (each archive merges deltas, only adding, never removing), not a direction definition. The accumulated specs are a requirements list, not an architectural attractor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AGE’s owner doc maintains the overall direction: which modules must be separated, the single direction that dependencies may flow, what concepts must not be mixed together.&lt;/p&gt;

&lt;p&gt;AGE’s &lt;code&gt;first-principles-of-agent-engineering.md&lt;/code&gt; distinguishes two sources of truth: four-dimensional truth (facts, causal source, confidence state, negative space) answers "what is and what was," while the attractor answers "what it should converge to." Trellis and OpenSpec do not distinguish these two sources — they only have "current specifications" (specs/spec), not "direction definition" (attractor).&lt;/p&gt;

&lt;h4&gt;
  
  
  Deficiency Two: No Trajectory Between Single Changes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Trellis: tasks are archived upon completion; &lt;code&gt;journal&lt;/code&gt; rotates after 2000 lines. The next task cannot see what the previous task did, why those decisions were made, or what was rejected.&lt;/li&gt;
&lt;li&gt;OpenSpec: changes are archived and kept in &lt;code&gt;archive/&lt;/code&gt;, but they are only historical folders. There are no structured trajectory records (code paths, verification baselines, owner doc sync status). The next change does not learn from the execution process of the previous one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AGE’s &lt;code&gt;logs/&lt;/code&gt; are mandatory trajectory: precise to code paths, focused proofs, owner doc sync, and verification baselines. &lt;code&gt;bugs/&lt;/code&gt; records negative space (which paths are excluded, which assumptions were falsified). Future sessions can recover from the trajectory "what happened up to yesterday."&lt;/p&gt;

&lt;p&gt;This difference stems from the organizational unit: task-level tools care about "is this change correct," while a repository-level methodology cares about "after multiple consecutive AI changes, is the repository still heading in the right direction."&lt;/p&gt;

&lt;h4&gt;
  
  
  Deficiency Three: No Support Point for Evolving Toward Full AI Automation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Trellis: humans participate in PRD collaboration and commit confirmation; the 3-phase flow is designed for humans. There is no independent closure audit; humans do the final check.&lt;/li&gt;
&lt;li&gt;OpenSpec: &lt;code&gt;/opsx:propose&lt;/code&gt; and &lt;code&gt;/opsx:verify&lt;/code&gt; both assume a human is in the loop. &lt;code&gt;verify&lt;/code&gt; is optional, with no independent verification. &lt;code&gt;tasks.md&lt;/code&gt; is a human-readable checklist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AGE’s plan has draft review and closure audit completed by &lt;strong&gt;independent AI sub-agents&lt;/strong&gt;; humans gradually withdraw. The plan is a closure contract, not a task list for humans. The attractor defines "converge to where," and the audit checks "are we converging" — neither requires human intervention.&lt;/p&gt;

&lt;p&gt;AGE’s &lt;code&gt;age-from-state-engineering-to-trajectory-engineering.md&lt;/code&gt; puts it directly: the basic structure of traditional software engineering is "state checks + human implicit direction sense." After deep AI participation, the human brain no longer holds the complete blueprint; the "direction sense" must be externalized into the repository structure. Trellis and OpenSpec both still rely on human implicit direction sense — they make single AI-human collaborations more reliable, but they do not replace human judgment of direction.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Relative Progress of Trellis and OpenSpec
&lt;/h4&gt;

&lt;p&gt;Each has progressed relative to the other, but both still circle within the task-level framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trellis’s progress over OpenSpec:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge write-back from failure to spec&lt;/strong&gt;: &lt;code&gt;trellis-break-loop&lt;/code&gt; (5-dimension bug analysis) → &lt;code&gt;trellis-update-spec&lt;/code&gt; (mandatory spec file update). OpenSpec’s &lt;code&gt;/opsx:archive&lt;/code&gt; only merges delta specs (requirement changes), and does not write back failure lessons — learned lessons stay in the archive folder and do not flow back into the specs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete execution pipeline&lt;/strong&gt;: sub-agent dispatch (&lt;code&gt;trellis-implement&lt;/code&gt;/&lt;code&gt;trellis-check&lt;/code&gt;), jsonl context injection, rollback. OpenSpec only has an artifact dependency graph (proposal → specs → design → tasks), with no execution flow management — &lt;code&gt;/opsx:apply&lt;/code&gt; relies on the AI to find and read specs on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured bug analysis&lt;/strong&gt;: the 5-dimension analysis framework of &lt;code&gt;trellis-break-loop&lt;/code&gt; (Root Cause Category / Why Fixes Failed / Prevention / Systematic Expansion / Knowledge Capture). OpenSpec has no equivalent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;OpenSpec’s progress over Trellis:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enforced spec validation&lt;/strong&gt;: &lt;code&gt;openspec validate&lt;/code&gt; parses Markdown with a Zod schema, mandating a Purpose section, Requirements section, at least one Scenario per Requirement, ADDED/MODIFIED must contain SHALL/MUST, and no cross-section conflicts. Trellis’s spec files are completely free Markdown with no structural validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta mechanism&lt;/strong&gt;: ADDED/MODIFIED/REMOVED incremental descriptions + merge on archive. More structured than Trellis’s "stuff all knowledge into spec files."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spec/Change separation&lt;/strong&gt;: &lt;code&gt;specs/&lt;/code&gt; (source of truth) and &lt;code&gt;changes/&lt;/code&gt; (incremental modification) are kept separate. A step beyond Trellis’s non-distinction between specifications and proposals.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The spec format of OpenSpec has a fundamental limitation: the Given/When/Then Scenario is a format meant for machine verification (can be automatically converted into test cases), not a direction definition for humans to read. AGE’s owner doc is an architectural direction for humans to read ("modules must be separated," "dependencies can only flow in one direction"); the audiences of the two are different.&lt;/p&gt;

&lt;h4&gt;
  
  
  Three-Way Comparison Table
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AGE Dimension&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;th&gt;OpenSpec&lt;/th&gt;
&lt;th&gt;Trellis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;organizational unit&lt;/td&gt;
&lt;td&gt;repository as a whole (attractor + trajectory)&lt;/td&gt;
&lt;td&gt;single change (change)&lt;/td&gt;
&lt;td&gt;single change (task)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nature of spec&lt;/td&gt;
&lt;td&gt;direction definition ("what it should converge to")&lt;/td&gt;
&lt;td&gt;behavioral description ("current behavior")&lt;/td&gt;
&lt;td&gt;coding conventions ("how to write code")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;between changes&lt;/td&gt;
&lt;td&gt;trajectory records (logs + bugs + plans)&lt;/td&gt;
&lt;td&gt;archive folder (archive/)&lt;/td&gt;
&lt;td&gt;archive + rotating journal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;negative space&lt;/td&gt;
&lt;td&gt;bugs/ (excluded paths)&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;closure verification&lt;/td&gt;
&lt;td&gt;independent AI sub-agent closure audit&lt;/td&gt;
&lt;td&gt;optional /opsx:verify (self-check)&lt;/td&gt;
&lt;td&gt;Acceptance Criteria (self-check)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;full AI automation&lt;/td&gt;
&lt;td&gt;conceptually supported (plan = contract, not designed for humans)&lt;/td&gt;
&lt;td&gt;not considered (flow assumes human in the loop)&lt;/td&gt;
&lt;td&gt;not considered (3-phase flow designed for humans)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;spec validation&lt;/td&gt;
&lt;td&gt;none (owner doc freely organized by domain)&lt;/td&gt;
&lt;td&gt;enforced (Zod schema + &lt;code&gt;openspec validate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;none (free Markdown)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;knowledge promotion&lt;/td&gt;
&lt;td&gt;bug → lesson → skill → script → lint&lt;/td&gt;
&lt;td&gt;none (no progression after archive)&lt;/td&gt;
&lt;td&gt;none (break-loop output goes into spec and stops there)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  9. The Co-Evolution of Theory and Practice
&lt;/h3&gt;

&lt;p&gt;The thought of dynamical systems (&lt;code&gt;state space → attractor → trajectory → control&lt;/code&gt;) was the earliest conceptual framework established by AGE. But the specific implementation — what structure the owner doc uses, how closure audits are done, how the promotion ladder is designed — has been continuously adjusted in practice.&lt;/p&gt;

&lt;p&gt;The evolutionary history of nop-chaos-flux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attractor carrier&lt;/strong&gt; evolved from flat architecture documents to a 4-layer priority system — solidified only after multiple audits revealed priority conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closure audit&lt;/strong&gt; evolved from manual checking to mandatory independent sub-agent verification — established after Plan 143’s closure hypothesis was repeatedly overturned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The promotion ladder&lt;/strong&gt; was not designed at the beginning; it gradually formed after discovering that "prose-only lessons cannot prevent the same error from recurring."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-ended adversarial review&lt;/strong&gt; emerged because the fixed dimensions of deep-audit sometimes missed problems outside those dimensions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What specific document structures carry attractors, what mechanisms check deviation — guided by the dynamical systems thought, they are continuously calibrated and refined through practice.&lt;/p&gt;

&lt;p&gt;Trellis comes from practical observations ("what practices work in AI engineering"); the 5 core principles are empirical summaries. There is no derivation chain from theory to practice; expansion relies on stacking experiences.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Core finding&lt;/strong&gt;: Trellis and OpenSpec both use the &lt;strong&gt;single change&lt;/strong&gt; as the organizational unit, while AGE uses the &lt;strong&gt;overall repository trajectory&lt;/strong&gt; as the organizational unit. The former cares about "is this change correct"; the latter cares about "after multiple consecutive AI changes, is the repository still heading in the right direction."&lt;/p&gt;

&lt;p&gt;Specifically, the three diverge fundamentally in eight dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organizational unit&lt;/strong&gt;: Trellis and OpenSpec are task-level tools (a task / a change); AGE is a trajectory-level methodology (repository as a whole). This is the most fundamental difference, and all the following divergences derive from it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Where tools come from&lt;/strong&gt;: Trellis’s 12 skills and OpenSpec’s slash commands are preset at framework design time, available out-of-the-box for new projects; AGE’s tools are reverse-extracted from historical trajectories, new projects start from the Template’s generic tools, but can accelerate by referencing open-source exemplars such as nop-chaos-flux, nop-entropy, and nop-chaos-next. They cater to different stage needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Depth of knowledge extraction from failures&lt;/strong&gt;: All three learn from failures. Trellis’s &lt;code&gt;trellis-break-loop&lt;/code&gt; offers 5-dimension analysis; OpenSpec has an archive to retain change history; knowledge is precipitated as prose. AGE’s promotion ladder elevates the same pattern step by step into automated tools. The difference lies in the automation level of the artifacts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nature of spec&lt;/strong&gt;: OpenSpec’s specs are structured behavioral contracts (Requirement + Scenario), closer to "executable contracts" than Trellis’s coding conventions. But neither distinguishes "current behavior" from "what it should converge to." AGE’s owner doc is a direction definition, not a requirements description.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuity between single changes&lt;/strong&gt;: Trellis (task archive + journal rotation) and OpenSpec (archive folder) both lack structured trajectory records. AGE’s logs are precise to code paths and verification baselines; bugs record negative space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Support for evolving toward full AI automation&lt;/strong&gt;: Trellis and OpenSpec’s processes both assume a human in the loop. AGE’s plan is a closure contract; draft review and closure audit are completed by independent AI sub-agents, and humans gradually withdraw.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit layers&lt;/strong&gt;: All three have code quality gates. AGE adds directional audit (deep-audit 20 dimensions including document-code consistency), checking "whether the system is converging in the right direction," but at an extremely high execution cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Theory generation vs. experience stacking&lt;/strong&gt;: AGE starts from dynamical systems thinking; practical elements can be deduced from the theory. Trellis and OpenSpec come from practical observations; expansion relies on experience stacking.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AGE Methodology:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AGE Template: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/app/attractor-guided-engineering-template/AGENTS.md&lt;/code&gt; — Rule 15: Tool promotion rules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/app/attractor-guided-engineering-template/docs/articles/attractor-before-harness-ai-large-scale-development-methodology.md&lt;/code&gt; — Attractor Before Harness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;nop-chaos-flux (AGE instance):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-chaos-flux" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/skills/README.md&lt;/code&gt; — index of 22 skills/prompts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/skills/deep-audit-prompts.md&lt;/code&gt; — 2141 lines, 20-dimension deep audit framework&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/skills/open-ended-adversarial-review-prompt.md&lt;/code&gt; — open-ended adversarial review&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/skills/bug-diagnosis-prompt.md&lt;/code&gt; — diagnostic methodology extracted from 66+ bugs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/plans/00-plan-authoring-and-execution-guide.md&lt;/code&gt; — 403 lines, 24 minimal rules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/audit/&lt;/code&gt; — 15 files (including 11 scanners + rules/shared modules)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/bugs/&lt;/code&gt; — 66 bug fix histories&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/articles/first-principles-of-agent-engineering.md&lt;/code&gt; — 276 lines, fundamental principles of agent engineering&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/articles/age-from-state-engineering-to-trajectory-engineering.md&lt;/code&gt; — From State Engineering to Trajectory Engineering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;nop-entropy (AGE instance):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/nop-entropy" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-entropy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-entropy" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-entropy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ai-dev/tools/rules/&lt;/code&gt; — 3 ast-grep Java lint rules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs-for-ai/INDEX.md&lt;/code&gt; — index of normative usage documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;nop-chaos-next (AGE instance):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-chaos-next" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-next&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Application-layer AGE practice: &lt;code&gt;design/&lt;/code&gt;, &lt;code&gt;input/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, &lt;code&gt;bugs&lt;/code&gt;, &lt;code&gt;skills/&lt;/code&gt; lightweight pattern&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
      <category>openspec</category>
    </item>
    <item>
      <title>Completion Semantics vs. Context Preservation: The Design Divergence Between AGE Plan and Planning-with-Files</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Fri, 31 Jul 2026 23:15:56 +0000</pubDate>
      <link>https://dev.to/canonical/completion-semantics-vs-context-preservation-the-design-divergence-between-age-plan-and-4eh8</link>
      <guid>https://dev.to/canonical/completion-semantics-vs-context-preservation-the-design-divergence-between-age-plan-and-4eh8</guid>
      <description>&lt;p&gt;Planning-with-Files is a popular Claude Code plugin that supplements Claude Code with a more powerful planning system. This article compares its approach with the Plan concept in the AGE (Attractor-Guided Engineering) system at two levels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification Layer (Plan System)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AGE Plan&lt;/strong&gt; — The plan governance system of Attractor-Guided Engineering, defined by the 24 Minimum Rules in &lt;code&gt;docs/plans/00-plan-authoring-and-execution-guide.md&lt;/code&gt;. A pure text specification with no dependency on a specific toolchain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planning-with-Files (PwF)&lt;/strong&gt; — &lt;a href="https://github.com/OthmanAdi/planning-with-files" rel="noopener noreferrer"&gt;OthmanAdi/planning-with-files&lt;/a&gt;, a universal AI agent skill plugin originating from Manus's context engineering philosophy. Three-file structure + state model + hooks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Automation Layer (Execution Engine)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AGE Goal Driver&lt;/strong&gt; — An independent process state machine in &lt;code&gt;nop-entropy/ai-dev/tools/opencode-goal-driver/&lt;/code&gt; that engineers the textual rules of the AGE Plan into executable code. The AGE Goal Driver is an optional execution mechanism for the AGE Plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AGE Plan governs whether completion is genuine; PwF governs whether context is still present.&lt;/strong&gt; One prevents the false completion of plans, the other prevents the agent from losing its goals. This divergence determines all subsequent mechanism differences.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Design Orientation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Specification Layer: AGE Plan vs PwF
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;AGE Plan&lt;/th&gt;
&lt;th&gt;PwF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Concern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether completion is genuine&lt;/td&gt;
&lt;td&gt;Whether context is still present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attitude toward agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Distrusts completion judgment; requires independent audit review&lt;/td&gt;
&lt;td&gt;Not worried about completion judgment; worried about forgetting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trust Boundary&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trusts agent not to maliciously alter files; does not trust agent not to self-deceive&lt;/td&gt;
&lt;td&gt;Does not trust that plan files won't be tampered with; locks with SHA-256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Completion Judgment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Closure Gates + Exit Criteria + independent closure audit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;check-complete.sh&lt;/code&gt; counts phase status occurrences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan States&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9 states: `proposed \&lt;/td&gt;
&lt;td&gt;planned \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anti-Slacking Rule, Non-Degradable Items, Failure Paths, Test Strategy tiering&lt;/td&gt;
&lt;td&gt;2-Action Rule, 3-Strike Error Protocol, 5-Question Reboot Test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None (trusts agent and file system)&lt;/td&gt;
&lt;td&gt;Two-layer defense: delimiter framing + hash attestation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parallel Tasks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple plan files coexist in {% raw %}&lt;code&gt;docs/plans/&lt;/code&gt;, no isolation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.planning/&amp;lt;slug&amp;gt;/&lt;/code&gt; directory isolation + &lt;code&gt;PLAN_ID&lt;/code&gt; env var&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope of Application&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex, long-maintenance projects&lt;/td&gt;
&lt;td&gt;Any project, 17+ IDEs/platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Automation Layer: AGE Goal Driver vs PwF hooks/loop
&lt;/h3&gt;

&lt;p&gt;| Dimension | AGE Goal Driver | PwF |&lt;br&gt;
| &lt;strong&gt;Automation Method&lt;/strong&gt; | Independent process state machine + XML tag protocol | IDE hook auto-injection + session catchup |&lt;br&gt;
| &lt;strong&gt;Resume from Breakpoint&lt;/strong&gt; | &lt;code&gt;detectStartPhase&lt;/code&gt; script checks repo state | &lt;code&gt;session-catchup.py&lt;/code&gt; restores conversation from IDE session store |&lt;br&gt;
| &lt;strong&gt;Plan Validation&lt;/strong&gt; | &lt;code&gt;check-plan-checklist.mjs&lt;/code&gt; scans Closure Gates checked status | &lt;code&gt;check-complete.sh&lt;/code&gt; counts phase status occurrences |&lt;br&gt;
| &lt;strong&gt;Loop Structure&lt;/strong&gt; | Dual-loop state machine (Outer audit-driven + Inner execution-driven) | &lt;code&gt;/plan-loop&lt;/code&gt; tick-driven + Stop hook check |&lt;br&gt;
| &lt;strong&gt;Runtime Dependency&lt;/strong&gt; | Node.js independent process, no dependency on IDE primitives | Depends on IDE hook system (5 hook types) |&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Unique Features of AGE Plan (Specification Layer)
&lt;/h2&gt;

&lt;p&gt;All 24 Minimum Rules of the AGE Plan originate from seven categories of errors encountered in execution history. Each rule is a patch added because an agent had at some point self-deceptively marked something as "completed." This section only describes the requirements at the AGE Plan specification layer — these rules do not depend on the AGE Goal Driver and are equally effective when followed manually. The automation implementation of AGE Goal Driver is left to Section 4.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Closure Gates — A Final Inspection Layer Independent of Phase Exit Criteria
&lt;/h3&gt;

&lt;p&gt;Closure Gates are a plan-level final inspection checklist, forming a separate verification layer from the Exit Criteria within each Phase. Their items are not a task list, but anti-self-deception judgments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"No in-scope live defect has been silently downgraded to deferred / follow-up"&lt;/li&gt;
&lt;li&gt;"Independent sub-agent closure audit completed and evidence recorded"&lt;/li&gt;
&lt;li&gt;"All in-scope confirmed contract drifts have been converged"&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pnpm typecheck &amp;amp;&amp;amp; pnpm build &amp;amp;&amp;amp; pnpm lint &amp;amp;&amp;amp; pnpm test&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PwF's &lt;code&gt;check-complete.sh&lt;/code&gt; performs syntactic checks: it counts whether the occurrences of &lt;code&gt;**Status:** complete&lt;/code&gt; (and the &lt;code&gt;[complete]&lt;/code&gt; fallback format) equal the occurrences of &lt;code&gt;### Phase&lt;/code&gt;. PwF deliberately chooses not to perform semantic audits — its goal is cross-platform universality across 17+ platforms, and semantic auditing requires understanding project-specific completion criteria, which is difficult to templatize. The cost, however, is that it cannot differentiate between "the phase status was written as complete" and "the defect was truly fixed, the contract truly aligned." Closure Gates handle the latter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AGE Goal Driver Automation&lt;/strong&gt;: &lt;code&gt;check-plan-checklist.mjs&lt;/code&gt; automates the Closure Gates check — scanning all plan files, checking whether &lt;code&gt;completed&lt;/code&gt;-status plans have unchecked checklists, whether Closure Evidence exists, and whether all Closure Gates are checked. It distinguishes between a hard fail (completed but has unchecked items) and a warning (non-completed but has unchecked items).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.2 Independent Closure Audit — Implementers Cannot Self-Audit
&lt;/h3&gt;

&lt;p&gt;A necessary condition for marking a plan as &lt;code&gt;completed&lt;/code&gt;: an independent reviewer or an independently launched fresh sub-agent session must perform a closure audit. Implementers cannot close their own plans.&lt;/p&gt;

&lt;p&gt;Verification requires not just checking that interfaces exist, but that behavioral semantics are realized: newly added components are invoked at runtime (not just imports present), no empty method bodies/silent skipping.&lt;/p&gt;

&lt;p&gt;PwF's Stop hook only checks phase status counts, without distinguishing "who performed the audit."&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Anti-Slacking Rule — No Vague Words to Substitute Status Adjudication
&lt;/h3&gt;

&lt;p&gt;Every in-scope item must fall into, and only into, one of four definitive states before plan closure: &lt;code&gt;landed&lt;/code&gt;, &lt;code&gt;adjudicated as residual-risk-only&lt;/code&gt;, &lt;code&gt;moved to explicit successor ownership&lt;/code&gt;, &lt;code&gt;removed from scope through a recorded scope change&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;optional&lt;/code&gt;, &lt;code&gt;if time permits&lt;/code&gt;, &lt;code&gt;consider&lt;/code&gt;, &lt;code&gt;maybe&lt;/code&gt;, &lt;code&gt;nice to have&lt;/code&gt; to substitute status adjudication is prohibited.&lt;/p&gt;

&lt;p&gt;Each deferred item in &lt;code&gt;## Deferred But Adjudicated&lt;/code&gt; must carry three fields: &lt;code&gt;Classification&lt;/code&gt; (only &lt;code&gt;watch-only residual | optimization candidate | out-of-scope improvement&lt;/code&gt;), &lt;code&gt;Why Not Blocking Closure&lt;/code&gt; (explicit reason), &lt;code&gt;Successor Required&lt;/code&gt; (yes/no). Deferred items without a reason are treated as incomplete.&lt;/p&gt;

&lt;p&gt;PwF states are only &lt;code&gt;pending → in_progress → complete&lt;/code&gt;, with no intermediate state for "deferred but adjudicated."&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Non-Degradable Items + Test Strategy + Failure Paths
&lt;/h3&gt;

&lt;p&gt;These three rules together form the "non-degradable" boundary of the AGE Plan:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-Degradable Items.&lt;/strong&gt; Five categories of items cannot be placed into deferred / non-blocking: lint rules, live defects, public-contract drift, owner-doc drift, necessary focused verification. Each execution item must be tagged as one of &lt;code&gt;Fix | Decision | Proof | Follow-up&lt;/code&gt;. Confirmed live defects can only be &lt;code&gt;Fix&lt;/code&gt;, not downgraded to &lt;code&gt;Follow-up&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Strategy Tiering.&lt;/strong&gt; Every plan must declare a risk-matched test investment strategy: Auth and external API contracts must be automated (Proof items before Fix); general features are recommended to have tests; pure documentation with no behavioral changes may declare not applicable with justification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure Paths.&lt;/strong&gt; The template provides a &lt;code&gt;## Failure Paths&lt;/code&gt; table — recommended for plans involving error handling, API contracts, authentication, or external integration. Each row contains trigger conditions, expected behavior (including status codes), retryability, and user-visible performance. This forces plan authors to consider unhappy paths alongside happy paths.&lt;/p&gt;

&lt;p&gt;PwF's error handling is limited to the 3-Strike Error Protocol (retry escalation) and the Errors Encountered table (post-hoc recording), without an upfront specification of exception paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Current Baseline + Documentation Adjudication Embedded in Phases
&lt;/h3&gt;

&lt;p&gt;Before writing a plan, one must first verify the current state of the live repo, listing item by item "established facts", "facts that have been completed but old documentation hasn't synchronized", and "the real remaining gaps." The Goal is not the Baseline — Goal is where you are going, Baseline is where you currently are.&lt;/p&gt;

&lt;p&gt;Each Phase's Exit Criteria includes: "If this Phase changes the live baseline, the relevant &lt;code&gt;docs/architecture/&lt;/code&gt; has been updated; otherwise, explicitly state &lt;code&gt;No owner-doc update required&lt;/code&gt;." Documentation synchronization is work within the Phase, not wrap-up work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AGE Goal Driver Automation&lt;/strong&gt;: &lt;code&gt;detectStartPhase&lt;/code&gt; automatically determines where to continue at startup — running &lt;code&gt;check-plan-status.mjs&lt;/code&gt; to check for incomplete plans, checking if an audit directory exists; if there are incomplete plans, jump to execution; if an audit directory exists, jump to planning; if neither, start from auditing. Pure script logic, no LLM calls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.6 Historical Plan Protection + Anti-Excessive Splitting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule 20 (Historical Protection)&lt;/strong&gt;: Historical plans already marked &lt;code&gt;completed&lt;/code&gt; are by default treated as historical records and are not actively rewritten due to specification evolution, template changes, or code evolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules 21-24 (Anti-Excessive Splitting)&lt;/strong&gt;: Do not split a plan just because there are many findings or the file is nearing 30 KB. Multiple findings that fall within the same component, the same module, or the same owner-doc should preferably be merged into one owner plan. Splitting is triggered only when closure semantics diverge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Unique Features of PwF (Specification + Automation Layer)
&lt;/h2&gt;

&lt;p&gt;PwF's core concern is singular: &lt;strong&gt;preventing the agent from losing context during long tasks.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Three-File Separation + Security Isolation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;task_plan.md&lt;/code&gt; (roadmap) + &lt;code&gt;findings.md&lt;/code&gt; (knowledge base) + &lt;code&gt;progress.md&lt;/code&gt; (session log). The three files have clear responsibilities and update frequencies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Nature&lt;/th&gt;
&lt;th&gt;Read/Write Frequency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;task_plan.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Roadmap and decision record&lt;/td&gt;
&lt;td&gt;At each phase completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findings.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Research findings and external content&lt;/td&gt;
&lt;td&gt;Every 2 search operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;progress.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Timeline log and test results&lt;/td&gt;
&lt;td&gt;Continuously updated, data source for session catchup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The existence of &lt;code&gt;findings.md&lt;/code&gt; is more than just a notebook — its design carries security considerations. &lt;code&gt;task_plan.md&lt;/code&gt; is automatically injected into the agent's context by hooks at every tool call. If external web search results were written into &lt;code&gt;task_plan.md&lt;/code&gt;, adversarial instructions within them would be amplified into every tool call. The SKILL.md Security Boundary explicitly mandates: external content can only be written to &lt;code&gt;findings.md&lt;/code&gt;, not to &lt;code&gt;task_plan.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The AGE Plan does not manage research findings and external content within the plan system — these materials generated during execution are stored by the agent in appropriate locations based on actual circumstances and are not included within plan files.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Hook Auto-Injection System
&lt;/h3&gt;

&lt;p&gt;Five types of hooks execute automatically during the IDE lifecycle, eliminating the need for the agent to consciously follow rules:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;Triggered When&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UserPromptSubmit&lt;/td&gt;
&lt;td&gt;Each time the user sends a message&lt;/td&gt;
&lt;td&gt;Injects plan content into context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PreToolUse&lt;/td&gt;
&lt;td&gt;Before each Write/Edit/Bash/Read/Glob/Grep&lt;/td&gt;
&lt;td&gt;Re-reads plan to refresh attention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostToolUse&lt;/td&gt;
&lt;td&gt;After each Write/Edit&lt;/td&gt;
&lt;td&gt;Reminds to update progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop&lt;/td&gt;
&lt;td&gt;When agent attempts to stop&lt;/td&gt;
&lt;td&gt;Checks whether all phases are complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PreCompact&lt;/td&gt;
&lt;td&gt;Before context compaction&lt;/td&gt;
&lt;td&gt;Reminds to flush progress + prints Plan-SHA256 (if attestation exists)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AGE Plan's rule layer has no automatic injection mechanism and relies on the agent following AGENTS.md. The AGE Goal Driver also does not inject plan content but uses an XML tag protocol for programmatic output parsing. PwF represents a third path: using hooks to automatically stuff the plan into the context without the agent's knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Two-Layer Security Defense
&lt;/h3&gt;

&lt;p&gt;First layer (enabled by default): delimiter framing. Hook-injected plan content is wrapped in &lt;code&gt;===BEGIN PLAN DATA===&lt;/code&gt; / &lt;code&gt;===END PLAN DATA===&lt;/code&gt;, marked as structured data, with the agent instructed not to execute imperative text within.&lt;/p&gt;

&lt;p&gt;Second layer (opt-in): SHA-256 attestation. &lt;code&gt;/plan-attest&lt;/code&gt; computes and stores the hash of &lt;code&gt;task_plan.md&lt;/code&gt;. All hooks compare the hash before injection; if mismatched, they refuse injection and output &lt;code&gt;[PLAN TAMPERED]&lt;/code&gt;. The PreCompact hook also prints Plan-SHA256, ensuring the agent can still verify that the plan hasn't been tampered with after compaction.&lt;/p&gt;

&lt;p&gt;The AGE Plan has no equivalent security mechanism because it trusts the agent and the file system.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Session Catchup — Automatic Session Recovery
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;session-catchup.py&lt;/code&gt; automatically extracts the conversation that occurred after the last planning file update from the IDE's session store after &lt;code&gt;/clear&lt;/code&gt; or context reset and generates a catchup report.&lt;/p&gt;

&lt;p&gt;The AGE Plan manually reconstructs context via &lt;code&gt;docs/logs/&lt;/code&gt; and has no automatic session recovery mechanism. The AGE Goal Driver's &lt;code&gt;detectStartPhase&lt;/code&gt; determines where to continue by checking the repo state — it does not restore conversation history, only the execution position.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.5 Parallel Task Isolation
&lt;/h3&gt;

&lt;p&gt;PwF supports parallel multi-tasking: &lt;code&gt;init-session.sh "task name"&lt;/code&gt; creates an isolated directory under &lt;code&gt;.planning/YYYY-MM-DD-slug/&lt;/code&gt;, each with its own set of three files. &lt;code&gt;set-active-plan.sh&lt;/code&gt; switches the active plan, and the &lt;code&gt;PLAN_ID&lt;/code&gt; environment variable pins the terminal to a specific plan. Hooks automatically locate the correct plan via &lt;code&gt;resolve-plan-dir.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The AGE Plan has multiple plan files coexisting in &lt;code&gt;docs/plans/&lt;/code&gt; with no directory isolation or automatic switching mechanism.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.6 Operational-Level Constraints
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;2-Action Rule&lt;/strong&gt;: After every 2 search/browse operations, findings must be written to findings.md. Targeted at the volatility of multimodal content — images and browser results do not persist in context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3-Strike Error Protocol&lt;/strong&gt;: Attempt 1 diagnose and fix → Attempt 2 change approach (prohibiting repeating the same operation) → Attempt 3 rethink → after 3 failures, escalate to the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5-Question Reboot Test&lt;/strong&gt;: If the agent can answer "Where am I, where am I going, what is the goal, what have I learned, what have I done," it indicates context integrity.&lt;/p&gt;

&lt;p&gt;The AGE Plan has structured checks via Baseline and Exit Criteria, but no operation frequency constraints or quick self-tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.7 Turn-Loop Integration
&lt;/h3&gt;

&lt;p&gt;Integration with Claude Code's &lt;code&gt;/loop&lt;/code&gt; and &lt;code&gt;/goal&lt;/code&gt; combination: &lt;code&gt;/plan-loop 10m&lt;/code&gt; auto-ticks every 10 minutes (re-reads plan, runs check-complete, writes progress); &lt;code&gt;/plan-goal&lt;/code&gt; derives termination conditions from the plan. This is the looping mechanism of PwF's automation layer. The dual-loop state machine of the AGE Goal Driver is another automation approach, detailed in Section 4.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.8 17+ IDE/Platform Support
&lt;/h3&gt;

&lt;p&gt;One plan format adapts simultaneously to platforms including Claude Code, Cursor, Copilot, Gemini CLI, Kiro, Codex, Hermes, CodeBuddy, FactoryAI, Pi Agent, OpenCode, Continue, Mastra, OpenClaw, Antigravity, Kilocode, AdaL CLI, etc. The AGE Plan is used only in internal projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Relationship Between the Two (Specification Layer)
&lt;/h2&gt;

&lt;p&gt;The AGE Plan and PwF are not in a composable relationship; they are two independent plan systems, each answering different questions.&lt;/p&gt;

&lt;p&gt;The AGE Plan's plan system only governs the structure, execution, audit, and closure of the plan itself. Research findings and external content generated during execution do not belong to the plan system — the agent chooses a temporary directory to store them based on actual circumstances, organizing file links as needed. The AGE Plan does not prescribe the storage location for these materials, nor does it include them in plan files.&lt;/p&gt;

&lt;p&gt;PwF's three-file structure (task_plan + findings + progress) is an integrated design, and the security isolation rationale for findings.md directly serves the hook injection mechanism — isolating external content from the injection surface. This design cannot be dismantled and partially grafted onto the AGE Plan.&lt;/p&gt;

&lt;p&gt;The true intersection between the two is this: if the AGE Plan were to deeply integrate with some agent runtime in the future, it could emulate PwF's hook mechanism to strengthen enforcement at execution moments — for instance, automatically re-reading the plan before critical tool calls, or automatically reminding to update logs after phase completion. But this would not be "combining with PwF," but rather borrowing the hook mechanism concept to provide automatic enforcement guarantees for the AGE Plan's governance rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Automation Layer Comparison: AGE Goal Driver vs PwF hooks/loop
&lt;/h2&gt;

&lt;p&gt;The AGE Goal Driver is not the AGE Plan itself but an optional automated implementation of the AGE Plan. It sits at the same level as PwF's hooks/loop — both are mechanisms that turn plan specifications into executable systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 The Dual-Loop State Machine of AGE Goal Driver
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Outer Loop (Audit-Driven):
  Health Check → Deep Audit + Adversarial Review → Issues?
    ├─ No → DONE
    └─ Yes → Draft Plan
        ↓
      Inner Loop (Execution-Driven):
        Execute Plan → Independent Closure Audit (independent process)
          ├─ complete → break
          └─ incomplete → Extract REMAINING XML → Continue Execution
        ↓
      Build Verification → Return to Outer (re-audit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The outer loop ensures that even if all checkboxes of the current plan are checked, an independent audit must still confirm that no new issues have been introduced. The inner loop ensures that after execution, independent verification must be passed; the executor cannot self-declare completion.&lt;/p&gt;

&lt;p&gt;Each step's prompt requires the AI to output XML tags like &lt;code&gt;&amp;lt;AUDIT_RESULT&amp;gt;clean|issues&amp;lt;/AUDIT_RESULT&amp;gt;&lt;/code&gt;, and the &lt;code&gt;extractTag&lt;/code&gt; function parses these tags to drive the state machine. When the AI does not output a tag, &lt;code&gt;extractTagOrAsk&lt;/code&gt; spawns an additional AI call to infer the missing tag — a self-healing parsing layer. The entire state machine does not rely on humans reading markdown to make judgments; instead, it parses tags programmatically for automatic state transitions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Process Isolation
&lt;/h3&gt;

&lt;p&gt;Each step spawns an independent opencode process — deep-audit, adversarial-review, plan, execute, closure-audit are each isolated. The execution agent and the audit agent are inherently different processes, physically isolated rather than constrained by rules.&lt;/p&gt;

&lt;p&gt;The closure audit is performed by a completely independent opencode process with no information from the execution phase in its context; it must re-examine each Exit Criteria from the live repo. If the verification result is &lt;code&gt;incomplete&lt;/code&gt;, it extracts the specific incomplete items from the &lt;code&gt;&amp;lt;REMAINING&amp;gt;&lt;/code&gt; XML block and injects them into the prompt for the next round of execution.&lt;/p&gt;

&lt;p&gt;When a subprocess log exceeds a configurable stall threshold without updates, an independent watchdog agent is spawned, allowing it to diagnose the process state itself, read the tail of logs, and decide whether to kill the stuck process. The main driver does not make the kill decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Comparison with PwF Automation Layer
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;AGE Goal Driver&lt;/th&gt;
&lt;th&gt;PwF hooks/loop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operation Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Node.js independent process, no IDE primitive dependency&lt;/td&gt;
&lt;td&gt;Depends on IDE hook system (5 hook types)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loop Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dual-loop (Outer Audit + Inner Execution)&lt;/td&gt;
&lt;td&gt;Single-layer tick-driven (&lt;code&gt;/plan-loop&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Process Isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Independent process per step, physical isolation of audit and execution&lt;/td&gt;
&lt;td&gt;Hook calls within a single process, no process isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output Protocol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XML tags (&lt;code&gt;extractTag&lt;/code&gt; programmatic parsing)&lt;/td&gt;
&lt;td&gt;No structured output protocol, relies on markdown status markers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resume from Breakpoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;detectStartPhase&lt;/code&gt; checks repo state&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;session-catchup.py&lt;/code&gt; restores conversation history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform Dependency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires Node.js runtime&lt;/td&gt;
&lt;td&gt;17+ IDEs/platforms, plug-and-play&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  6. Which Direction is More Enduring
&lt;/h2&gt;

&lt;p&gt;The core problem PwF solves is insufficient agent context. The 2-Action Rule, session catchup, and hook auto-injection all exist because models cannot remember or read everything. This problem will gradually diminish as context windows expand and model long-context capabilities strengthen. Most of PwF's mechanisms will sediment into agent runtime infrastructure capabilities, without users needing to explicitly install a skill to solve them. PwF's security model (delimiter framing, attestation, findings isolation), however, is independent of model capabilities — no matter how strong the model, the vector of injection attacks will always exist. But that is security engineering, not a plan system.&lt;/p&gt;

&lt;p&gt;The problem the AGE Plan solves will not disappear as models become stronger. "Was the defect truly fixed?" is not a memory problem but a problem of completion semantics judgment. "This live defect was secretly downgraded to follow-up" is not that the agent forgot, but that the agent is self-deceiving. These are structural difficulties of complex engineering — scope management, contract alignment, consistency of documentation and code. The stronger the model, the faster and more changes occur, the more likely these problems become: a powerful agent can complete a complex refactoring within 50 tool calls, while quietly hiding a contract drift into follow-up on the 37th call. The 24 Minimum Rules govern not the agent's capability boundary, but the honesty of engineering judgment.&lt;/p&gt;

&lt;p&gt;The true direction of evolution is the path represented by the AGE Goal Driver — turning governance rules from "hoping the agent complies" into "system-enforced mandates." The Plan Guide defines semantics, and the AGE Goal Driver ensures semantics land. If further deeply integrated with an agent runtime — automatically re-reading the plan before key tool calls, automatically triggering exit criteria checks after phase completion — it becomes a complete solution: rule semantics from the AGE Plan, enforcement from the AGE Goal Driver, and triggering timing from a hook mechanism. All three layers revolve around the governance semantics of the AGE Plan.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>promptengineering</category>
      <category>programming</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Divide Between Control Layer and Direction Layer: OpenProse, Natural-Language Agent Harnesses, and Attractor-Guided Engineering</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Fri, 31 Jul 2026 23:12:36 +0000</pubDate>
      <link>https://dev.to/canonical/the-divide-between-control-layer-and-direction-layer-openprose-natural-language-agent-harnesses-4o33</link>
      <guid>https://dev.to/canonical/the-divide-between-control-layer-and-direction-layer-openprose-natural-language-agent-harnesses-4o33</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Related projects: &lt;a href="https://github.com/openprose/prose" rel="noopener noreferrer"&gt;OpenProse&lt;/a&gt; (&lt;code&gt;@openprose/reactor&lt;/code&gt;), &lt;a href="https://arxiv.org/abs/2603.25723" rel="noopener noreferrer"&gt;NLAHs&lt;/a&gt; (Natural-Language Agent Harnesses), &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;AGE Template&lt;/a&gt;, &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;nop-chaos-flux&lt;/a&gt; (a production-grade implementation of AGE)&lt;br&gt;
AGE methodology series: &lt;a href="https://dev.to/canonical/attractor-before-harness-a-methodology-for-large-scale-ai-development-2omk"&gt;Attractor Before Harness: A Methodology for Large-Scale AI Development&lt;/a&gt;, &lt;a href="https://dev.to/canonical/from-spec-driven-development-to-attractor-guided-engineering-134i"&gt;From Spec-Driven Development to AGE&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Starting Point
&lt;/h2&gt;

&lt;p&gt;OpenProse, Natural-Language Agent Harnesses (NLAHs), and Attractor-Guided Engineering (AGE) all try to solve the same problem: what do you do when the output of an AI agent is unreliable?&lt;/p&gt;

&lt;p&gt;The first two provide answers at the control layer—OpenProse uses a deterministic runtime so that goals can be precisely maintained, and NLAHs use natural-language documents so that harness policies can be reviewed. AGE asks a question that precedes the control layer: what structure should the control maintain in the first place?&lt;/p&gt;

&lt;p&gt;If the direction layer does not exist, better runtimes and clearer harnesses will only cause the overall structure to drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenProse&lt;/strong&gt; starts from &lt;strong&gt;runtime abstraction&lt;/strong&gt;—designing a contract language and execution engine that allows AI agents to maintain goals that “remain true” over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NLAHs&lt;/strong&gt; start from the &lt;strong&gt;representation medium&lt;/strong&gt;—externalizing agent harness policies from tangled controller code into editable natural-language documents, interpreted and executed by a shared runtime, the IHR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGE&lt;/strong&gt; starts from the &lt;strong&gt;engineering process&lt;/strong&gt;—designing a document-and-workflow system that causes a human–AI collaboration to converge continuously toward a stable structure.&lt;/p&gt;

&lt;p&gt;OpenProse asks: how do you keep a goal invariant? NLAHs ask: how do you make a single agent run follow auditable policies? AGE asks: after the system has been pushed off course, why does it still return to the right direction?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Convention&lt;/strong&gt;: In this article, “NLAHs” refers to the overall framework proposed in the paper (Natural-Language Agent Harnesses), “NLAH” refers to a single policy document, and “IHR” refers to the shared runtime (Intelligent Harness Runtime).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Fixed Point ≠ Attractor
&lt;/h2&gt;

&lt;p&gt;The core abstractions of OpenProse and AGE correspond to two distinct mathematical objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixed Point&lt;/strong&gt;: &lt;code&gt;f(x) = x&lt;/code&gt;. When the system is placed at this point, it does not move. The judgment criterion is a strict equality. A fixed point can be stable (nearby points converge to it) or unstable (nearby points move away). The concept of a fixed point does not imply the existence of a basin of attraction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attractor&lt;/strong&gt;: A set (a point, a limit cycle, a strange attractor) such that all initial states in a surrounding region (the basin of attraction) evolve toward it over time. The key property is not “put it there and it stays,” but “start near it and you will be pulled back.” An attractor need not be a single point; it can be a manifold. The system does not need to reach it exactly—as long as the trajectory is within the basin and converging, that is enough.&lt;/p&gt;

&lt;p&gt;OpenProse’s fingerprint comparison &lt;code&gt;fingerprint == fingerprint&lt;/code&gt; is a fixed-point check: is the output the same as before? If so, it stands still.&lt;/p&gt;

&lt;p&gt;AGE’s “system converges toward a stable structure” can be understood in terms of attractor criteria: the system need not reach an ideal state exactly; it is enough that the control mechanism continuously pulls it back toward the vicinity of a stable structure.&lt;/p&gt;

&lt;p&gt;One is a state judgment—“has it arrived?” The other is a process judgment—“is the direction right?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Control Target ≠ Attractor: An Ontological Distinction
&lt;/h2&gt;

&lt;p&gt;Beyond the distinction in convergence mechanisms (fixed point vs. attractor), there is a deeper ontological difference: &lt;strong&gt;control target vs. attractor&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Control Target
&lt;/h3&gt;

&lt;p&gt;Once a control framework has been established, a control target defines “where control should aim.” It assumes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The control framework itself already exists.&lt;/li&gt;
&lt;li&gt;The executor will act according to the instructions.&lt;/li&gt;
&lt;li&gt;Deviations are corrected by &lt;strong&gt;re-executing the instructions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A control target is an externally imposed specification that &lt;strong&gt;drives&lt;/strong&gt; the executor to conform to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mathematical Attractor
&lt;/h3&gt;

&lt;p&gt;An attractor is generated by the system’s own dynamics—all initial states in the surrounding region converge toward it over time. The key properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is &lt;strong&gt;emergent&lt;/strong&gt;—defined by the system’s dynamics, not by externally imposed commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perturb-and-recover&lt;/strong&gt;—push it away, and the dynamics will pull it back.&lt;/li&gt;
&lt;li&gt;The system does not &lt;strong&gt;need to “know”&lt;/strong&gt; about it—water follows the Lorenz attractor without needing to know it exists.&lt;/li&gt;
&lt;li&gt;It is a &lt;strong&gt;manifold defined by equations&lt;/strong&gt;—it does not enumerate every correct state, only the constraint relationships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An attractor provides a &lt;strong&gt;final cause&lt;/strong&gt; for control. It exists prior to control, not within it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: AGE’s attractor is only an analogy; it is not a naturally emergent mathematical object but an engineered semantic field: humans define structural constraints, and the workflow converts these constraints into a recovery dynamic that spans sessions. Its criterion is not “absence of external design,” but “whether the recovery after perturbation is driven by a persistent structural field rather than by one-off instructions.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  An Analogy
&lt;/h3&gt;

&lt;p&gt;An operations manual tells workers how to assemble parts. The workers follow the manual, and when they deviate they correct by referring back to the manual. The manual is a control target—it requires the workers to “know” it and to actively execute it.&lt;/p&gt;

&lt;p&gt;A gravity well is an attractor—no matter how you push an object, the object’s dynamics naturally pull it back. The object does not need to “know” the gravity well exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Invariants of OpenProse and NLAHs Are Both Control Targets
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenProse’s Responsibility&lt;/strong&gt; (Goal/Maintains/Continuity) is an externally defined specification. The runtime detects deviations via fingerprint comparison and re-renders when a deviation occurs. This is a control target plus deterministic execution. Convergence relies on the runtime forcibly re-executing the specification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NLAHs’ harness pattern&lt;/strong&gt; (contract + stages + state / validation / recovery / stopping rules) tells the IHR how to organize a single task run. The IHR is not a hard-coded controller but uses runtime policies to interpret the NLAH, translating the clauses into child-agent calls, state updates, validation gates, and artifact contracts. If an agent deviates, what acts are control targets such as validation / recovery / stopping rules, not a natural convergence of system dynamics. “Behavior is flexible but still policy-guided” is not attractor semantics; it is &lt;strong&gt;flexible execution under runtime semantic constraints&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  AGE’s Owner-Doc System Possesses Attractor-Like Properties by Analogy
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Perturb-and-recover dynamics&lt;/strong&gt;: AI changes code (perturbation) → test/audit discovers a deviation → correction → the system returns to the vicinity of the structure. The cross-session perturbation–detection–correction cycle constitutes a convergence dynamic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implicitly defined manifold&lt;/strong&gt;: &lt;code&gt;docs/architecture/&lt;/code&gt; does not enumerate every correct state; it defines constraint equations. The states that satisfy the constraints form a manifold—local implementations can vary, but the whole is pulled toward the same class of structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-session emergence&lt;/strong&gt;: The long-term convergence produced by hundreds of commits, dozens of plans, and multiple audits is a “system behavior,” not the behavior of a single execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AGE’s recovery likewise depends on documents as a source of truth. The difference is not merely granularity and time scale but &lt;strong&gt;what is being constrained&lt;/strong&gt;: control-layer instructions constrain how a single execution is completed; the direction layer constrains the structural region into which the results of all future executions are allowed to fall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structural Parallels at the Mechanism Layer
&lt;/h3&gt;

&lt;p&gt;The three systems exhibit structural parallels at the mechanism layer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;OpenProse&lt;/th&gt;
&lt;th&gt;NLAHs&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source of truth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Responsibility (Goal/Maintains)&lt;/td&gt;
&lt;td&gt;NLAH (contract + run rules)&lt;/td&gt;
&lt;td&gt;Owner docs (&lt;code&gt;docs/architecture/&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interpreter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenProse reactor&lt;/td&gt;
&lt;td&gt;IHR runtime&lt;/td&gt;
&lt;td&gt;AI agent reads documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution unit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;render&lt;/td&gt;
&lt;td&gt;task run&lt;/td&gt;
&lt;td&gt;plan (for major changes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;fingerprint comparison&lt;/td&gt;
&lt;td&gt;validation gates&lt;/td&gt;
&lt;td&gt;CI + audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Closure condition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;postcondition + receipt&lt;/td&gt;
&lt;td&gt;completion gates + artifacts&lt;/td&gt;
&lt;td&gt;Closure Gates + independent closure audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Correction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;re-render&lt;/td&gt;
&lt;td&gt;retry / recovery / honest stop&lt;/td&gt;
&lt;td&gt;fix code, re-read documents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The mechanism slots are similar, but the semantics differ. This table only illustrates that all three are control systems, not that they control the same kind of object. OpenProse and NLAHs make a single execution more controllable; AGE judges whether the accumulation of those executions still points toward the same long-term structure.&lt;/p&gt;

&lt;p&gt;The difference lies not at the mechanism layer but in &lt;strong&gt;whether a direction layer exists above it&lt;/strong&gt;. OpenProse’s Responsibility and NLAHs’ NLAH are both &lt;strong&gt;self-contained specifications&lt;/strong&gt;—they define their own completion conditions (fingerprint equality / contract satisfaction) without requiring external reference to “what structure the system should converge toward.” AGE also has completion conditions (CI gates, audit passing), but the irreplaceable role of owner docs is: when a local completion condition conflicts with the long-term structural direction, they provide the adjudication basis. CI can determine whether a particular import passes; owner-doc determines why &lt;code&gt;flux-react&lt;/code&gt; must not have a reverse dependency on the renderer package. The former is a control gate; the latter is the direction layer.&lt;/p&gt;

&lt;p&gt;This is precisely the distinction between the direction layer and the control layer: it is not a difference of mechanism, but whether &lt;strong&gt;there exists above the control an independent, persistent target structure that provides the final cause for all control&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Ontological Positions of the Three
&lt;/h3&gt;

&lt;p&gt;The relationship among the three is not a hierarchical one (project-level attractor ⊃ run-level attractor), but an &lt;strong&gt;ontological difference&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;Direction layer (Attractor) — AGE: the long-term convergence structure defined by owner-doc
  ↑ provides final cause for control
  │
Control layer (Control Target) — NLAHs/OpenProse: specification + runtime execution
  ↑ implements the control mechanism
  │
Mechanism layer (Mechanism) — IHR / reactor / CI: concrete detection, execution, recovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core thesis of the AGE article is precisely this: &lt;strong&gt;the direction layer precedes the control layer.&lt;/strong&gt; Without defining “where to converge,” control mechanisms have no unified meaning. Both NLAHs and OpenProse innovate at the control layer—NLAHs use NL to improve the auditability and portability of policies, while OpenProse uses a deterministic runtime to improve the precision and cost efficiency of execution. But neither can answer the direction-layer question: &lt;strong&gt;Toward what structure should the system converge over the long term?&lt;/strong&gt; A falsifiable formulation would be: if, after removing AGE’s owner-doc priority chain, logs, and bug distillation, the system can still maintain the same architectural direction during long-term refactoring, then AGE’s direction-layer claim is superfluous.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Underlying Assumptions of the Three Systems
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenProse: Sessions Will Eventually End, Responsibilities Should Not Disappear with Them
&lt;/h3&gt;

&lt;p&gt;OpenProse’s core metaphor comes from React. It models every execution of an AI agent as a render.&lt;/p&gt;

&lt;p&gt;Three key assumptions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The value of AI lies in bounded render—finite, auditable, single-shot reasoning.&lt;/li&gt;
&lt;li&gt;The source of continuity is not the session, but the persistent state of the world-model and the receipt chain.&lt;/li&gt;
&lt;li&gt;Cost is proportional to “surprise,” not to time—if nothing changes, the render does not execute.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a runtime-first worldview: first define “what remains true at runtime,” then consider the engineering process.&lt;/p&gt;

&lt;h3&gt;
  
  
  NLAHs: Policies Should Not Be Buried in Code
&lt;/h3&gt;

&lt;p&gt;The core metaphor of NLAHs (Natural-Language Agent Harnesses) comes from editable policy documents. The NLAH+IHR system splits the agent harness into a four-layer stack.&lt;/p&gt;

&lt;p&gt;Three key assumptions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Harness policies can be separated from tangled controller code and expressed in editable natural language.&lt;/li&gt;
&lt;li&gt;NL carries the policy, code carries the mechanism—precise operations stay in code, auditable policies stay in NL.&lt;/li&gt;
&lt;li&gt;A shared runtime (IHR) can provide a unified execution substrate for different NLAHs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a representation-first worldview: the representation medium of a policy determines its auditability, portability, and analyzability.&lt;/p&gt;

&lt;h3&gt;
  
  
  AGE: First Define Where the System Should Return, Then Discuss How to Get Back
&lt;/h3&gt;

&lt;p&gt;AGE’s core metaphor comes from dynamical systems theory.&lt;/p&gt;

&lt;p&gt;Three key assumptions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AI is a perturbation source structurally different from humans—high frequency, high amplitude, and lacking a sustained sense of direction.&lt;/li&gt;
&lt;li&gt;The attractor must exist before the harness—"where to correct toward" precedes "how to correct."&lt;/li&gt;
&lt;li&gt;Documents are the carrier of the attractor, code is an instantaneous projection of the attractor—neither is the attractor itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a process-first worldview: first define “toward what structure the system should converge,” then design the runtime behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary of Divergences
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;OpenProse&lt;/th&gt;
&lt;th&gt;NLAHs&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core question&lt;/td&gt;
&lt;td&gt;How to make AI continuously maintain a goal that is true?&lt;/td&gt;
&lt;td&gt;How to externalize harness policies as auditable NL?&lt;/td&gt;
&lt;td&gt;How to make the system continuously converge toward a stable structure under high-frequency AI perturbations?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Problem domain&lt;/td&gt;
&lt;td&gt;The lifecycle of a single responsibility&lt;/td&gt;
&lt;td&gt;The harness policy of a single task run&lt;/td&gt;
&lt;td&gt;The evolutionary trajectory of an entire repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time scale&lt;/td&gt;
&lt;td&gt;Single render (minutes) to continuous serve (days)&lt;/td&gt;
&lt;td&gt;Single task run (minutes to hours)&lt;/td&gt;
&lt;td&gt;Single commit (minutes) to project evolution (months/years)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nature of invariant&lt;/td&gt;
&lt;td&gt;Control target (specification + fixed point)&lt;/td&gt;
&lt;td&gt;Control target (specification + soft constraints)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Engineered direction field&lt;/strong&gt; (engineered attractor-like structure)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stability concept&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fixed point&lt;/strong&gt;—fingerprint equality means no change&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Policy conformance&lt;/strong&gt;—conforming to the policy is correct&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Attractor&lt;/strong&gt;—within the basin means converging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meaning of "correct"&lt;/td&gt;
&lt;td&gt;Output matches expectation precisely (binary)&lt;/td&gt;
&lt;td&gt;Execution path follows the policy specified by NLAH&lt;/td&gt;
&lt;td&gt;The system is moving in the direction of convergence (directional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control mechanism&lt;/td&gt;
&lt;td&gt;Deterministic fingerprint comparison (zero LLM)&lt;/td&gt;
&lt;td&gt;IHR interprets NL policy (relies on LLM)&lt;/td&gt;
&lt;td&gt;Perturb-recover dynamics (test → audit → fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy enforcement&lt;/td&gt;
&lt;td&gt;Enforced by runtime&lt;/td&gt;
&lt;td&gt;Runtime + NL guidance&lt;/td&gt;
&lt;td&gt;Induced by institutionalized process, not enforced by runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Core Abstraction Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Smallest Primitives
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenProse’s Responsibility&lt;/strong&gt; is a self-contained computational unit with explicit input boundaries (Requires), output boundaries (Maintains), a goal (Goal), and a continuity constraint (Continuity). Execution produces a receipt—a content-addressed, chain-verifiable proof of decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NLAHs’ NLAH document&lt;/strong&gt; is an editable policy description that defines the lifecycle policy of a task run: contract, stages, roles, state rules, verification rules, recovery rules, and stopping conditions. A NLAH does not “tell the model how to answer”; it “tells the runtime how to organize a multi-step execution.”&lt;/p&gt;

&lt;p&gt;The IHR’s execution semantics do not compile the NLAH into code, nor does it let an agent act freely after reading the document. It uses a fixed runtime-policy prompt to turn the base agent into a parent orchestrator: the parent reads the NLAH and translates the contract, stages, state rules, validation rules, recovery rules, and stopping conditions into child-agent task packets, handoffs, state files, artifact gates, and completion checks. The stages themselves are still executed intelligently by child agents; precise operations such as tests, parsers, validators, and benchmark adapters are handled by scripts/adapters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGE’s Attractor&lt;/strong&gt; is not an object, but a structural property composed of three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structure layer&lt;/strong&gt;: a small set of high-level invariants (e.g., the package dependency direction &lt;code&gt;flux-core → ... → flux-renderers&lt;/code&gt;, the closure of seven primitives, the compile-first pipeline).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carrier layer&lt;/strong&gt;: auditable documents that carry these invariants (&lt;code&gt;docs/architecture/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation layer&lt;/strong&gt;: the parts of the current code that embody these invariants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both Responsibility and NLAH are &lt;strong&gt;instances&lt;/strong&gt;—you can count “this project has 23 responsibilities” or “this benchmark has 1 NLAH.” An Attractor is a &lt;strong&gt;property&lt;/strong&gt;—you cannot count “this project has 5 attractors”; it is more like “the attractor of this system is a low-dimensional manifold.”&lt;/p&gt;

&lt;p&gt;All three systems have mechanisms for closing an AI action into a completable unit: OpenProse’s render, NLAHs’ task run, AGE’s plan. The closure of a render is determined by the input fingerprint, postcondition, and receipt; the closure of a task run is determined by the NLAH’s task contract, validation rules, artifact contracts, and stopping conditions; the closure of a plan is determined by &lt;code&gt;Plan Status&lt;/code&gt;, &lt;code&gt;Current Baseline&lt;/code&gt;, &lt;code&gt;Goals&lt;/code&gt;, &lt;code&gt;Non-Goals&lt;/code&gt;, the execution/proof checklist, &lt;code&gt;Closure Gates&lt;/code&gt;, and an independent closure audit.&lt;/p&gt;

&lt;p&gt;A plan is not a to-do list; it is an evidence structure for whether a major change can be closed: first verify the current baseline, constrain the goals and non-goals, prove each item during execution, and finally have an independent audit confirm that the in-scope items have been completed or honestly deferred. The relationship between a plan and the owner-doc is not “update the document every time.” Instead, the owner-doc is used to judge the boundaries and closure conditions of the current change; only when the change alters the live baseline, public contract, or owner behavior does closure require synchronizing the document.&lt;/p&gt;

&lt;p&gt;NLAH and AGE plan are similar in mechanism: both use natural language to define the contract, stages, evidence, and stopping conditions, and both oppose relying solely on the agent’s self-reported completion. However, they close different things: NLAH closes a single run, proving that the execution trajectory satisfies the harness policy; plan closes a single change, proving that the results, evidence, and textual state of the current scope are sufficient to be accepted by an independent audit.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;NLAH&lt;/th&gt;
&lt;th&gt;AGE plan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The harness policy of a single agent run&lt;/td&gt;
&lt;td&gt;The closure contract of a single major change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IHR parent orchestrator + child agents&lt;/td&gt;
&lt;td&gt;Implementing agent / human executing according to the plan; independent reviewer or fresh subagent performs the closure audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Evidence carrier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;STATE_ROOT, artifacts, run logs&lt;/td&gt;
&lt;td&gt;Plan checklist, proof, verification output, daily log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stopping condition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Task contract, artifact contract, stopping conditions&lt;/td&gt;
&lt;td&gt;Closure Gates, in-scope checklist, deferred adjudication, closure audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Handling after failure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-run retry / recovery / honest stop&lt;/td&gt;
&lt;td&gt;Not closing, supplementing proof, changing status, extracting a non-blocking follow-up or new plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  State Model
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;OpenProse&lt;/th&gt;
&lt;th&gt;NLAHs&lt;/th&gt;
&lt;th&gt;AGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;State representation&lt;/td&gt;
&lt;td&gt;Content-addressed world-model (formal)&lt;/td&gt;
&lt;td&gt;Filesystem state (STATE_ROOT + artifacts)&lt;/td&gt;
&lt;td&gt;Code + docs + logs (informal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judgment mechanism&lt;/td&gt;
&lt;td&gt;Deterministic fingerprint function (canonicalizer)&lt;/td&gt;
&lt;td&gt;Validation gates + artifact contracts&lt;/td&gt;
&lt;td&gt;CI commands + human review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;Receipt ledger (chain-verifiable)&lt;/td&gt;
&lt;td&gt;Artifact files + logs (within a single run)&lt;/td&gt;
&lt;td&gt;Logs + Bug Notes + Git history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stability semantics&lt;/td&gt;
&lt;td&gt;Fixed-point detection (&lt;code&gt;hash == hash&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Policy conformance (conforms to policy)&lt;/td&gt;
&lt;td&gt;Attractor convergence (within the basin and direction correct)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-session memory&lt;/td&gt;
&lt;td&gt;Receipt chain (chain-verifiable)&lt;/td&gt;
&lt;td&gt;None (filesystem state within a single run)&lt;/td&gt;
&lt;td&gt;Present (logs, bugs, discussions, plans)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Technical Implementation Comparison
&lt;/h2&gt;

&lt;p&gt;OpenProse is a strict two-phase architecture: at compile time it uses an LLM to produce deterministic artifacts (Forme DAG, canonicalizer, postcondition validators); at runtime it never calls an LLM—all decisions are deterministic. AGE has no “compile once then run” separation; verification is continuously embedded in every change—typecheck → build → lint → test → audit → logs, always verifying the direction. NLAHs sit in between: NL policy is separated from deterministic hooks, but the IHR runtime relies on an LLM to interpret the policy.&lt;/p&gt;

&lt;p&gt;AGE explicitly identifies the &lt;strong&gt;self-verification trap&lt;/strong&gt;: when an AI generates both the code and all the evaluation materials (types, tests, docs, completion summary) from the same context, if the understanding is biased, all the “verification evidence” will drift in the same direction. The countermeasure is to force a separation between generation and evaluation—a closure audit must be performed by a fresh context. OpenProse bypasses the same problem by freezing deterministic functions at compile time. NLAHs avoid it in the paper’s evaluation scenarios by relying on a benchmark autograder, but in production deployment they would likewise require an external verification mechanism to avoid the self-verification trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding "Consistency"—Three Semantics
&lt;/h2&gt;

&lt;p&gt;This is the deepest point of divergence among the three systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenProse’s fixed-point consistency&lt;/strong&gt;: Each responsibility’s render produces a world-model; a canonicalizer derives a fingerprint. If the fingerprint is the same as before, the system is “consistent.” The judgment is binary: equal or not equal, there is no “roughly consistent.” At the composition level, if every responsibility is at its own fixed point and the DAG topology is correct, the entire system is consistent. Bottom-up, each local fixed point composes into a global fixed point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NLAHs’ policy-conformance consistency&lt;/strong&gt;: whether the agent’s execution path follows the policy specified by the NLAH. The paper defines metrics such as pattern-preservation, stage-coverage, and artifact-contract compliance to measure this. It is not binary—the NLAH allows flexible execution but requires that the policy structure (stages, roles, validation gates, state rules) be preserved. The paper’s RQ2 found that NLAH preserves recognizable workflow structure (workflow preservation 0.63–0.67, stage coverage 0.57–0.82), but information passing is a primary weakness (handoff recall as low as 0.32).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGE’s attractor consistency&lt;/strong&gt;: Not binary. A system can be “mostly near the attractor, but one subsystem has deviated”—this is not “inconsistent” but “within the basin yet off-center.” The judgment criterion is directional: is the system converging toward the attractor or moving away? A single commit can pass all tests (within the basin), but if it introduces an architectural drift (e.g., reversing the package dependency direction), the system’s trajectory is no longer converging toward the attractor. Top-down—even if every module’s tests pass (every local part is at a fixed point), the whole can still drift away from the attractor.&lt;/p&gt;

&lt;p&gt;AGE’s original assertion: &lt;em&gt;“All state-level checks can pass, yet the system as a whole is drifting.”&lt;/em&gt; Plan 76 of nop-chaos-flux is an example: an attempt to remove the local state mirror of &lt;code&gt;array-editor&lt;/code&gt; produced 11 test failures—not because of a single bug, but because the tests themselves had drifted into a temporally coupled state with the old implementation. Every accumulated change had passed review and CI, but from the attractor’s perspective, the test suite had drifted away from a position capable of supporting structural evolution. This is precisely why the attractor concept exists.&lt;/p&gt;

&lt;p&gt;This distinction is not a terminological preference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fixed-point methods can only detect “has it arrived exactly?”—they are very weak at distinguishing between “on the way toward convergence but not there yet” and “already deviated.”&lt;/li&gt;
&lt;li&gt;Attractor methods naturally focus on the trajectory’s direction—the system does not need to arrive exactly; it only needs to be converging, and convergence itself is sustainable.&lt;/li&gt;
&lt;li&gt;Fixed points work well in discrete state spaces (like the fingerprint of a world-model); attractors are more expressive in continuous state spaces (like the evolution of an architecture).&lt;/li&gt;
&lt;li&gt;This directly explains why OpenProse uses &lt;code&gt;hash == hash&lt;/code&gt; (discrete equality) and AGE uses “CI passes + docs consistency + architectural boundaries intact” (multi-dimensional convergence signals).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Three Dimensions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Positioning of AI.&lt;/strong&gt; OpenProse models AI as a bounded render function; its role is &lt;strong&gt;executor&lt;/strong&gt;. NLAHs model AI as an execution system organized by a harness policy: the parent orchestrator interprets the NLAH according to runtime policies, child agents execute concrete tasks—roles are differentiated into &lt;strong&gt;orchestrator + executor&lt;/strong&gt;. AGE models AI as a high-frequency, high-amplitude perturbation lacking a sustained sense of direction; its role is &lt;strong&gt;perturbation source + executor&lt;/strong&gt;—simultaneously constrained and utilized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding of Documents.&lt;/strong&gt; OpenProse: &lt;code&gt;*.prose.md&lt;/code&gt; &lt;em&gt;is&lt;/em&gt; the program; if anything disagrees with the Markdown, the Markdown is correct. NLAHs: an NLAH document is a &lt;strong&gt;policy&lt;/strong&gt;—it specifies “how to do” without directly “executing”; the most auditable parts are separated from implementation details. AGE: documents are the &lt;strong&gt;carrier layer&lt;/strong&gt; of the attractor; code is an &lt;strong&gt;instantaneous projection&lt;/strong&gt; of the attractor; the carrier layer defines where it should return.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure Handling.&lt;/strong&gt; OpenProse: failure produces a &lt;code&gt;failed&lt;/code&gt; receipt, immediate, individual, each render recorded independently. NLAHs: NLAH defines Recovery Rules (retry, rollback, evidence); failed artifacts are preserved for analysis but are not distilled across runs. AGE: failure produces a structured Bug Note; recurring failure patterns are distilled into guardrails and escalated along a progressive automation ladder (notes → checklists → heuristic scripts → lint rules → CI gates).&lt;/p&gt;

&lt;h2&gt;
  
  
  Empirical Evidence of Progressive Automation: The nop-chaos-flux Toolchain
&lt;/h2&gt;

&lt;p&gt;A core thesis of the AGE methodology is: &lt;em&gt;what can be turned into a deterministic check will gradually be extracted from trajectory data into deterministic scripts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The toolchain of &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;nop-chaos-flux&lt;/a&gt; provides complete empirical evidence for this claim. The observed 5-tier progressive automation ladder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tier 1: Trajectory capture (Bug Notes + Logs)
  62+ bug fix notes, 72 daily dev logs

Tier 2: Pattern distillation (Architecture Guardrails + Audit Rules)
  8 guardrails distilled from bugs, 19 dedicated audit rules

Tier 3: Codified review patterns (Skills/Prompts)
  24 reusable audit/review prompt templates

Tier 4: Heuristic suspicion scanners (Heuristic Scanners, exit 0)
  12 focused audit scanners, informational output

Tier 5: Hard-gate automation (Hard Gates, CI-blocking, exit 1 on failure)
  14 hard gate scripts, 30+ ESLint rules, dependency-cruiser, Semgrep, Husky pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example A: Build Artifacts Polluting Source Directories
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tier 1&lt;/strong&gt; — Bug #23: Residual &lt;code&gt;.js&lt;/code&gt; files in &lt;code&gt;packages/*/src/&lt;/code&gt; were silently overriding &lt;code&gt;.ts&lt;/code&gt; source files during Vitest runs, causing test failures whose root cause was not in the test code. A total of 102 stale files were found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2&lt;/strong&gt; — Guardrail #6 “No Build Artifacts In Source Directories” was distilled into &lt;code&gt;docs/references/architecture-guardrails-from-bugs.md&lt;/code&gt;, with links to bug evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 5&lt;/strong&gt; — &lt;code&gt;scripts/verify-no-src-artifacts.mjs&lt;/code&gt; became a hard gate (CI-blocking), while &lt;code&gt;scripts/clean-src-artifacts.mjs&lt;/code&gt; provided cleanup capability. The &lt;code&gt;pnpm lint&lt;/code&gt; chain runs clean + verify before ESLint.&lt;/p&gt;

&lt;p&gt;From bug to CI gate, the full 5-tier ladder was traversed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Thought Experiment: Managing nop-chaos-flux with OpenProse or NLAHs
&lt;/h2&gt;

&lt;p&gt;If the architectural invariants of nop-chaos-flux were modeled as OpenProse responsibilities, you would obtain precise runtime change detection, but you would not be able to answer why these invariants should be organized that way or how they should evolve. If plan execution were modeled as NLAHs, you would obtain structured execution workflows, but you could not answer whether, after 100 plans, the system is still converging. Both are control-layer tools; neither covers the direction layer.&lt;/p&gt;

&lt;p&gt;AGE’s owner-doc system handles these questions. OpenProse’s responsibility contracts do not cover the direction layer. NLAHs’ policy documents do not cover the cross-session trajectory evolution. Both are excellent control-layer tools, but the attractor (direction layer) falls outside their problem domain.&lt;/p&gt;

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

&lt;p&gt;OpenProse answers: “Given a goal that must continuously remain true, how can we use AI to maintain it efficiently, safely, and auditably?”—a micro-runtime problem.&lt;/p&gt;

&lt;p&gt;NLAHs answer: “Given tangled controller code, how can we externalize reusable harness policies into NL documents that are auditable, portable, and amenable to ablation analysis?”—a representation-medium problem.&lt;/p&gt;

&lt;p&gt;AGE answers: “Given a system that continuously evolves under AI perturbation, how can we ensure it does not drift away from a stable structure?”—a macro-process problem.&lt;/p&gt;

&lt;p&gt;The three safeguard different formal/engineered stability semantics, and even different ontological layers. OpenProse trusts algorithms (deterministic functions, content addressing, chain verification) to maintain a fixed point; NLAHs trust auditable NL policies (IHR interpreting and executing, modules amenable to ablation) to maintain policy conformance; AGE trusts not a generic process but a process that is auditable, cumulative, adversarial-reviewable, and capable of sedimenting failure into future constraints. OpenProse and NLAHs innovate at the control layer; AGE contributes at the direction layer.&lt;/p&gt;

&lt;p&gt;The real divergence lies in where failure accumulates: OpenProse localizes failure to a responsibility, NLAHs localize failure to a task run, AGE treats failure as a signal in a cross-session trajectory.&lt;/p&gt;

&lt;p&gt;In the practice of nop-chaos-flux, AGE’s progressive automation ladder has already been validated: 62+ bug notes → 8 guardrails → 14 hard gates + 12 heuristic scanners + 30+ ESLint rules. Bug #23 (build artifact pollution) fully traversed the 5-tier distillation from bug note to CI-blocking hard gate. 72 log files record the system’s trajectory, 46 execution plans serve as local convergence mechanisms, and the priority chain of 58 architectural documents is the carrier layer of the attractor.&lt;/p&gt;

&lt;p&gt;OpenProse can turn the local invariants that AGE has already made explicit into precise change detection. NLAHs can turn harnesses into objects amenable to ablation. Both are excellent control-layer tools; but the attractor (the direction layer) falls outside their problem domain. They can serve as control-layer executors; they cannot replace a direction-layer judge.&lt;/p&gt;

&lt;p&gt;One could put it this way: if a project continuously passes CI, review, and harness contracts, yet after 50 AI-assisted changes exhibits package boundary reversals, semantic test coupling, and owner-doc conflicts, then the control layers of OpenProse/NLAHs have succeeded—and the problem that AGE is designed to address has only just become visible. That is the dividing line among the three: not who is more comprehensive, but who can see the long-term drift.&lt;/p&gt;

&lt;p&gt;The control layer can tell AI how to correct an error; the direction layer determines what counts as an error in the first place.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>Two Scales of Self-Evolution: Deep Structural Correspondence between RMSP Agent and AGE Methodology</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Wed, 03 Jun 2026 06:23:46 +0000</pubDate>
      <link>https://dev.to/canonical/two-scales-of-self-evolution-deep-structural-correspondence-between-rmsp-agent-and-age-methodology-bld</link>
      <guid>https://dev.to/canonical/two-scales-of-self-evolution-deep-structural-correspondence-between-rmsp-agent-and-age-methodology-bld</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;: RMSP (Reward-Modulated Structural Plasticity) proposes a new paradigm in which an agent's behavioral topology self-evolves through use. AGE (Attractor-Guided Engineering) proposes a methodology that enables a software repository to continuously converge under high-frequency AI perturbations. These two are not competing approaches—RMSP adjusts an agent's internal structure (on the order of seconds), while AGE stabilizes repository-level invariant contracts (on the order of days). nop-chaos-flux is a complete implementation of AGE at the framework level. Its owner-doc system has undergone structural evolution in four directions—responsibility splitting (split), high-level abstraction (lift), removal of obsolete structures (prune), and cross-referencing (connect)—which correspond exactly to the structural self-organization driven by RMSP's six rewrite rules. This paper analyzes this cross-scale structural correspondence and discusses the complementary boundaries of the two.&lt;/p&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RMSP Paper&lt;/strong&gt; — &lt;em&gt;Self-Evolving LLM Agents as LLM + MAN: A New Agent Paradigm via Reward-Modulated Structural Plasticity&lt;/em&gt;, full text at &lt;a href="https://mp.weixin.qq.com/s/HYCq2mKlIaSCRAJIp92NGQ" rel="noopener noreferrer"&gt;mp.weixin.qq.com/s/HYCq2mKlIaSCRAJIp92NGQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGE Template&lt;/strong&gt; — &lt;code&gt;attractor-guided-engineering-template&lt;/code&gt;, &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;github.com/entropy-cloud/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nop-chaos-flux Practice&lt;/strong&gt; — &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;github.com/entropy-cloud/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Core Proposition Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;RMSP Agent Paradigm&lt;/th&gt;
&lt;th&gt;AGE Methodology&lt;/th&gt;
&lt;th&gt;nop-chaos-flux Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core Diagnosis&lt;/td&gt;
&lt;td&gt;Current agent = authoring artifact, structure is static&lt;/td&gt;
&lt;td&gt;Current AI development relies on external tools to constrain behavior (harness-first), rather than letting the repository structure itself converge&lt;/td&gt;
&lt;td&gt;Under high-frequency AI perturbations, the repository must become a verifiable source of truth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core Proposition&lt;/td&gt;
&lt;td&gt;Agent structure should self-evolve through use&lt;/td&gt;
&lt;td&gt;The system should converge to stable attractors through iteration&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;docs/architecture/&lt;/code&gt; owner-doc system is the engineering carrier of attractors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural Object&lt;/td&gt;
&lt;td&gt;MAN aspect graph&lt;/td&gt;
&lt;td&gt;Owner-doc system&lt;/td&gt;
&lt;td&gt;Architecture document tree with precedence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evolution Rules&lt;/td&gt;
&lt;td&gt;RMSP: reweight/connect/prune/split/merge/lift&lt;/td&gt;
&lt;td&gt;AGE workflow: input → req → design → plan → implement → verify → close&lt;/td&gt;
&lt;td&gt;Strengthened: plan closure gate + independent audit + deep-audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluation Function&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F = Surprise + β·Complexity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Attractor fidelity + trajectory convergence&lt;/td&gt;
&lt;td&gt;Live repo baseline consistency (owner doc vs code vs test)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three paradigms originate from the same observation: static structure cannot adaptively evolve through interaction; some form of plasticity mechanism must be introduced.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Structural Plasticity at Three Scales
&lt;/h2&gt;

&lt;p&gt;Structural plasticity occurs at three distinct time scales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scale 1: Agent Runtime — RMSP/MAN
&lt;/h3&gt;

&lt;p&gt;RMSP models the agent's behavior topology as an aspect graph. Each aspect (a responsibility concern, containing pointcut matching conditions and advice processing logic) carries its own sliding window that tracks recent performance.&lt;/p&gt;

&lt;p&gt;After each interaction, the reward is distributed to the aspects that participated in the decision, accumulating as contribution values. When the credit variance of an aspect exceeds a threshold, one of six rewrite rules is triggered. &lt;strong&gt;split&lt;/strong&gt; divides a high-variance aspect into two specialized ones (top-down differentiation); &lt;strong&gt;lift&lt;/strong&gt; abstracts a cluster of co-activated aspects into a higher-level coordinator (bottom-up abstraction); &lt;strong&gt;connect/prune&lt;/strong&gt; manage edge evolution and elimination. The LLM can propose new structures, but they can only be committed after passing dual gating—&lt;code&gt;κ&lt;/code&gt; estimation (evaluating expected benefit) and &lt;code&gt;F-score&lt;/code&gt; (&lt;code&gt;Surprise + β·Complexity&lt;/code&gt;)—generation and verification must be separated.&lt;/p&gt;

&lt;p&gt;MAN explicitly divides the agent into two systems: the LLM is &lt;strong&gt;System 1&lt;/strong&gt;, responsible for fast reasoning and generation in the current round; the aspect network is &lt;strong&gt;System 2&lt;/strong&gt;, responsible for structural governance, scheduling, and self-evolution. The fast pathway (⇓_fast) completes a single inference under a fixed topology; the slow pathway (⇓_slow) only changes the graph structure after accumulating sufficient signal. The LLM is the effector, MAN is the nervous system—the two specialize at different time scales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scale 2: AI Development Session — AGE Plan/Closure/Audit
&lt;/h3&gt;

&lt;p&gt;AGE organizes each development task as a convergence cycle: &lt;code&gt;input/&lt;/code&gt; → &lt;code&gt;discussions/&lt;/code&gt; → &lt;code&gt;requirements/&lt;/code&gt; → &lt;code&gt;design/&lt;/code&gt; + &lt;code&gt;architecture/&lt;/code&gt; → &lt;code&gt;plans/&lt;/code&gt; → implement → verify → close.&lt;/p&gt;

&lt;p&gt;What grows here is not an aspect graph, but plan documents, closure gate judgments, and audit records. The cycle triggered by each task pushes requirements from ambiguity to implementation readiness, while simultaneously depositing stable design intentions into &lt;code&gt;design/&lt;/code&gt; and &lt;code&gt;architecture/&lt;/code&gt; (i.e., attractors). After each plan execution, an independent session must perform a closure audit—the implementer cannot self-report completion.&lt;/p&gt;

&lt;p&gt;In nop-chaos-flux, this cycle is strengthened to 24 plan rules, 3 status levels, and deep-audit. Plan 143 is a typical example: closure assumptions were successively overturned by independent audits on 2026-04-26 and 2026-04-27, and were only allowed to close after the live repo truly passed the threshold.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scale 3: Long-Term Project Evolution — AGE Attractor / Owner-Doc System
&lt;/h3&gt;

&lt;p&gt;The slowest layer is the change of the &lt;code&gt;docs/architecture/&lt;/code&gt; document tree itself. New architecture docs are promoted from &lt;code&gt;analysis/&lt;/code&gt; or &lt;code&gt;plans/&lt;/code&gt; to stable architecture docs; old structures are excluded (e.g., &lt;code&gt;CompiledSchemaNode&lt;/code&gt; removal); architectural layers deepen (from fewer package layers to three layers—&lt;code&gt;flux-compiler&lt;/code&gt;, &lt;code&gt;flux-action-core&lt;/code&gt;, &lt;code&gt;flux-runtime&lt;/code&gt;—forming a five-layer pipeline: &lt;code&gt;flux-core → flux-compiler → flux-action-core → flux-runtime → flux-react&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Changes at this layer are not driven by session-level tasks, but by the accumulation of cross-session design decisions + discoveries from deep-audits. Each deep-audit that finds a discrepancy between owner-docs and the live repo triggers a round of structural correction. After correction, the project returns to the vicinity of a more precise attractor.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Agent Internal (RMSP)&lt;/th&gt;
&lt;th&gt;Session Control (AGE Plan)&lt;/th&gt;
&lt;th&gt;Project Evolution (AGE Attractor)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time Scale&lt;/td&gt;
&lt;td&gt;Per interaction&lt;/td&gt;
&lt;td&gt;Per task (hours ~ days)&lt;/td&gt;
&lt;td&gt;Weekly ~ monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural Unit&lt;/td&gt;
&lt;td&gt;aspect&lt;/td&gt;
&lt;td&gt;plan + closure gate&lt;/td&gt;
&lt;td&gt;owner-doc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning Signal&lt;/td&gt;
&lt;td&gt;reward → credit assignment&lt;/td&gt;
&lt;td&gt;audit finding → baseline drift&lt;/td&gt;
&lt;td&gt;deep-audit → doc/code discrepancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drift Detection&lt;/td&gt;
&lt;td&gt;sliding window variance&lt;/td&gt;
&lt;td&gt;exit criteria not met&lt;/td&gt;
&lt;td&gt;owner-doc vs live repo inconsistency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adoption Gating&lt;/td&gt;
&lt;td&gt;κ estimation + F-score&lt;/td&gt;
&lt;td&gt;independent closure audit&lt;/td&gt;
&lt;td&gt;deep-audit + decision record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence Assumption&lt;/td&gt;
&lt;td&gt;Continuous existence (single instance, single session)&lt;/td&gt;
&lt;td&gt;Intermittent existence (multi-session)&lt;/td&gt;
&lt;td&gt;Time-translation invariant (multi-instance, unaffected by instance lifecycle)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Conceptual Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Aspect ↔ Owner-Doc
&lt;/h3&gt;

&lt;p&gt;RMSP's aspect is the minimum behavioral unit inside an agent (pointcut + advice + sliding window). AGE's owner-doc is the minimum stable unit of project knowledge (design intent + contract + precedence).&lt;/p&gt;

&lt;p&gt;Both are the minimal structural units, both can be split/merged/lifted, and both have their own "pointcut" (when to trigger, &lt;code&gt;docs/index.md&lt;/code&gt; routing) and "advice" (behavior after triggering).&lt;/p&gt;

&lt;p&gt;Key difference: aspects are automatically grown driven by reward, and are proprietary to a single agent instance; owner-docs are collaboratively authored by humans and AI, versioned, and shared by the team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rewrite Rules ↔ Document Evolution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RMSP Rule&lt;/th&gt;
&lt;th&gt;AGE/nop-chaos-flux Correspondence&lt;/th&gt;
&lt;th&gt;Real Examples in the Repository&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;split&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One architecture doc split into multiple narrow-scope docs&lt;/td&gt;
&lt;td&gt;Responsibility differentiation from &lt;code&gt;flux-core.md&lt;/code&gt; into &lt;code&gt;frontend-programming-model.md&lt;/code&gt; (top-level spec), &lt;code&gt;form-validation.md&lt;/code&gt;, &lt;code&gt;renderer-runtime.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;merge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Merging docs with similar functions&lt;/td&gt;
&lt;td&gt;Two docs expressing the same constraint merged into one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lift&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstracting higher-level principle docs from concrete docs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;docs/architecture/README.md&lt;/code&gt; as the reading order and hierarchy for the whole set of architecture docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;connect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Establishing cross-references and new dependencies&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;renderer-runtime.md&lt;/code&gt; referencing &lt;code&gt;form-validation.md&lt;/code&gt;, &lt;code&gt;field-binding-and-renderer-contract.md&lt;/code&gt; referencing &lt;code&gt;renderer-runtime.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;prune&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deprecating/archiving docs that no longer apply&lt;/td&gt;
&lt;td&gt;Code and docs related to &lt;code&gt;CompiledSchemaNode&lt;/code&gt; completely removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;reweight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adjusting owner-doc precedence&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;frontend-programming-model.md&lt;/code&gt; established as a top-level spec, overriding part of &lt;code&gt;flux-core.md&lt;/code&gt;'s responsibilities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Reward Modulation ↔ Audit Signal
&lt;/h3&gt;

&lt;p&gt;RMSP uses &lt;code&gt;reward → credit assignment → contribution accumulation → structural rewrite&lt;/code&gt;. AGE uses &lt;code&gt;audit finding → baseline drift detection → closure gate adjustment → structural update&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The signal must not come from the generator itself—this is a shared discipline of both. In RMSP, the LLM is the structure proposer, reward is the verifier; in AGE, the implementer cannot make the completion judgment—an independent session must perform the closure audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Soft Advice ↔ Hard Control Flow
&lt;/h3&gt;

&lt;p&gt;Both RMSP and AGE transform soft signals into hard control flow. In RMSP, new structures proposed by the LLM must pass the hard gates of &lt;code&gt;κ&lt;/code&gt; estimation and &lt;code&gt;F-score&lt;/code&gt; before being written into the aspect graph—this is not a suggestion, but an unavoidable verdict. In AGE, the closure audit result is likewise not a "recommendation to close," but the actual decision on whether a plan can be marked completed. Both do the same thing: whether the structure changes is not decided by the proposer's soft opinion, but by a hard mechanism independent of the proposer.&lt;/p&gt;

&lt;p&gt;From an engineering direction perspective, the long-term trends on both sides are also consistent: turning more soft constraints into enforceable control-flow nodes. The RMSP paper explicitly distinguishes "soft advice" (prompt injection, unreliable) from "hard advice" (intercepting tool calls, rejecting actions, rewriting parameters, reliable), and points out that improving agent reliability depends on the latter. AGE's closure gate, deep-audit, and 24 plan rules similarly solidify the soft intention of "should converge" into executable hard barriers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slow Pathway ↔ Closure Audit
&lt;/h3&gt;

&lt;p&gt;RMSP's slow pathway does not participate in each fast inference; it only triggers structural rewriting after credit accumulates to a threshold. AGE's closure audit likewise does not participate in daily implementation; it performs an independent convergence judgment only after plan execution is complete.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Core Differences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Degree of Automation
&lt;/h3&gt;

&lt;p&gt;RMSP's aspect growth is fully automatic—reward drives all rewrite rules with no human intervention required. AGE's attractor evolution is semi-automatic—human/AI collaboration proposes new structures, adopted after audit gating.&lt;/p&gt;

&lt;p&gt;RMSP is more suitable for online learning of a single agent—small scale, dense feedback. AGE is more suitable for repository-level knowledge management—large scale, feedback sparse but each structural change has major impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structural Carrier
&lt;/h3&gt;

&lt;p&gt;RMSP's structural carrier is the runtime aspect graph (in memory, independent per agent instance). AGE's structural carrier is the owner-doc in the repository file system (on disk, versioned, team-shared).&lt;/p&gt;

&lt;p&gt;RMSP can migrate aspect graphs across agent instances (export → import); AGE naturally supports multiple humans and multiple agents sharing the same attractor (version control + diff review).&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluation Metric
&lt;/h3&gt;

&lt;p&gt;RMSP uses &lt;code&gt;F = Surprise + β·Complexity&lt;/code&gt; to uniformly judge whether a structural change is accepted. The intuitive meaning of this formula is "structure must pay rent": new structure must reduce error (Surprise) to justify its complexity (Complexity). AGE does not have a unified numerical metric; it uses multiple practical signals to evaluate convergence: whether typecheck/build/test pass, whether owner-docs match the live repo, whether the closure audit verifies completion.&lt;/p&gt;

&lt;p&gt;The state space at agent runtime (aspect graph × memory × tool calls) is far smaller than the state space of a software repository (files × dependencies × behaviors × tests × docs × configuration). In a small state space, a unified numerical evaluation function is feasible; in a large state space, evaluation must decompose into a combination of multiple orthogonal signals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adaptation vs. Convergence
&lt;/h3&gt;

&lt;p&gt;RMSP's goal is adaptation—the agent better adapts to the current user, allowing the aspect graph to drift continuously (as long as &lt;code&gt;F&lt;/code&gt; decreases). AGE's goal is convergence—the system converges toward predefined attractors; structures that deviate are pulled back by the harness.&lt;/p&gt;

&lt;p&gt;nop-chaos-flux manages this by strictly distinguishing "scope-in changes" from "attractor updates." Design changes must go through both owner-doc update and closure audit; silent baseline shifts are not allowed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time-Translation Invariance
&lt;/h3&gt;

&lt;p&gt;RMSP assumes the agent exists continuously—at least running throughout one session, the aspect graph in memory, reward signals continuously accumulating, structural rewriting occurring naturally between interactions.&lt;/p&gt;

&lt;p&gt;AGE faces different constraints: AI sessions disappear when the user closes the window. Today Agent A modifies the same repository, tomorrow Agent B audits it, the day after Agent C continues development—all three must see the same repository, read the same owner-docs, and judge closure against the same live repo. All of AGE's state input and output pass through the file system; this is not a design preference, but a direct consequence of time-translation invariance: because sessions cannot persist, cross-session consistency can only be guaranteed by the file system as the sole persistent layer. ("Time-translation invariance" is borrowed from Noether's theorem in physics; here it means that the system's behavior does not change due to the agent operating it or the point in time.)&lt;/p&gt;

&lt;p&gt;RMSP and AGE fundamentally do not face the same time structure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RMSP solves an &lt;strong&gt;adaptation problem for a single instance, continuously existing&lt;/strong&gt;—an agent works better and better from the beginning to the end of a session.&lt;/li&gt;
&lt;li&gt;AGE solves a &lt;strong&gt;convergence problem for multiple instances, intermittently existing&lt;/strong&gt;—no matter which agent, no matter when the repository is opened, they all see and maintain the same set of attractors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When integrating RMSP and AGE, the data-flow problem that truly needs to be solved is not compatibility at the architectural abstraction level, but: &lt;strong&gt;After an agent instance is destroyed, which information from its aspect graph needs to be written into the repository?&lt;/strong&gt; The RMSP paper does not define this step (it does not assume multiple instances), but this must be resolved in practical integration—for example, degrading stably converged aspect rules into operational rules in AGENTS.md, or exporting them as project-shareable skill packages. Conversely, after AGE's owner-docs are read into agent runtime, a mechanism is also needed to determine which constraints should be solidified into the aspect graph and which only need to be referenced during the current session.&lt;/p&gt;

&lt;p&gt;Can an RMSP Agent encode AGE's owner-doc rules as pointcuts/advice in the aspect graph, thereby internalizing AGE's functionality? No. The reason is not technical difficulty—AI can certainly learn to read files—but that the time structures do not match. RMSP assumes the agent exists continuously; the aspect graph lives and dies with the instance. AGE requires time-translation invariance: the owner-doc written by Agent A today must be independently auditable by Agent B tomorrow, unaffected by whether A is still running. As long as repository users do not share the same persistent agent instance, internalization is a dead end. The file system is the only shared layer unaffected by instance lifecycles.&lt;/p&gt;

&lt;p&gt;When the two conflict, attractor takes priority—cross-session project consistency has higher weight than the local optimum of a single agent's adaptation. If an agent's aspect graph drifts in a direction that conflicts with the owner-doc, AGE's harness (closure audit, deep-audit) will pull it back, not RMSP's reward signal. Coexistence of both requires a clear arbitration rule: the project baseline is defined by AGE; the agent can only self-adapt without breaking the baseline.&lt;/p&gt;

&lt;p&gt;Integrate RMSP into agent runtime so that agents evolve skill preferences adapted to the current project through use; layer the AGE methodology on top so that the project repository maintains structure under high-speed agent iteration. Each handles its own convergence problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Implicit Confirmation in nop-chaos-flux
&lt;/h2&gt;

&lt;p&gt;nop-chaos-flux does not implement RMSP, but its practices have deep correspondence with RMSP's ideas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separation of Generation and Verification&lt;/strong&gt;: RMSP's core design—LLM proposes structure, reward decides whether the structure is committed. nop-chaos-flux's core discipline—the implementer cannot make the completion judgment; closure audit must be done by an independent session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicit Externalization of Structure&lt;/strong&gt;: RMSP designs the aspect graph as an inspectable, editable, exportable data structure. nop-chaos-flux uses the &lt;code&gt;docs/architecture/&lt;/code&gt; owner-doc as the stable carrier of where the system should converge. Both approaches believe structural information should be explicitly externalized, not relying on implicit internalization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structural Rewriting Predicated on Baseline Alignment&lt;/strong&gt;: Before RMSP rewrites, the current MAN graph must be known (&lt;code&gt;κ&lt;/code&gt; estimation requires a baseline). The first rule of nop-chaos-flux's plan guide: verify the live repo before writing a plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep Correspondence in Audit Algorithms&lt;/strong&gt;: nop-chaos-flux's deep-audit has a whole set of drift classifications—doc-behavior drift, proof insufficiency, duplicate coverage, orphan contract. These are the repository-scale expressions of the &lt;code&gt;Surprise&lt;/code&gt; signal in RMSP: when owner-doc description ≠ live repo behavior, Surprise increases, requiring structural correction.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. AGE Template: The Middle Adhesive Layer
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;attractor-guided-engineering-template&lt;/code&gt; (&lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is a complete templating of AGE for application-layer projects. Its relationship with nop-chaos-flux is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;AGE Template&lt;/th&gt;
&lt;th&gt;nop-chaos-flux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Positioning&lt;/td&gt;
&lt;td&gt;Application-layer project scaffold&lt;/td&gt;
&lt;td&gt;Framework-level low-code runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Document Count&lt;/td&gt;
&lt;td&gt;~20-30 files (core ~10)&lt;/td&gt;
&lt;td&gt;Dozens of architecture docs + component design docs + plan + audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan Complexity&lt;/td&gt;
&lt;td&gt;Lightweight plans (~5-section template)&lt;/td&gt;
&lt;td&gt;Full plan system (24 rules + 3 status levels)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Requirements&lt;/td&gt;
&lt;td&gt;Pre-plan audit + closure audit&lt;/td&gt;
&lt;td&gt;Same as left + deep-audit + adversarial review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project Scale&lt;/td&gt;
&lt;td&gt;Small-to-medium applications&lt;/td&gt;
&lt;td&gt;Large framework (~20 workspace packages)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AGE template serves as a bridge between RMSP and nop-chaos-flux: it does not require every layer to be in place from the start, but provides a scaffold that can be progressively strengthened. The RMSP paper calls the initial state of the agent the "zygote" (a single cortical aspect + a set of conserved reflex cores + zero synapses), corresponding to the AGE template's "minimal core" (AGENTS.md + docs/index.md + docs/context/ + verification commands); RMSP's "growth through interaction" corresponds to AGE template's "trigger on demand" (plans/, bugs/, logs/ appear only when actually needed, not pre-created in full).&lt;/p&gt;




&lt;h2&gt;
  
  
  7. A Unified Evolutionary Landscape
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scale              Time Structure                   Structural Example          Evolution Mechanism        Evaluation Method
────               ──────                          ──────                     ──────                     ──────
Agent Runtime      Continuous existence            aspect graph               RMSP                       F = Surprise + β·Complexity
                   (single instance)               (6 rewrite rules)
                                                        ↑
Development        Intermittent existence          plan + closure             plan audit                 Independent closure audit
Session            (multi-session)                 gate + audit               + exit criteria
                                                        ↑
Long-Term          Time-translation invariant      owner-doc tree             deep-audit +               owner-doc vs live repo
Project            (multi-instance, unaffected     architecture attractor     decision record            consistency check
                   by instance lifecycle)
                                                        ↑
Methodology        Time-translation invariant      AGE template +             copy → fill →             project-context authenticity
Template           (templatized)                   START-HERE                 progressive enhancement    verification commands non-placeholder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer solves a different convergence problem, and each layer has a different time structure. RMSP assumes continuous agent existence, converging an instance to a behavioral topology adapted to the current task; the Plan layer faces intermittently existing multi-sessions, converging a single development change to a predetermined scope and closure gate; the Owner-doc layer requires time-translation invariance, converging the project's long-term evolution toward a stable architecture attractor—no matter which agent reads it when, the attractor seen is consistent; the template layer also requires time-translation invariance, but targets new projects starting from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Conclusion
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shared Diagnosis&lt;/strong&gt;: All three consider the static authoring artifact to be the core limitation of current practice and argue that structural plasticity must be introduced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scale Division of Labor&lt;/strong&gt;: RMSP solves the structural self-evolution of the agent at runtime; AGE/nop-chaos-flux solves the structural convergence of project repositories under high-frequency AI iteration. The two are not substitutes, but complement each other at different scales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shared Gating Principle&lt;/strong&gt;: Generation (LLM proposal / agent implementation) and verification (reward / audit) must be separated. In RMSP, this manifests as &lt;code&gt;κ&lt;/code&gt; estimation + &lt;code&gt;F-score&lt;/code&gt;; in AGE/nop-chaos-flux, as independent closure audit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;nop-chaos-flux is a complete implementation of AGE at the framework level&lt;/strong&gt;, and also an early validation of RMSP concepts at the repository management level—owner-doc's split/merge/lift/prune/connect/reweight achieves self-organizing evolution of document structures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The AGE Template is the middle adhesive layer&lt;/strong&gt;: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;attractor-guided-engineering-template&lt;/a&gt; connects the theoretical paradigm (RMSP) and framework-level practice (&lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;nop-chaos-flux&lt;/a&gt;), providing a path for application-layer projects to grow progressively from a zygote.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Verifiable Prediction&lt;/strong&gt;: If RMSP is engineered and verified in the future, its most natural integration method is not to replace AGE, but to combine with AGE at the agent runtime layer—RMSP drives the adaptation of the agent's own structure, AGE drives the convergence of repository attractors. Together they form a complete "self-evolving development" closed loop.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>contextengineering</category>
      <category>agentskills</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Why Attractor Guided Engineering Cannot Be Demoted to an AI Agent Skill</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Mon, 01 Jun 2026 07:05:49 +0000</pubDate>
      <link>https://dev.to/canonical/why-attractor-guided-engineering-cannot-be-demoted-to-an-ai-agent-skill-2iik</link>
      <guid>https://dev.to/canonical/why-attractor-guided-engineering-cannot-be-demoted-to-an-ai-agent-skill-2iik</guid>
      <description>&lt;p&gt;Agent Skill is already one of the most widely accepted practices in AI Agent engineering: encapsulating repeatable tasks into capability packages that are discoverable, callable, and injectable into context.&lt;/p&gt;

&lt;p&gt;This is certainly valuable. Diagnosing bugs can be a skill. Reviewing code can be a skill. Generating slides can be a skill. Converting files can be a skill. Skills let an Agent enter a proven way of working faster, and they allow teams to distill experience into reusable work specifications.&lt;/p&gt;

&lt;p&gt;But as the saying goes: “If all you have is a hammer, everything looks like a nail.” The same is true for skills: as soon as people find a useful practice, their first instinct is often “wrap it into a reusable skill.”&lt;/p&gt;

&lt;p&gt;Attractor Guided Engineering (AGE) points out that if every AI engineering practice is turned into a skill, we lose sight of the most critical question in AI-dominated software engineering: &lt;strong&gt;how does the system remain controlled and convergent under continuous perturbation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills solve the problem of capability invocation. AGE solves the problem of how domain structure is preserved during the long-term evolution of a repository, and how trajectory drift is suppressed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This also explains why AGE cannot be demoted to a skill: making skills the primary vehicle for AGE practices would collapse repository-level convergence mechanisms into one-shot invocation capabilities, defeating the purpose of AGE.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Essence of a Skill is a Semantic-Level Hash Map
&lt;/h2&gt;

&lt;p&gt;When many people think of skills, they first see the file form: &lt;code&gt;SKILL.md&lt;/code&gt;, description, trigger words, supporting files, scripts, templates.&lt;/p&gt;

&lt;p&gt;But these are just the shell. Where a skill really works is that the Agent runtime organizes them into a &lt;strong&gt;semantic-level lookup table&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;task intent -&amp;gt; matched skill -&amp;gt; procedure bundle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, the Agent does not gain capability simply because a file is named &lt;code&gt;SKILL.md&lt;/code&gt;; it gains capability because the current task intent can be matched in the skill description space to a loadable work specification.&lt;/p&gt;

&lt;p&gt;The hash here is not a string hash. The key is not a fixed string but a combination of task intent, contextual clues, trigger words, and descriptions; the value is not a single file but a collection of instructions, scripts, templates, and examples that can be injected into the context.&lt;/p&gt;

&lt;p&gt;This structure is ideally suited to answering one question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I need to do this kind of task — which set of practices should I load?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore, skills are very suitable for encapsulating local capabilities: diagnosing bugs, reviewing diffs, calling tools, generating reports, executing checklists. &lt;strong&gt;Their organizing axis is invocation intent, mapping “what to do” to “which capability package to load.”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Information Format Is Not the Key
&lt;/h2&gt;

&lt;p&gt;Since the real mechanism of a skill is semantic matching, we must not fetishize the file format of a skill.&lt;/p&gt;

&lt;p&gt;For an intelligent agent, the format in which information is written is not essential. AI can read Markdown, and it can also read XML and other formats. Database models, API models, and the like can be fully expressed in DSLs (domain-specific languages).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;docs/index.md&lt;/code&gt; can perfectly serve as information routers and can even do better: through file links, we can provide hierarchical routing by domain structure. The AI can first read a compact entry point and then, as the task requires, progressively open more specific owner docs, model files, tests, and source code.&lt;/p&gt;

&lt;p&gt;Therefore, the question is not “has this piece of knowledge been written as a skill?”&lt;/p&gt;

&lt;p&gt;The question is: &lt;strong&gt;after the information changes form, does the original structure still exist?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A key capability of intelligence is the ability to freely transform information across forms. If the structure remains, knowledge written as Markdown, XML, tests, DSL/schema, or source code anchors can all be used by the AI. If the structure is lost, wrapping it in the most exquisite skill only makes the fragments—after the structure is lost—easier to invoke.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why Dynamical Systems Care About Preserving Structure
&lt;/h2&gt;

&lt;p&gt;Dynamical systems in mathematics and physics provide a useful intuition: the variables describing a system can change, but the key structures governing the system’s evolution must not be casually discarded.&lt;/p&gt;

&lt;p&gt;Imagine a pendulum clock. You can describe it with angle and angular velocity, or with position and velocity, or with energy and phase. The form of expression can change, but the key structure of the pendulum cannot be lost: how position and velocity are coupled, how energy changes, how damping dissipates energy, where external forces enter.&lt;/p&gt;

&lt;p&gt;If an algorithm only pursues “the next position looks roughly right” without preserving these structures, it might make only small errors at each step, yet over the long term it makes the pendulum swing higher and higher for no reason, or stop suddenly. The local output looks similar, but the long-term system is no longer the original system.&lt;/p&gt;

&lt;p&gt;Consider an electrical circuit. You can describe it with node voltages, or with branch currents, or treat the energy stored in capacitors and inductors as state variables. The variable form can change, but some structures must not be lost: charge conservation, the coupling relationships between voltage and current, energy storage and dissipation in components, where the external power source injects energy.&lt;/p&gt;

&lt;p&gt;If an algorithm only pursues voltage values at a few sampling points that look close, without preserving these structures, the long-term simulation may spontaneously generate energy, or turn a system that should dissipate into one that oscillates endlessly. The local curve resembles the truth, but the physical meaning of the system is already wrong.&lt;/p&gt;

&lt;p&gt;This is what it means to preserve structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The form of expression can change, but key constraints, coupling relationships, and conservation/dissipation structures must not be lost.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A controlled system converges over the long term not because each step seems reasonable, but because these structures are preserved through repeated transformations and perturbations.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The State Space Is Not the Source Code Space
&lt;/h2&gt;

&lt;p&gt;If we observe software engineering through the lens of dynamical systems, a repository is no longer a static folder but a system that is repeatedly perturbed. Every requirements clarification, plan generation, code modification, test addition, review, and log update pushes the repository to a new state.&lt;/p&gt;

&lt;p&gt;Traditional software engineering rests on an implicit assumption: the human brain can serve as the long-term implicit integrator of system truth. Source code, requirements, architectural trade-offs, historical bugs, and unwritten context can ultimately be fully understood by a few core engineers who decide the direction of evolution.&lt;/p&gt;

&lt;p&gt;After deep participation of AI, this underlying assumption is shaken. AI can generate at high frequency, modify at large amplitude, and spread across modules, while each session lacks a sustained sense of direction. The expansive force that AI introduces into the state space far exceeds the information processing capacity of a few humans. At this point, unless we forcibly slow AI down to a rhythm that humans can continuously integrate, the source of truth in the system's evolution can no longer be the memory inside someone's head. What the next session can re-read is not the complete intent in the author’s mind, but the code, diffs, logs, tests, docs, models, and audit evidence in the repository.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The history of &lt;code&gt;nop-chaos-flux&lt;/code&gt; has already recorded this kind of drift multiple times. Workstream 8 of &lt;code&gt;docs/plans/436-deep-audit-2026-05-24-full-remediation-plan.md&lt;/code&gt; fixed an active-doc drift: the documentation described &lt;code&gt;component:open/close/toggle&lt;/code&gt;, &lt;code&gt;component:refresh&lt;/code&gt;, the old package split, old source anchors, and an outdated component inventory as current facts, while the live repo was no longer like that. &lt;code&gt;docs/logs/2026/05-26.md&lt;/code&gt; recorded a proof drift: the E2E tests still asserted that the spreadsheet's &lt;code&gt;30&lt;/code&gt; row headers were mounted simultaneously, while the live spreadsheet shell had already been virtualized, so the correct proof could only assert that visible row headers were mounted. Code, documentation, and tests might each be locally reasonable, but the owner/proof/precedence relationships among them had already drifted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thus, the basic premise of AGE is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository = Source of Truth
Chat = Transient work surface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under this premise, the core question is not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Did the Agent invoke the right skill this time?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After many Agent perturbations, does the repository still converge in a controlled manner along the domain structure?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The basic picture of AGE is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;State space -&amp;gt; Attractor -&amp;gt; Trajectory -&amp;gt; Control
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The state space here is not the “source code state space.” Source code answers what the current implementation is, but it cannot alone answer where the system should converge, why a certain design is valid, which behavior has been proven, why a certain deviation was accepted, and from where the AI should recover context next time.&lt;/p&gt;

&lt;p&gt;AGE is concerned with the state of the entire repository engineering reality: source code, tests, owner docs, requirements, plans, logs, bug notes, schemas, XML models, database models, XDSL, &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;docs/index.md&lt;/code&gt;, CI configuration, and audit evidence together constitute a state.&lt;/p&gt;

&lt;p&gt;These are not several separable materials, but the distribution of the same set of semantic commitments across different carriers. Code has authority over implementation facts; owner docs have authority over convergence direction; tests have authority over proven behavior; logs/bug notes have authority over the evolution trajectory; plans/audits have authority over whether the current cycle of changes is closed. What AGE must maintain is the relationships among these authorities, not the sanctification of any single file format.&lt;/p&gt;

&lt;p&gt;A Skill occupies a different position. &lt;strong&gt;AGE organizes the repository itself; skills are external capabilities or control inputs that act upon the repository.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;External capabilities can change the system, but they cannot replace the internal structure of the system. A &lt;code&gt;bug-diagnosis&lt;/code&gt; skill can be used in many repositories, many domains, many bug types. Its organizing logic is general task capability, not the topology of domain concepts inside a specific repository.&lt;/p&gt;

&lt;p&gt;What truly needs to be preserved inside the repository are the relationships among source code, documentation, tests, models, plans, logs, and audit evidence — relationships such as owner, proof, precedence, and freshness. Skills can help modify these things, but they cannot replace the relationships themselves.&lt;/p&gt;

&lt;p&gt;At this point, we realize that the skill’s semantic hash is insufficient to solve the problem. What a skill stores is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task intent -&amp;gt; capability package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What AGE needs to preserve is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;domain concept -&amp;gt; semantic commitment -&amp;gt; implementation location -&amp;gt; proof evidence -&amp;gt; audit/memory -&amp;gt; subsequent obligations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These two structures are not the same. A skill can tell an Agent how to review, but it cannot automatically know which owner doc holds the current semantic fact. A skill can tell an Agent how to write tests, but it cannot automatically know which domain commitment this test protects. A skill can tell an Agent how to update documentation, but it cannot automatically determine whether a piece of information should go into an owner doc, a bug note, a log, a lesson, a reference, or a skill.&lt;/p&gt;

&lt;p&gt;These judgments are not invocation capabilities; they are the semantic authority structure of the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Why &lt;code&gt;age-skill&lt;/code&gt; Is a Wrong Abstraction
&lt;/h2&gt;

&lt;p&gt;Turning AGE into an &lt;code&gt;age-skill&lt;/code&gt; is superficially tempting: take AGE’s rules, procedures, checklists, and document templates and write them into a callable capability package. When the Agent needs AGE, it loads this skill.&lt;/p&gt;

&lt;p&gt;But this places AGE at exactly the wrong level. A skill is a capability package that is matched and loaded after a task occurs; AGE should be the repository structure that already exists before the task begins. It determines how the task is understood, where information is read from, whose voice prevails in a conflict, and how closure is proved after completion.&lt;/p&gt;

&lt;p&gt;AGE cannot wait to appear only after a certain skill is selected. It should already be embodied in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The operational boundary of &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The routing structure of &lt;code&gt;docs/index.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The fact ownership of owner docs&lt;/li&gt;
&lt;li&gt;The conflict rules of source-of-truth precedence&lt;/li&gt;
&lt;li&gt;The obligation declarations of plans&lt;/li&gt;
&lt;li&gt;The proof relations of tests&lt;/li&gt;
&lt;li&gt;The closure gates of audits&lt;/li&gt;
&lt;li&gt;The trajectory memory of logs, bug notes, and lessons&lt;/li&gt;
&lt;li&gt;The action constraints of freshness/autonomy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these relationships exist only inside an &lt;code&gt;age-skill&lt;/code&gt;, they are not repository structure but merely the content of a procedure bundle. Whenever the Agent does not match this skill, or the skill conflicts with the live repo, AGE becomes ineffective.&lt;/p&gt;

&lt;p&gt;Making &lt;code&gt;age-skill&lt;/code&gt; an always-on or global skill does not solve this problem either. At best, it can prescribe “read these owner docs first, check precedence this way, do a closure audit like that.” But the real owner, proof, precedence, and freshness relationships must still exist among the repository’s files, tests, logs, plans, and audit evidence.&lt;/p&gt;

&lt;p&gt;So the problem is not whether &lt;code&gt;age-skill&lt;/code&gt; is loaded every time; the problem is that a skill is still a capability package imposed on the repository from the outside. AGE must become the underlying topology of the repository itself. As long as owner, proof, precedence, and freshness are not internalized as repository state, AGE is demoted to an external operating method rather than an intrinsic convergence structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Missing Concepts That AGE Supplies
&lt;/h2&gt;

&lt;p&gt;Under the image of controlled convergence and structure preservation, what AGE supplies is not a new checklist, but a set of first-class system concepts that skill-ification practices lack.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Attractor
&lt;/h3&gt;

&lt;p&gt;To what structure should the system return in the long run? This cannot be decided by any single skill. It needs to be carried by owner docs, architectural baselines, domain design, and source-of-truth precedence. Without an attractor, a skill can only tell the Agent how to do things; it cannot tell the repository where it should converge.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Trajectory
&lt;/h3&gt;

&lt;p&gt;Completing a single task does not mean the system direction is correct. Logs, bug notes, lessons, plans, and audit records record how the repository arrived at its current state step by step. Without trajectory memory, the AI starts anew from a local cross-section each time, making it hard to judge whether the system is converging or drifting.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Semantic Authority
&lt;/h3&gt;

&lt;p&gt;When a skill, plan, code, test, and documentation disagree, whose voice prevails? AGE requires owner, routing, and precedence, rather than letting the currently invoked skill adjudicate on the fly. Semantic authority is not part of the execution steps; it is the internal order of the repository’s state space.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Proof Relation
&lt;/h3&gt;

&lt;p&gt;It is not enough for tests to “have coverage.” Tests must declare which semantic commitment they protect. Audit is not a checklist, either, but an examination of whether commitments have disappeared, weakened, or migrated to non-authoritative carriers. Proof relation makes verification not just about passing commands, but about returning to domain commitments.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Freshness / Autonomy
&lt;/h3&gt;

&lt;p&gt;Documentation is not eternally trustworthy just because it was written. Whether a document is fresh affects whether the AI can act on it, how far it can go autonomously, and when it must stop and ask a human. Freshness/autonomy turns “can we trust this, can we do this automatically” into a visible state of the repository, rather than an ad-hoc judgment inside a single session.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Structure-Preserving Document Routing
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; can provide the AI with a compact operational entry point, and &lt;code&gt;docs/index.md&lt;/code&gt; can provide complete routing. The purpose of both is not to cram all knowledge into a single file, but to let the AI progressively open the right information according to the task’s needs. Information disclosure can be layered, but the domain structure must not be fragmented.&lt;/p&gt;

&lt;p&gt;These concepts together form the semantic authority topology of AGE.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. AGE Can Use Skills, But Cannot Become a Skill
&lt;/h2&gt;

&lt;p&gt;AGE is not opposed to skills. Skills are excellent execution scaffolds.&lt;/p&gt;

&lt;p&gt;But within AGE, skills can only be method nodes; they cannot be the source of truth, nor can they be AGE itself.&lt;/p&gt;

&lt;p&gt;The correct order is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First, find the route via AGENTS.md / docs/index.md
Then, read the domain or architectural owner doc
Then, read the active requirement / plan / audit evidence
Finally, select the appropriate skill as the execution method
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First, select a skill, then let the skill decide fact ownership
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, a bug diagnosis skill can tell the Agent how to reproduce and locate a problem. But which domain concept the root cause belongs to, which owner doc needs updating, which test proves the fix, and which category of regression the bug note will constrain in the future — all of these must be decided by returning to the semantic topology of AGE.&lt;/p&gt;

&lt;p&gt;A good skill accelerates execution. Bad skill-ification replaces domain structure with execution methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Judgment Criteria
&lt;/h2&gt;

&lt;p&gt;To judge whether a set of AI engineering practices is over-skill-ified, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does it organize knowledge primarily by operational verbs, or by domain concepts and architectural ownership?&lt;/li&gt;
&lt;li&gt;Are its links mainly execution resource references, or owner / invariant / proof / precedence / freshness relationships?&lt;/li&gt;
&lt;li&gt;After information is transformed between skills, plans, code, tests, docs, and logs, can the domain structure still be recovered?&lt;/li&gt;
&lt;li&gt;If all skills are deleted, does the repository still know what is correct, who owns it, and how to prove it?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answers are negative, skills have already taken on attractor responsibilities they should not bear.&lt;/p&gt;

&lt;p&gt;The ultimate distinction can be compressed into a single sentence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Skill packages capabilities by invocation.
AGE preserves domain structure across transformations.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skills make the Agent better at doing things. AGE ensures that after the Agent does things repeatedly, the repository still converges in a controlled manner along the domain structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  AGE Application Development Template
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>contextengineering</category>
      <category>harnessengineering</category>
      <category>ai</category>
      <category>agentskills</category>
    </item>
    <item>
      <title>Beyond Harness Engineering: Understanding Attractor-Guided Engineering through Nonlinear Dynamical System Control</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Fri, 29 May 2026 15:17:19 +0000</pubDate>
      <link>https://dev.to/canonical/beyond-harness-engineering-understanding-attractor-guided-engineering-through-nonlinear-dynamical-glh</link>
      <guid>https://dev.to/canonical/beyond-harness-engineering-understanding-attractor-guided-engineering-through-nonlinear-dynamical-glh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is aimed at readers who are already familiar with Harness Engineering but not yet familiar with Attractor-Guided Engineering (AGE).&lt;/p&gt;

&lt;p&gt;Harness Engineering focuses on how to constrain, verify, and audit AI-generated outputs; AGE asks further: what long-term structure should these control mechanisms eventually pull the repository trajectories back to?&lt;/p&gt;

&lt;p&gt;For a detailed introduction to AGE, see my previous article: &lt;a href="https://mp.weixin.qq.com/s/TwMkUDLNo2-bIrXrfvPqIw" rel="noopener noreferrer"&gt;Attractor Before Harness: A Methodology for AI-Scale Development&lt;/a&gt;. This article focuses on a methodological analogy: using the language of nonlinear dynamical system control—in particular the structure-preserving terminology of port-Hamiltonian systems (PHS) and the target-manifold image of Immersion and Invariance—to explain some structures that already exist in AGE but have not yet been fully named: how semantic commitments are conserved, how change obligations are transformed, how document topology preserves structure, and how AI sessions recover the same system reality in a repository across time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Why This Analogy Is Needed
&lt;/h2&gt;

&lt;p&gt;AGE already has a core language:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State space → attractor → trajectory → control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This basic AGE vocabulary precisely captures a core problem in AI-scale development: when AI perturbs the repository at high frequency and amplitude with no persistent memory, how do we describe whether the system is still converging to a stable structure over the long term?&lt;/p&gt;

&lt;p&gt;More precisely, AGE examines AI-driven software engineering through the &lt;strong&gt;mental image of a dynamical system&lt;/strong&gt;. A single AI task can be seen as one perturbation and correction on the repository trajectory; a single input-output is only a local cross-section of that trajectory. The repository is a state space that evolves over time; AI, humans, CI, audits, and documentation updates all change the trajectory; owner docs define the attractor the system should repeatedly return to; plans, tests, audits, and logs provide local calibration mechanisms.&lt;/p&gt;

&lt;p&gt;Nonlinear dynamical system control is the theoretical branch that systematically studies “states, trajectories, stability, manifolds, feedback, observation, and structure preservation.” PHS (port-Hamiltonian systems) is a representative example of the structure-preserving approach. It decomposes a complex system into four structural classes: the Hamiltonian records how much energy is stored in the system; the interconnection matrix records how energy is transferred losslessly among internal variables; damping records irreversible losses such as resistance or friction; ports record the boundaries where the system exchanges energy with the external world. The key role of PHS modeling is to classify the coupling terms in the equations by function: some coupling terms only move energy internally, some represent true dissipation, and some come from external ports. Once these structures are distinguished, control design knows which terms should be preserved and which should be compensated or suppressed.&lt;/p&gt;

&lt;p&gt;This article does not try to equate AGE with PHS, but rather borrows the representative vocabulary of PHS to further identify conserved quantities, phase variables, interconnection topology, dissipation mechanisms, and port boundaries in AGE.&lt;/p&gt;

&lt;p&gt;Terminology conventions used in this article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AGE: Attractor-Guided Engineering. The core hierarchy is “state space → attractor → trajectory → control.”&lt;/li&gt;
&lt;li&gt;Harness Engineering: the engineering practice of building execution scaffolding around AI generation, such as guardrails, verification, review, audit, and diagnostics.&lt;/li&gt;
&lt;li&gt;PHS: port-Hamiltonian systems, the representative language of the structure-preserving approach in nonlinear dynamical system control, describing complex systems using an energy function, interconnection, dissipation, and ports.&lt;/li&gt;
&lt;li&gt;Hamiltonian: the system’s stored energy function, describing how much energy the system currently holds.&lt;/li&gt;
&lt;li&gt;Immersion and Invariance: a method that handles nonlinear control, observation, and adaptation problems by constructing a target invariant manifold.&lt;/li&gt;
&lt;li&gt;owner docs: long-term documents that hold the ultimate interpretive authority for certain categories of facts in the repository, such as architecture baselines, feature designs, or component contracts.&lt;/li&gt;
&lt;li&gt;closure audit: an audit that re-checks the closure evidence along requirements, owner docs, code, tests, and logs before a task is considered complete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared with PHS, the basic language of AGE still has an underexplored layer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Between repeated inputs, plans, implementations, verifications, audits, and logs, what exactly is being preserved, transformed, routed, and dissipated?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If we answer in ordinary process language, it is easy to fall back into a linear pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input → requirement → design → plan → code → test → log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This image misleads the reader. Real development does not simply read the output of the previous stage and generate the next artifact. When writing and reviewing code, the AI typically needs to reference simultaneously: the current requirement, owner docs, live code, tests, a known-good baseline, bugs, logs, the plan, audit results, external contracts, and the reading routes given by the document index and architecture hierarchy.&lt;/p&gt;

&lt;p&gt;In other words, AGE is more like a multi-port coupled system; the unidirectional cascade pipeline only describes a local projection of it.&lt;/p&gt;

&lt;p&gt;The inspiration from nonlinear control lies exactly here: &lt;strong&gt;complex coupling terms are not necessarily noise; many coupling terms are themselves the way the system preserves structure.&lt;/strong&gt; In motor control, the d-q coordinates—direct-axis and quadrature-axis coordinates that rotate with the rotor—are commonly used; under these coordinates, certain speed-dependent, skew-symmetric cross-coupling terms can represent lossless flow of energy between different coordinates. Similarly, in AGE the cross-references among &lt;code&gt;requirements&lt;/code&gt;, &lt;code&gt;architecture&lt;/code&gt;, &lt;code&gt;plans&lt;/code&gt;, &lt;code&gt;code&lt;/code&gt;, &lt;code&gt;tests&lt;/code&gt;, and &lt;code&gt;logs&lt;/code&gt; bear the topological function of keeping semantic commitments recoverable across different carriers—not just document redundancy.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Structure-Preserving Language of PHS
&lt;/h2&gt;

&lt;p&gt;The basic starting point of PHS is to view a physical system as a combination of “energy storage, interconnection, dissipation, and port exchange.” A common finite-dimensional form can be written as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dx/dt = (J(x) − R(x)) ∇H(x) + G(x) u
y = G(x)ᵀ ∇H(x)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This formula shows how several core symbols are organized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H measures the energy currently stored in the system;&lt;/li&gt;
&lt;li&gt;J only moves energy; it neither creates nor destroys energy;&lt;/li&gt;
&lt;li&gt;R dissipates the system’s internal energy;&lt;/li&gt;
&lt;li&gt;u is the port input, y is the port output; the pair forms the port power yᵀu;&lt;/li&gt;
&lt;li&gt;G describes how the ports couple to the internal state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can borrow this vocabulary to express three methodological principles from nonlinear control:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First find quantities that tend to be conserved, then judge which errors need to be eliminated.&lt;/li&gt;
&lt;li&gt;Distinguish lossless routing from true dissipation; do not mistake “information moved” for “the system converged.”&lt;/li&gt;
&lt;li&gt;View “transport, dissipation, and external injection/extraction” separately, and avoid flattening all coupling into a linear task chain.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. The Feedback-Linearization–Style Software Engineering Fallacy
&lt;/h2&gt;

&lt;p&gt;In control theory, exact feedback linearization attempts to cancel nonlinear terms using coordinate transformations and feedback so that the system behaves as a linear object. This works in some systems, but it can also be highly dependent on exact parameters and destroy the system’s original energy structure.&lt;/p&gt;

&lt;p&gt;There is a similar impulse in software engineering: to make things easier for the AI, flatten all knowledge into a single unified artifact—a spec, a change request, a task list, an issue, a pull request description, or some master plan document.&lt;/p&gt;

&lt;p&gt;This practice appears to reduce complexity, but it is actually performing an engineering version of “linearization”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context in raw input is flattened into requirement entries;&lt;/li&gt;
&lt;li&gt;The long-term structure of owner docs is flattened into this iteration’s task description;&lt;/li&gt;
&lt;li&gt;Architecture precedence is flattened into a checklist;&lt;/li&gt;
&lt;li&gt;Historical judgments in logs, bugs, and analysis are flattened into “known items”;&lt;/li&gt;
&lt;li&gt;Tests and audits are flattened into “completed proof.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Locally, this makes it easier for the AI to execute. Over the long term, it destroys the semantic topology of the repository. After different types of facts are squeezed into the same coordinate system, the AI no longer knows which material answers “what is,” which material answers “where we should converge,” and which material is only “why we did it that way at the time.”&lt;/p&gt;

&lt;p&gt;AGE can use specs and checklists, but it should not forcibly compress all knowledge into the same execution form. &lt;code&gt;docs/architecture/&lt;/code&gt;, &lt;code&gt;docs/components/&lt;/code&gt;, &lt;code&gt;docs/plans/&lt;/code&gt;, &lt;code&gt;docs/logs/&lt;/code&gt;, &lt;code&gt;docs/bugs/&lt;/code&gt;, &lt;code&gt;docs/analysis/&lt;/code&gt; need to retain distinct responsibilities, because they are different energy ports and different state coordinates within the same repository system.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Semantic Commitment as the Energy Storage Function of AGE
&lt;/h2&gt;

&lt;p&gt;In PHS, the Hamiltonian is the system’s stored energy function, answering “how much energy does the system currently hold.” When applied to AGE, we can regard the semantic commitments that must be recovered, preserved, and used to constrain future evolution across sessions as the repository system’s “stored energy”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H_repo = total amount of semantic commitment in the repository that remains valid
         and must be recoverable across sessions to constrain future evolution.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here “semantic commitment” means facts, contracts, and judgments that the system has accepted and that should not be casually lost; file word count or number of document entries is not equivalent to semantic commitment. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A certain user-visible behavior must exist;&lt;/li&gt;
&lt;li&gt;A certain schema field has a definite meaning;&lt;/li&gt;
&lt;li&gt;A certain package dependency direction must not be reversed;&lt;/li&gt;
&lt;li&gt;A certain renderer contract needs to be stable;&lt;/li&gt;
&lt;li&gt;The root cause of a certain historical bug must not be reintroduced;&lt;/li&gt;
&lt;li&gt;A certain audit finding has been falsified and should no longer drive corrective action;&lt;/li&gt;
&lt;li&gt;A certain owner doc defines the current specification baseline, not a future aspiration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These commitments can be roughly decomposed as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H_repo = H_intent + H_requirement + H_owner + H_contract + H_behavior + H_proof + H_memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These components correspond to:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Typical carriers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hintent
&lt;/td&gt;
&lt;td&gt;Genuine intent brought by external input&lt;/td&gt;
&lt;td&gt;User requests, PM explanations, external material&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hrequirement
&lt;/td&gt;
&lt;td&gt;Requirement commitments that the current slice must fulfill&lt;/td&gt;
&lt;td&gt;requirement, plan goals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Howner
&lt;/td&gt;
&lt;td&gt;Long-term stable structural commitments&lt;/td&gt;
&lt;td&gt;architecture docs, component design docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hcontract
&lt;/td&gt;
&lt;td&gt;Contracts that can be relied upon externally or downstream&lt;/td&gt;
&lt;td&gt;schema, API, public types, renderer contracts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hbehavior
&lt;/td&gt;
&lt;td&gt;Actual running behavior in the live repo&lt;/td&gt;
&lt;td&gt;code, examples, playground&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hproof
&lt;/td&gt;
&lt;td&gt;Re-examinable proof&lt;/td&gt;
&lt;td&gt;tests, verification, audit evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hmemory
&lt;/td&gt;
&lt;td&gt;Trajectory judgments that should not be forgotten in the future&lt;/td&gt;
&lt;td&gt;logs, bugs, retrospectives, analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An implementation changes the carrier shape of a commitment: the same semantic commitment transforms from “a change obligation not yet fulfilled” into “a stable, recoverable fact in code, tests, owner docs, and logs.”&lt;/p&gt;

&lt;p&gt;Hrepo describes only the commitments that have been accepted by the system and need to be retained and recovered. It excludes free uncertainty that has not yet been clarified, assigned, or verified. The latter is recorded separately as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F_repo = free semantic uncertainty in the repository not yet bound
         to a stable commitment, owner, or proof.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore, Frepo is not a component of Hrepo. It is more like unbound energy floating around the semantic commitments: when requirements are not yet clear, owners not yet determined, tests not yet proven, audits not yet closed—the commitment has emerged but has not yet settled into a stable repository structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Energy Redistribution Is About Authority Weight, Not File Count
&lt;/h2&gt;

&lt;p&gt;Each folder should not be naively viewed as a separate energy bin. After a requirement is turned into code, the requirement file does not disappear; after an owner doc is updated, the input file still exists. What truly changes is the active authority of the same semantic commitment across different carriers—the redistribution of interpretive power, constraining power, and proving power.&lt;/p&gt;

&lt;p&gt;For example, a commitment initially appears in raw input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Hidden form fields should not participate in submission."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After it enters the requirement, the raw input is still retained, but the direct interpretive authority for the current implementation transfers to the requirement. After it enters an architecture owner doc, long-term baseline interpretive authority transfers to the owner doc. After it enters code and tests, behavioral execution and proving authority transfer to implementation and verification. After it enters a bug note or log, historical judgment becomes a recoverable memory for future sessions.&lt;/p&gt;

&lt;p&gt;Therefore, a more accurate statement is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Files are not conserved.
The effective weight of semantic commitments is redistributed among multiple carriers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within a closed slice, unless an explicit human decision changes the scope, Hrepo should not increase or decrease out of nowhere. What truly should decrease is Frepo—the free semantic uncertainty that has not yet been bound, assigned, or verified.&lt;/p&gt;

&lt;p&gt;The goal of AGE can be written as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;preserve H_repo while reducing F_repo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requirement clarification, owner-doc alignment, tests, verification, and closure audits bind commitments from a free, vague, driftable state into a stable, recoverable, provable form.&lt;/p&gt;

&lt;p&gt;In PHS, R dissipates physical energy H; in AGE, Hrepo represents the total semantic commitment that should be preserved as much as possible, and should not be treated as an object of dissipation. Later, the term &lt;code&gt;R-flow&lt;/code&gt; will refer to reducing Frepo—that is, reducing the free uncertainty generated when the same semantic commitment is not yet bound, assigned, or verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. q and p: Stable State Representation and Change Obligation Representation
&lt;/h2&gt;

&lt;p&gt;If we view Hrepo as a scalar defined on some phase space, that phase space requires at least two classes of conjugate variables.&lt;/p&gt;

&lt;p&gt;It can be written as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H_repo(q, p).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here I borrow the notation q and p to represent two complementary semantic dimensions in AGE, not to treat them as physical position and momentum.&lt;/p&gt;

&lt;p&gt;q is the stable state representation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;q_i = the current form in which a certain semantic commitment exists
      within the stable structure of the repository.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It answers: what the system is now.&lt;/p&gt;

&lt;p&gt;p is the change obligation representation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p_i = the directional pressure that a certain semantic commitment exerts
      on future evolution.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It answers: why the system needs to move next, and in which direction.&lt;/p&gt;

&lt;p&gt;A simple example explains why the q/p duality is still needed even in one-dimensional cases. Suppose the semantic commitment is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c = "administrators can export CSV (comma-separated value) files."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the code currently has no CSV export, two completely different situations can exist:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;qc
&lt;/th&gt;
&lt;th&gt;pc
&lt;/th&gt;
&lt;th&gt;AI's expected action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CSV explicitly out of scope&lt;/td&gt;
&lt;td&gt;currently unsupported&lt;/td&gt;
&lt;td&gt;no change obligation&lt;/td&gt;
&lt;td&gt;should not implement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV is the top-priority active requirement&lt;/td&gt;
&lt;td&gt;currently unsupported&lt;/td&gt;
&lt;td&gt;strong change obligation&lt;/td&gt;
&lt;td&gt;should implement per plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Looking only at q, both are “currently unsupported.” But p is completely different.&lt;/p&gt;

&lt;p&gt;Conversely, if the current code supports CSV but an owner doc decides to remove it, qc remains “currently supported” while pc becomes a reverse change obligation. Without p, the AI cannot distinguish “stable existence” from “should be deleted but not yet deleted.”&lt;/p&gt;

&lt;p&gt;In the AGE documentation system, q is primarily carried by these materials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current baselines in &lt;code&gt;docs/architecture/&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Component contracts in &lt;code&gt;docs/components/*/design.md&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Live code and exported types;&lt;/li&gt;
&lt;li&gt;Passing tests and examples;&lt;/li&gt;
&lt;li&gt;Schema, public contracts, runtime behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;p is primarily carried by these materials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active plan;&lt;/li&gt;
&lt;li&gt;Backlog or audit findings;&lt;/li&gt;
&lt;li&gt;Failing test;&lt;/li&gt;
&lt;li&gt;Bug report;&lt;/li&gt;
&lt;li&gt;Open question;&lt;/li&gt;
&lt;li&gt;Stale-doc conflict;&lt;/li&gt;
&lt;li&gt;Closure gate;&lt;/li&gt;
&lt;li&gt;Human decision pending.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is only a tendency of responsibility, not a fixed directory mapping. The same file may simultaneously carry both q and p. A requirement describes both the target state and the implementation obligation; a plan records both the current baseline and the closure pressure; a bug note records both historical facts and imposes constraints on future changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Development Is Converting Legitimate p into Stable q
&lt;/h2&gt;

&lt;p&gt;A correct implementation in AGE converts legitimate change obligations into stable state commitments. “Completing the task” is only the surface narrative; what really matters is whether this change has entered a recoverable, provable repository structure.&lt;/p&gt;

&lt;p&gt;Again take CSV export as an example.&lt;/p&gt;

&lt;p&gt;In the table below, T(p) denotes the total tension or pressure of change obligations—not a new physical energy, but a marker for “why the system still needs to evolve.”&lt;/p&gt;

&lt;p&gt;Before implementation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hrequirement
&lt;/td&gt;
&lt;td&gt;high, requirement carries "CSV support needed"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Howner
&lt;/td&gt;
&lt;td&gt;low or needs update, owner doc hasn't absorbed the capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hbehavior
&lt;/td&gt;
&lt;td&gt;low, code not yet implemented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hproof
&lt;/td&gt;
&lt;td&gt;low, no tests or verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T(p)&lt;/td&gt;
&lt;td&gt;high, plan/backlog holds change pressure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After implementation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hrequirement
&lt;/td&gt;
&lt;td&gt;still present, but unclosed obligation decreases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Howner
&lt;/td&gt;
&lt;td&gt;increases if it becomes a stable capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hbehavior
&lt;/td&gt;
&lt;td&gt;increases, code carries behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hproof
&lt;/td&gt;
&lt;td&gt;increases, tests and verification carry evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hmemory
&lt;/td&gt;
&lt;td&gt;increases, log/audit records closure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T(p)&lt;/td&gt;
&lt;td&gt;decreases, change obligation released&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In engineering language, this is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;active requirement / plan pressure
→ owner baseline / code behavior / proof / memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commitment did not disappear; it only transformed from “an obligation to be fulfilled in the future” into “a stable fact the current system already supports.”&lt;/p&gt;

&lt;p&gt;This also explains why a closure audit should not merely look at checkboxes. &lt;code&gt;- [x]&lt;/code&gt; only indicates that the executor claims something is done. The real question is: has this p been transformed into stable q, or has it merely been moved from plan to summary, from summary to log, from log to the next round of follow-ups?&lt;/p&gt;

&lt;h2&gt;
  
  
  8. J-flow and R-flow: Routing Is Not Dissipation
&lt;/h2&gt;

&lt;p&gt;In PHS, J represents the lossless interconnection structure, and R represents dissipation. AGE likewise needs to distinguish two completely different classes of actions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;J-flow&lt;/code&gt; and &lt;code&gt;R-flow&lt;/code&gt; here are engineering labels created in this article by borrowing cybernetic language; they are not standard control-theory terms.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;J-flow&lt;/code&gt; is the transport and transformation of semantic commitments along the correct topology.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Raw input is recorded in &lt;code&gt;docs/input/&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Requirements are synthesized into a requirement;&lt;/li&gt;
&lt;li&gt;Stable rules enter an owner doc;&lt;/li&gt;
&lt;li&gt;A plan references owner docs and the live baseline;&lt;/li&gt;
&lt;li&gt;Traceable links are established among code/test/log/audit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These actions themselves do not necessarily reduce uncertainty. They mainly let commitments flow along the correct topology and avoid being stuffed into wrong positions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;R-flow&lt;/code&gt; is what truly reduces Frepo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A human explicitly cuts scope;&lt;/li&gt;
&lt;li&gt;A requirement writes testable acceptance criteria;&lt;/li&gt;
&lt;li&gt;An owner doc absorbs a stable baseline;&lt;/li&gt;
&lt;li&gt;Automated tests prove behavior;&lt;/li&gt;
&lt;li&gt;Focused verification exercises real paths;&lt;/li&gt;
&lt;li&gt;An independent closure audit overthrows or confirms a completion narrative;&lt;/li&gt;
&lt;li&gt;A bug note records a non-obvious root cause, reducing the risk of future drift.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This distinction is critical. A great deal of seemingly diligent documentation work is actually only &lt;code&gt;J-flow&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moving ambiguity from input to discussion;&lt;/li&gt;
&lt;li&gt;Writing an undecided design into a plan;&lt;/li&gt;
&lt;li&gt;Writing a plan summary into a log;&lt;/li&gt;
&lt;li&gt;Turning preliminary audit findings directly into a backlog;&lt;/li&gt;
&lt;li&gt;Writing “should test” as a closure gate, but never truly executing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These may be necessary steps, but they mainly change the location of free semantic energy without truly eliminating it. The real danger is mistaking &lt;code&gt;J-flow&lt;/code&gt; for &lt;code&gt;R-flow&lt;/code&gt;—mistaking “information moved” for “the system converged.”&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Park Transformation: From Chat Coordinates to Repo Coordinates
&lt;/h2&gt;

&lt;p&gt;From the nonlinear control perspective, the significance of the Park transformation is that it converts the rotational couplings hidden in time-varying three-phase coordinates into d-q coordinates, where power relationships and interconnection structure are easier to identify.&lt;/p&gt;

&lt;p&gt;A similar move exists in AGE. The raw chat, PM materials, and discussions in a long context constitute a time-varying, strongly coupled, implicit coordinate system. Requirements, architecture, execution, proof, history, and assumptions are all mixed together. In this coordinate system, the AI can easily mistake exploration for baseline, plans for facts, and historical judgments for current contracts.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;docs/&lt;/code&gt; system performs the function of transforming this mixed semantic field into more stable repo coordinates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Coordinate&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/architecture/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current canonical architecture and owner precedence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/components/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Component-level contracts and schema semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/plans/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How this round of work will close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/logs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What happened and short-term context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/bugs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Non-obvious defects and regression risks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/analysis/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exploration, comparison, rejected directions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/testing/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manual or exploratory proof&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;live code/tests&lt;/td&gt;
&lt;td&gt;Current implementation facts and executable evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This step is more like a coordinate transformation: it turns a hidden semantic interconnection structure into a routable, auditable, recoverable topology. Document classification is only the external form of this coordinate transformation.&lt;/p&gt;

&lt;p&gt;One could say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGE's document system resembles a Park-style re-coordinatization:
it expresses the time-varying, implicit, strongly coupled semantic quantities
in chat into more stable, routable, auditable responsibility coordinates
in the repository. This process is not lossless transformation; it is a
structured transcription that includes interpretation, assignment, and
evidence binding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Space, Time, and Conservation
&lt;/h2&gt;

&lt;p&gt;If we continue unfolding the energy-function language, “space” and “time” in AGE can also receive a clearer explanation.&lt;/p&gt;

&lt;p&gt;Here space refers to the semantic responsibility space, not the filesystem path itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;space = the set of positions where a commitment can be placed,
        interpreted, constrained, and proven.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can also be called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;space ≃ semantic ownership topology.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, the same commitment “should hidden form fields participate in submission” might simultaneously reside in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/form-validation.md&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/data-domain-owner.md&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;runtime code;&lt;/li&gt;
&lt;li&gt;validation tests;&lt;/li&gt;
&lt;li&gt;a historical bug note;&lt;/li&gt;
&lt;li&gt;plan closure evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These positions are more like coordinate axes; together they define the spatial distribution of this commitment in the repository, rather than forming a before-and-after sequence of stages.&lt;/p&gt;

&lt;p&gt;Here time refers to the discrete evolution sequence of the repository state, not the natural calendar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;time = sequence of repository state transitions across sessions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A plan closure, an audit overturn, a commit, a full-green baseline, an owner-doc update—these are all events in AGE time.&lt;/p&gt;

&lt;p&gt;AI does not have human continuous memory. Therefore, AGE time is not psychological time but externalized, recoverable repository time. If a decision exists only in chat and never enters the repository, it barely existed in AGE time at all.&lt;/p&gt;

&lt;p&gt;From this, we can define two important homogeneities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temporal homogeneity&lt;/strong&gt;: When the same repository state is re-read on different dates, in different AI sessions, and in different context windows, the same set of effective commitments and execution rules should be recovered.&lt;/p&gt;

&lt;p&gt;This is the deep meaning of file-in/file-out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;temporal homogeneity = session translation invariance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the AI knows today that a feature is out of scope, but tomorrow in a different session does not know it because it was only written in chat, then temporal homogeneity is broken and Hrepo suffers a semantic leak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spatial homogeneity&lt;/strong&gt;: The same type of semantic commitment, no matter in which local feature it appears, should follow the same ownership, routing, and proof rules.&lt;/p&gt;

&lt;p&gt;For example, a permission commitment should not bypass the permission owner doc just because it appears inside a CSV export button; schema authoring semantics should not bypass compiler/runtime contracts just because they appear in an example; a complex host capability should not leak directly into the core scope just because the current implementation makes it convenient.&lt;/p&gt;

&lt;p&gt;AGE space is not a uniform Euclidean space but a responsibility space with topology and curvature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protected areas are high-curvature zones; entering them requires a change in trajectory;&lt;/li&gt;
&lt;li&gt;Owner docs are centers of a potential field; nearby changes will be pulled back toward the baseline;&lt;/li&gt;
&lt;li&gt;Stale docs are coordinate singularities and should not be taken at face value;&lt;/li&gt;
&lt;li&gt;External integrations are open ports that may inject or extract commitments;&lt;/li&gt;
&lt;li&gt;Audits are observation surfaces, not sources of fact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, AGE does not require all spatial points to be homogeneous. It requires homogeneity within the same type of responsibility region, and that cross-region transitions obey clear topology.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Immersion and Invariance: From Attractor to Target Manifold
&lt;/h2&gt;

&lt;p&gt;The core idea of Immersion and Invariance is to first construct a target manifold, rather than estimating all unknown parameters accurately. Immersion means embedding the desired low-dimensional target dynamics into the original system’s state space so that the target behavior becomes a set of state relationships the system can reach. Invariance means that once the trajectory lands on this set of relationships, the system evolution will not take it off the manifold. The task of the controller or observer is to make the trajectory converge to this manifold and maintain self-consistent evolution on it.&lt;/p&gt;

&lt;p&gt;The relationship to the attractor concept can be understood this way: the attractor answers “what structure the system should converge to in the long term,” while Immersion and Invariance answers “when unknown parameters and local unobservability exist, how to construct a convergent, maintainable target manifold.” The former defines the long-term structure; the latter gives a control-design image for making the trajectory enter and stay near that structure.&lt;/p&gt;

&lt;p&gt;In AI development there are also massive “parameters” that can never be fully known:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The product manager’s complete true intent;&lt;/li&gt;
&lt;li&gt;Future user behavior;&lt;/li&gt;
&lt;li&gt;The full boundaries of external systems;&lt;/li&gt;
&lt;li&gt;All the historical reasons in legacy code;&lt;/li&gt;
&lt;li&gt;What the next AI session will misunderstand;&lt;/li&gt;
&lt;li&gt;The real evolutionary pressure on a certain abstraction six months later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional approaches easily fall into two extremes: either try to clarify all unknowns before acting, or swallow all unknowns and code directly.&lt;/p&gt;

&lt;p&gt;AGE is closer to the Immersion and Invariance compromise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not require knowing all parameters; only require that the current slice
be embedded into, and converge to, a closable invariant manifold.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Corresponding to AGE, owner docs define the long-term attractor; the current plan’s goals, non-goals, accepted assumptions, verification gates, and closure audit define the local target manifold for this slice. A slice does not have to resolve all unknowns, but it needs to state which local manifold it is embedded into, and why it will not escape this manifold after completion.&lt;/p&gt;

&lt;p&gt;This manifold is jointly defined by the following materials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;goals;&lt;/li&gt;
&lt;li&gt;non-goals;&lt;/li&gt;
&lt;li&gt;owner-doc invariants;&lt;/li&gt;
&lt;li&gt;accepted assumptions;&lt;/li&gt;
&lt;li&gt;blocking assumptions;&lt;/li&gt;
&lt;li&gt;verification gates;&lt;/li&gt;
&lt;li&gt;closure audit;&lt;/li&gt;
&lt;li&gt;live code baseline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What a plan should really spell out is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This slice is permitted to ignore X because X is orthogonal to this closure.
This slice needs to resolve Y because Y changes current contracts or
user-visible behavior.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does not give a green light to vague requirements. On the contrary, it demands the classification of uncertainty: which unknowns can remain unknown, and which must be eliminated first through human decisions or owner-doc alignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Structure-Preserving Observer: Audit Is Not Another Narrative Source
&lt;/h2&gt;

&lt;p&gt;The key inspiration from structure-preserving PHS observer design is: an observer can preserve the system’s original structure rather than constructing a separate estimator disconnected from the system topology.&lt;/p&gt;

&lt;p&gt;AGE’s audit should be the same. A good closure audit re-observes the system state along the same set of owner-doc precedence, live code, tests, logs, and plan gates; the implementer’s completion narrative is merely material to be verified.&lt;/p&gt;

&lt;p&gt;This is also why a closure audit in AGE should not merely ask “is the task done,” but should ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has the live behavior truly landed;&lt;/li&gt;
&lt;li&gt;Does the owner doc still describe the current baseline;&lt;/li&gt;
&lt;li&gt;Do the tests protect the commitment rather than an accidental implementation;&lt;/li&gt;
&lt;li&gt;Are the plan’s &lt;code&gt;Goals&lt;/code&gt;/&lt;code&gt;Non-Goals&lt;/code&gt; still honest;&lt;/li&gt;
&lt;li&gt;Does the closure evidence exist in the repository, not just in a summary;&lt;/li&gt;
&lt;li&gt;Have in-scope defects been downgraded to vague follow-ups;&lt;/li&gt;
&lt;li&gt;Has &lt;code&gt;J-flow&lt;/code&gt; been misreported as &lt;code&gt;R-flow&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an audit does not preserve structure, it becomes another high-density narrative source. It may create new findings, new backlogs, a new sense of completion, without actually reducing Frepo.&lt;/p&gt;

&lt;p&gt;Thus, the audit in AGE should resemble a structure-preserving observer: it re-estimates the system state according to the existing fact topology, and calibrates its estimation with live repo evidence; it does not create a separate fact topology.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Implications for AGE Practice
&lt;/h2&gt;

&lt;p&gt;The value of this nonlinear control analogy for AGE practice lies in pointing out several directly improvable methodological points. New terminology is meaningful only when it helps distinguish real engineering actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Plans Should Explicitly Write the Reference Set
&lt;/h3&gt;

&lt;p&gt;Writing and reviewing code both require materials beyond the previous-stage file. A plan can more explicitly require listing the reference constellation for this slice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Reference Set&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Context / routing:
&lt;span class="p"&gt;-&lt;/span&gt; Active owner docs:
&lt;span class="p"&gt;-&lt;/span&gt; Live code routes:
&lt;span class="p"&gt;-&lt;/span&gt; Tests / verification baseline:
&lt;span class="p"&gt;-&lt;/span&gt; Logs / bugs / known regressions:
&lt;span class="p"&gt;-&lt;/span&gt; External contracts:
&lt;span class="p"&gt;-&lt;/span&gt; Plan / audit evidence:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can prevent the AI from treating the plan as the sole source of truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Plans Should Explicitly Write the Commitment Phase State
&lt;/h3&gt;

&lt;p&gt;Current plans already emphasize baseline, goals, non-goals, and closure gates. The nonlinear control perspective further asks to spell out q/p:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Commitment Phase State&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Stable state now (&lt;span class="sb"&gt;`q`&lt;/span&gt;):
&lt;span class="p"&gt;-&lt;/span&gt; Active change pressure (&lt;span class="sb"&gt;`p`&lt;/span&gt;):
&lt;span class="p"&gt;-&lt;/span&gt; Target stable state after closure:
&lt;span class="p"&gt;-&lt;/span&gt; Proof that &lt;span class="sb"&gt;`p`&lt;/span&gt; was converted into stable &lt;span class="sb"&gt;`q`&lt;/span&gt;:
&lt;span class="p"&gt;-&lt;/span&gt; Remaining pressure and why it is non-blocking:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can distinguish “the behavior currently does not exist because it is stably unnecessary” from “the behavior currently does not exist but needs to be implemented.”&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Closure Audit Should Check Semantic Conservation
&lt;/h3&gt;

&lt;p&gt;One more question can be added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Did any in-scope commitment disappear, weaken, or move to a non-authoritative artifact?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more accurate than “were the documents updated.” What we truly need to avoid is commitments leaking during transformation.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Owner Docs Should Write Stable Commitments
&lt;/h3&gt;

&lt;p&gt;For important owner docs, structures like the following can be gradually added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Stable Commitments&lt;/span&gt;

&lt;span class="gu"&gt;## Allowed Variation&lt;/span&gt;

&lt;span class="gu"&gt;## Drift / Leakage Signals&lt;/span&gt;

&lt;span class="gu"&gt;## Correction Path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes owner docs more like structural equations than instruction manuals.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Audit Prompts Should Distinguish J-flow and R-flow
&lt;/h3&gt;

&lt;p&gt;During an audit, one should ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which changes merely routed commitments between artifacts?
Which changes actually reduced free semantic uncertainty through
decision, proof, or owner-doc alignment?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids mistaking “more documents were written” for “the system has become more convergent.”&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Conclusion: The Nonlinear Dynamical System Control Image of AGE
&lt;/h2&gt;

&lt;p&gt;If AGE is reinterpreted under the lens of nonlinear dynamical system control, it can be seen as a structure-preserving AI engineering control system. PHS provides the representative vocabulary of energy, interconnection, dissipation, and ports; Immersion and Invariance supplements the image of a target manifold, unknown parameters, and trajectory convergence.&lt;/p&gt;

&lt;p&gt;This image can be summarized as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hrepo is the total semantic commitment that should be conserved across sessions;&lt;/li&gt;
&lt;li&gt;q is the stable state representation of commitment;&lt;/li&gt;
&lt;li&gt;p is the change obligation representation of commitment;&lt;/li&gt;
&lt;li&gt;Development is the conversion of legitimate p into stable q;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;J-flow&lt;/code&gt; is responsible for routing commitments along the correct ownership topology;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;R-flow&lt;/code&gt; is responsible for reducing free semantic energy that is unbound, unverified, and unassigned;&lt;/li&gt;
&lt;li&gt;The docs system is a Park transformation from chat coordinates to repo coordinates;&lt;/li&gt;
&lt;li&gt;File-in/file-out maintains temporal homogeneity, i.e., session translation invariance;&lt;/li&gt;
&lt;li&gt;Owner docs, plans, tests, audits, and logs together form a multi-port coupled convergence mechanism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core judgment is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The disorder in AI development is not just noise; it is often semantic energy that has not yet been correctly coordinatized. The next step for AGE is to more clearly model how these semantic commitments are injected, routed, stored, transformed, proven, and conserved, rather than simply piling on more processes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Therefore, AGE can be understood as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A nonlinear dynamical system control image for software engineering under high-speed AI perturbation: use owner docs to define the attractor, use plans to embed the current slice into a local target manifold, use routing to preserve structure, use verification/audit to reduce free semantic energy, and use logs/bugs to preserve the trajectory memory across time.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix: PHS Mathematical Background
&lt;/h2&gt;

&lt;p&gt;PHS is a structured modeling framework developed by van der Schaft, Maschke, and others around the 1990s around nonlinear systems, generalized bond graphs, and port interconnections, and is closely intertwined with the passivity-based control and energy shaping work of Ortega and others. Its difference from ordinary state-space models lies in putting the energy function and interconnection topology first. Mechanical systems, electrical circuits, motors, power networks, and fluid networks can all be viewed under this perspective as combinations of energy-storage elements, dissipative elements, and port interconnections.&lt;/p&gt;

&lt;p&gt;Interconnection and Damping Assignment Passivity-Based Control further applies this approach to control design: the controller does not simply cancel nonlinearities, but reconfigures the closed-loop system’s interconnection structure and damping distribution so that the closed-loop energy function has the desired shape. Structure-preserving observers, PHS network stability, and passive interconnection of microgrids all inherit the same judgment: preserving structure is often more robust than flattening it.&lt;/p&gt;

&lt;p&gt;A common form of finite-dimensional PHS is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dx/dt = (J(x) − R(x)) ∇H(x) + G(x) u
y = G(x)ᵀ ∇H(x)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x&lt;/td&gt;
&lt;td&gt;System state, e.g., mechanical position/momentum, circuit flux linkage/charge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H(x)&lt;/td&gt;
&lt;td&gt;Total energy function of the system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;∇H(x)&lt;/td&gt;
&lt;td&gt;Gradient of energy with respect to state, also often called co-energy variables; under specific port choices can correspond to conjugate quantities like force, voltage, current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J(x)&lt;/td&gt;
&lt;td&gt;Skew-symmetric interconnection matrix, satisfying J(x)ᵀ = −J(x), represents lossless energy routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R(x)&lt;/td&gt;
&lt;td&gt;Positive semidefinite dissipation matrix, satisfying R(x) = R(x)ᵀ ≽ 0, represents dissipation such as resistance, friction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G(x)&lt;/td&gt;
&lt;td&gt;How external ports couple into the system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Port input, e.g., applied voltage, external force&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Port output, usually paired with u to form input power yᵀu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Taking the derivative of H along system trajectories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dH/dt = (∇H)ᵀ ẋ = (∇H)ᵀ J ∇H − (∇H)ᵀ R ∇H + (∇H)ᵀ G u.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since J is skew-symmetric, for any vector a we have aᵀ J a = 0. Therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dH/dt = − (∇H)ᵀ R ∇H + yᵀ u.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there is no dissipation and no external input, i.e., R = 0 and u = 0, then dH/dt = 0—energy is conserved. If u = 0 but R ≽ 0, then dH/dt ≤ 0—the system energy is non-increasing. This is the fundamental reason why passivity-based control and energy shaping can work.&lt;/p&gt;

&lt;p&gt;Integrating the above from 0 to t gives the passivity inequality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H(x(t)) − H(x(0)) ≤ ∫₀ᵗ y(τ)ᵀ u(τ) dτ.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It expresses that the increase in stored energy will not exceed the total energy injected through the external ports. The system can store energy, release energy, and dissipate energy, but cannot create energy out of nothing.&lt;/p&gt;

&lt;p&gt;This inequality explains why PHS is particularly suitable for network systems. If two passive systems are interconnected in a power-conserving way, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;u₁ = −y₂, u₂ = y₁,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then the sum of the two port powers is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;y₁ᵀ u₁ + y₂ᵀ u₂ = y₁ᵀ (−y₂) + y₂ᵀ y₁ = 0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interconnection itself neither injects nor dissipates energy; it only moves energy between the two subsystems. Therefore, lossless interconnection of passive systems remains passive. This property is key to extending PHS from single motors, robot arms, and circuits to microgrids, networked systems, and large-scale physical systems modeling.&lt;/p&gt;

&lt;p&gt;The minimal canonical Hamiltonian system can be written as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x = (q, p),

[ dq/dt ]   [ 0  I ] [ ∂H/∂q ]
[ dp/dt ] = [ −I 0 ] [ ∂H/∂p ].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here q is a position-like variable, p is a momentum-like variable, and the matrix in the middle is the most basic symplectic structure. Its role is not to dissipate energy, but to let energy reciprocally convert between “positional potential energy” and “momentum kinetic energy.”&lt;/p&gt;

&lt;p&gt;If dissipation and ports are added, we obtain a more general form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ dq/dt ]   [ 0  I ] [ ∂H/∂q ]
[ dp/dt ] = [ −I 0 ] [ ∂H/∂p ] − damping terms + port input terms.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason the Park transformation is important in electric motors is that it converts the time-varying rotational relationships in stationary three-phase coordinates into d-q coordinates, making speed-dependent cross-couplings easier to identify as part of the interconnection structure. From the energy perspective, such a cross-term is not an ordinary disturbance, but a structural channel through which energy flows among the d-axis, q-axis, and mechanical momentum.&lt;/p&gt;

&lt;p&gt;This fact can be seen from a two-dimensional skew-symmetric matrix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S = [ 0  −1 ]
    [ 1   0 ],  Sᵀ = −S.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For any 2D vector z, we have zᵀ S z = 0. If a local dynamic contains a term ω S z, it will cause the two components of z to rotate mutually and exchange energy forms, but it will not change the quadratic energy ½ zᵀ z:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d/dt (½ zᵀ z) = zᵀ ż = zᵀ (ω S z) = ω zᵀ S z = 0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why the PHS perspective cautions against the intuition to “cancel all cross-coupling terms.” Some cross-terms are not errors, but the manifestation of system topology in local coordinates.&lt;/p&gt;

&lt;h2&gt;
  
  
  AGE Application Development Template
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/attractor-guided-engineering-template" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/attractor-guided-engineering-template&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>computerscience</category>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Attractor Before Harness: A Methodology for Large-Scale AI Development</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Thu, 21 May 2026 12:08:33 +0000</pubDate>
      <link>https://dev.to/canonical/attractor-before-harness-a-methodology-for-large-scale-ai-development-2omk</link>
      <guid>https://dev.to/canonical/attractor-before-harness-a-methodology-for-large-scale-ai-development-2omk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In systems where AI deeply participates in development, the first-principles question is not "how to constrain AI's behavior," but "what long-term structure the system should converge to."&lt;br&gt;&lt;br&gt;
Only after this direction is clearly defined can mechanisms like harness, guardrail, verification, audit, and closure truly have meaning. Otherwise, they are merely efficiently solidifying a wrong baseline.&lt;br&gt;&lt;br&gt;
This claim is inevitable because AI collaboration pushes "trajectory convergence"—a problem long treated as an add-on in software engineering methodology—to a position where it must be explicitly modeled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Why Harness Is the First Thing People Think of When Discussing AI Engineering
&lt;/h2&gt;

&lt;p&gt;In current discussions about AI-assisted development, the most common terms are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;guardrail&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;verification&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feedback loop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent harness&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This set of intuitions assumes a single premise by default:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The correct direction of the system is already known.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Given that premise, the problems naturally become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to limit deviations&lt;/li&gt;
&lt;li&gt;How to expose failures as early as possible&lt;/li&gt;
&lt;li&gt;How to make reviews stricter&lt;/li&gt;
&lt;li&gt;How to prevent agents from going rogue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This language suffices for small tasks. For a script, a CRUD page, or a local bug fix, you usually already know "what a correct result looks like"; the remaining work is mainly about execution and verification.&lt;/p&gt;

&lt;p&gt;But what truly makes large systems difficult is often not "how to prevent crossing the line," but "which path is the right long-term structure in the first place."&lt;/p&gt;

&lt;p&gt;To answer this question, we must first recognize one thing: &lt;strong&gt;all current harness-type mechanisms rest on an implicit premise—the evaluation unit is primarily state, and trajectory convergence relies on the developer's tacit sense of direction as a backstop.&lt;/strong&gt; AI collaboration removes precisely this backstop.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Backstop That Has Been Removed
&lt;/h2&gt;

&lt;p&gt;Open any mainstream engineering methodology—TDD, DDD, Clean Architecture, Agile, Code Review culture—and their first-class evaluation targets are almost always state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate "whether this PR is correct," not "whether the cumulative direction of the last 100 PRs is correct."&lt;/li&gt;
&lt;li&gt;Evaluate "whether the current architecture is clean," not "whether the architecture is being continuously pushed toward a stable form during evolution."&lt;/li&gt;
&lt;li&gt;Evaluate "whether tests cover the current behavior," not "whether the test suite itself has been corroded by implementation details."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional methodologies are not entirely without trajectory awareness—refactoring, technical debt, code smells, evolutionary architecture, and Lehman's laws of software evolution all touch on trajectory. But these concepts exist in the methodology as &lt;em&gt;corrective mechanisms&lt;/em&gt; and &lt;em&gt;diagnostic vocabulary&lt;/em&gt;, not as fundamental objects. When a theory must continuously introduce negative concepts like "debt," "fragility," and "corrosion" to retroactively acknowledge trajectory problems, it reveals that its foundational category set lacks a positive trajectory object.&lt;/p&gt;

&lt;p&gt;This state-centric paradigm has worked for so long because human engineers themselves act as a perturbation source with low frequency and stable directional sense. A person writes a few hundred lines of code per day; each perturbation is small in magnitude, and a continuous sense of direction is maintained in the mind. State-level quality assurance combined with the programmer's implicit directional sense ensures that the trajectory does not drift.&lt;/p&gt;

&lt;p&gt;AI collaboration removes this backstop. AI is not a faster programmer; it is a &lt;strong&gt;structurally different perturbation source&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High frequency&lt;/strong&gt;: A single session can generate hundreds of lines of code spanning multiple modules in minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High magnitude&lt;/strong&gt;: Each generation can introduce cross-boundary structural changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No persistent directional sense&lt;/strong&gt;: Each session is independent, with no implicit architectural judgment carried across sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly reasonable locally&lt;/strong&gt;: Interfaces, types, tests, and documentation can be produced simultaneously, and each piece passes inspection when viewed in isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is crucial. &lt;strong&gt;In AI collaboration, all state-level checks can pass while the system as a whole drifts continuously.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Plan 76 of &lt;code&gt;nop-chaos-flux&lt;/code&gt; is a typical example. An attempt to remove the local state mirror in &lt;code&gt;array-editor&lt;/code&gt; / &lt;code&gt;key-value&lt;/code&gt; immediately caused 11 test failures. But what was exposed was not a specific bug, but a deeper fact: &lt;strong&gt;the tests themselves had become tightly coupled to the timing of the old implementation.&lt;/strong&gt; From a state perspective, every incremental change had passed review and CI; from a trajectory perspective, the test suite had unconsciously drifted into a position where it could no longer support structural evolution.&lt;/p&gt;

&lt;p&gt;Traditional theory has a symptom name for this—"test fragility"—but a symptom name is a cross-sectional diagnosis. It does not name the &lt;em&gt;process&lt;/em&gt; by which 100 legitimate commits accumulate into fragility. Trajectory problems are process problems, and process problems require a process language.&lt;/p&gt;

&lt;p&gt;Thus, the issue is not that AI makes old problems worse, but that AI pushes trajectory problems from an occasional repair target to a high-frequency, first-class citizen. For these problems to enter the methodology's field of view, engineering methodology must adopt "trajectory" as a fundamental category.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Dynamical Systems Language: Making Trajectory Problems Explicit
&lt;/h2&gt;

&lt;p&gt;In mathematics and physics, a &lt;strong&gt;dynamical system&lt;/strong&gt; refers to a system whose state evolves continuously over time, with each next state depending on the current state. What we care about is not just whether it is correct at a single moment, but what kind of &lt;strong&gt;trajectory&lt;/strong&gt; it traces out over time.&lt;/p&gt;

&lt;p&gt;Translated to large-scale AI development, this language corresponds to four mutually defining fundamental objects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State Space&lt;/strong&gt;: All possible implementation states the system can evolve into under current constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attractor&lt;/strong&gt;: The stable structure to which the system is repeatedly pulled back during long-term evolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trajectory&lt;/strong&gt;: The actual evolutionary path left behind after each round of generation, verification, and correction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control&lt;/strong&gt;: The various mechanisms that continuously influence the trajectory through local signals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository, under existing constraints, has a set of all possible combinations of code, documentation, and tests it could evolve into—this constitutes the state space. The continuous actions of humans, AI, review, CI, and documentation updates constitute the evolution rules. The interaction of these two forms the live repo history, which is the trajectory. The attractor is the stable structure to which the system is repeatedly pulled back during long-term iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One point must be made clear: this language is not a "more elegant way of saying things," but the foundational language of a new ontology.&lt;/strong&gt; The four concepts—state space, attractor, trajectory, control—define one another; if one is missing, the other three cannot be rigorously expressed. Attempting to translate these concepts into the language of the old ontology (architecture, constraints, goals, process) inevitably incurs information loss—this is the root of misreadings like "Isn't Attractor Guided Engineering just Harness?"&lt;/p&gt;

&lt;p&gt;The relationship among the four objects is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State Space → Attractor → Trajectory → Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is not a rhetorical ordering; it is a logical dependency.&lt;/strong&gt; Without defining the state space, there is no talk of an attractor; without defining the attractor, one cannot judge whether the trajectory is drifting; without trajectory judgment, control has no target.&lt;/p&gt;

&lt;p&gt;The "before" here refers to &lt;strong&gt;logical priority&lt;/strong&gt;: in execution, attractor and harness co-evolve in a closed loop, but the attractor can be conceptually defined independently of the harness, while the harness cannot be conceptually defined independently of the attractor (to correct deviation, toward what?). This asymmetry corresponds to the relationship between final cause and efficient cause in dynamical systems—acknowledging co-evolution does not weaken the "before" claim. Final cause and efficient cause act together in physical systems as well, but the final cause remains the logical prerequisite for the efficient cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What Exactly Is an Attractor
&lt;/h2&gt;

&lt;p&gt;Take the well-known Lorenz attractor as an example. It is implicitly defined by differential equations. It is not a checklist that enumerates all correct trajectories in advance, nor is it a simple boundary. Within the attractor, local trajectories are highly complex and appear nearly chaotic in the short term, yet the whole does not fly apart randomly; it is always pulled back into the same type of geometric shape.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Lorenz attractor: Local trajectories are highly complex, yet the whole is still constrained by a stable structure. Chaos does not equal randomness; local unpredictability does not mean the whole is out of control.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An engineering attractor works the same way. &lt;strong&gt;It is more like an "equation-defined manifold" than "a list of all legal points enumerated one by one."&lt;/strong&gt; The equation does not write out every point on the manifold in advance; it only stipulates which relations must hold. Points satisfying these relations naturally fall within the same structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key difference from traditional architecture concepts&lt;/strong&gt;: DDD and Clean Architecture also emphasize long-term structure, but they treat that long-term structure as a &lt;strong&gt;target state&lt;/strong&gt;—the methodology's job is to "reach X." A trajectory ontology treats the long-term structure as an &lt;strong&gt;attractor&lt;/strong&gt;—the methodology's job is to "return to the vicinity of X no matter how far you are pushed away." &lt;strong&gt;The second perspective addresses stability under perturbation.&lt;/strong&gt; This is exactly the core problem in AI collaboration scenarios, and exactly the problem for which traditional methodologies lack first-class conceptual tools.&lt;/p&gt;

&lt;p&gt;To prevent conceptual drift, an attractor in engineering can be strictly divided into three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structural layer (the attractor itself)&lt;/strong&gt;: A small number of high-order invariants, such as how responsibilities are divided, how boundaries are established, and which structural relationships cannot be violated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carrier layer (the engineering carrier of the attractor)&lt;/strong&gt;: Externalizing these invariants into versionable, auditable documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation layer (the instantaneous projection of the attractor)&lt;/strong&gt;: The parts of the current code that actually embody these invariants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The attractor is not the document; the document is the carrier of the attractor. The attractor is not the code; the code is an instantaneous projection of the attractor.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This layering is important because it resolves a common confusion: "When architecture docs and code conflict, which one do we follow?" The answer is not "which one is more authoritative," but "what question are you asking?" If you are asking about current implementation behavior, the code is authoritative. If you are asking where the system should converge, the docs are authoritative. If you are asking why a certain path was abandoned, logs/bugs/analysis are authoritative. Each layer is authoritative only for its corresponding question.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Repository Begins to Bear the System's Truth, Making Harness Infrastructure
&lt;/h2&gt;

&lt;p&gt;Once AI deeply participates, the repository is no longer merely an external projection of human cognition; it begins to become the sole carrier of the system's truth. No one person fully grasps all the design details in the system, and no one can answer questions about the system's design without consulting the project source code. What the next session can re-read is not the full intent in the author's mind, but the code, diffs, logs, tests, and documentation.&lt;/p&gt;

&lt;p&gt;This has a direct engineering consequence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generation and acceptance must be genuinely separated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generation actions can be completed at high speed by AI within the same context, but acceptance can no longer rely on that generative context itself. You must return to the external evidence in the repository and re-evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the behavior was truly implemented.&lt;/li&gt;
&lt;li&gt;What the current baseline actually is.&lt;/li&gt;
&lt;li&gt;Which materials are authoritative.&lt;/li&gt;
&lt;li&gt;Whether this "completion" is just a feeling of completion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is precisely because the repository begins to bear the system's truth that generation and evaluation must be separated; and it is precisely because generation and evaluation are separated that the harness is upgraded from a "safer engineering habit" to necessary infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In traditional collaboration, harness is optional discipline; in AI collaboration, harness is the necessary condition for making trajectory judgment possible.&lt;/strong&gt; The reason is this: while AI generates code, it also generates all the materials for judging whether that code is correct—types, tests, documentation, completion summaries are all produced together by the same context based on the same understanding. If that understanding is skewed, all "verification evidence" will be skewed consistently in the same direction, not contradicting each other, yet entirely wrong as a whole. This &lt;strong&gt;self-verification trap&lt;/strong&gt; is naturally weakened in human collaboration—CI rules, reviewers, spec documents are all independent external standards maintained by different cognitive subjects. AI collaboration breaks this independence, so we must use engineering means—fresh sessions, independent audits, returning to live repo forensics—to artificially reconstruct the separation of generation and acceptance.&lt;/p&gt;

&lt;p&gt;Under repo-truth conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;test / lint / audit&lt;/code&gt; functions more like measurement.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;owner doc / plan / closure&lt;/code&gt; functions more like constraints.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;logs / bugs / discussions&lt;/code&gt; functions more like trajectory records and externalized memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Three Most Common Ontological Confusions
&lt;/h2&gt;

&lt;p&gt;First, &lt;strong&gt;mistaking the attractor for a boundary.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Boundaries answer "what cannot be done," and violating them causes an error immediately. Attractors answer "where the system should converge in the long run." A single violation may not cause an error, but persistent deviation causes structural decay. Boundaries define forbidden zones; attractors define stability zones. Confusing the two downgrades the attractor to a stricter guardrail, missing its core capability of handling "stability under perturbation."&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;mistaking the attractor for a stronger guardrail.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Guardrails operate at the execution layer (checked for each action), while attractors operate at the direction layer (whether the accumulation of multiple actions trends toward it). Understanding it as stricter governance, denser constraints, or stronger auditing still reduces the primary problem to the control layer. The root of this reduction is the failure to recognize that the two belong to different levels.&lt;/p&gt;

&lt;p&gt;Third, &lt;strong&gt;mistaking the attractor for another way of saying "control target."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The phrase &lt;code&gt;control target&lt;/code&gt; seems very close, but it assumes that a control framework is already in place. Under a trajectory ontology, the attractor's role is to &lt;strong&gt;provide the final cause for control&lt;/strong&gt;—it is prior to control, not within it. If the attractor is not defined first, so-called control has no target, and mechanisms like harness, guardrail, verification, and audit have no unified meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. In the nop-chaos-flux Repository, the Attractor Is First and Foremost &lt;code&gt;docs/architecture/&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If the attractor remains only at an abstract level, it has no real engineering significance. For &lt;code&gt;nop-chaos-flux&lt;/code&gt;, what first bears the attractor is the &lt;strong&gt;owner-doc system with precedence within &lt;code&gt;docs/architecture/&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this repository, the engineering landing point is clear: the specification definitions under &lt;code&gt;docs/architecture/&lt;/code&gt; come first, followed by convergence mechanisms like plan, verification, audit, and logs.&lt;/p&gt;

&lt;p&gt;Within &lt;code&gt;docs/architecture/&lt;/code&gt;, this "equation layer" also has a clear precedence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/README.md&lt;/code&gt; is responsible for explaining the architecture hierarchy and reading order.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux-design-principles.md&lt;/code&gt; handles the direction layer, explaining design intent and stable principles.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;frontend-programming-model.md&lt;/code&gt; handles the top-level specification layer, defining primitive identity, macro boundaries, and hard invariants.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux-core.md&lt;/code&gt; handles the current codebase-wide baseline.&lt;/li&gt;
&lt;li&gt;Narrower architecture docs define local contracts within their respective topics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;code&gt;nop-chaos-flux&lt;/code&gt;, the structural layer of the attractor is not an abstract "correct architecture," but is defined by a small number of high-value invariants: the closed set of seven primitives, the compile-first pipeline, the Template/Instance separation, Data/Capability orthogonality, the unified renderer/hook contract, and the dependency direction &lt;code&gt;flux-core → flux-formula → flux-compiler → flux-action-core → flux-runtime → flux-react&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These are not parallel pieces of governance material; they are structural equations fixed by owner docs. The value of architecture lies not in describing everything, but in making wrong structures unable to continue existing legitimately.&lt;/p&gt;

&lt;p&gt;It is precisely for this reason that many truly important convergence actions in this repository end up manifesting as "a certain old structure being excluded from the legitimate state space."&lt;/p&gt;

&lt;p&gt;The final removal of &lt;code&gt;CompiledSchemaNode&lt;/code&gt; is a typical example. It was not merely a refactoring cleanup; it demonstrated that once the new baseline of template/instance separation was established, the old intermediate structure, though still functional, no longer belonged to the correct structure and was thus excluded.&lt;/p&gt;

&lt;p&gt;Similarly, the three-way split of &lt;code&gt;flux-compiler&lt;/code&gt; / &lt;code&gt;flux-action-core&lt;/code&gt; / &lt;code&gt;flux-runtime&lt;/code&gt; is not simply a matter of "extracting two more packages," but a case where the attractor became more precise: the system was not just "able to run," but was further converged into a more stable responsibility structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What Is Harness
&lt;/h2&gt;

&lt;p&gt;If the attractor solves "what is the direction," then harness solves:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to continuously measure, correct, and update the system's trajectory through local signals.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The term "harness" here does not mean the narrow testing harness, but a broader execution scaffold. It typically includes: context routing, separation of implementation and acceptance, planning and closure conditions, verification mechanisms, audit mechanisms, diagnostic tools, and externalized memory.&lt;/p&gt;

&lt;p&gt;In this repository, at least five layers of harness can be seen:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Routing Harness
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/index.md&lt;/code&gt; and &lt;code&gt;docs/architecture/README.md&lt;/code&gt; determine: what to read first for a given problem, what is the current baseline, and what is merely analysis, plan, or history.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Plan Harness
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/plans/&lt;/code&gt; addresses "how this round of expansion closes," not "what the system is."&lt;/p&gt;

&lt;p&gt;Fields like &lt;code&gt;current baseline&lt;/code&gt;, &lt;code&gt;goals / non-goals&lt;/code&gt;, &lt;code&gt;exit criteria&lt;/code&gt;, &lt;code&gt;validation checklist&lt;/code&gt;, and &lt;code&gt;closure audit evidence&lt;/code&gt; define how a local trajectory can be effectively closed.&lt;/p&gt;

&lt;p&gt;After Plan 145's closure/audit, the newly confirmed follow-ups were broken out into Plan 146. Plan 143's closure assumptions were repeatedly overturned by fresh audits until the live repo truly crossed the line and closure was allowed. Plans here are not a to-do list, but a local convergence mechanism—they don't just list "what needs to be done now," but stipulate where this round of expansion must close, what exit criteria must be met, and what independent evidence closure requires.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verification Harness
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lint&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;typecheck&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt; push high-frequency, clear, automatable deviation detection to the machine layer ahead of time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Audit Harness
&lt;/h3&gt;

&lt;p&gt;Not all deviations can be caught by automated rules. Higher-level semantic drift, structural bias, false completion, and problems that are locally self-consistent but globally distorted still require independent auditing.&lt;/p&gt;

&lt;p&gt;Auditing itself is also a closed loop: discover deviation points, filter out conflicts and false problems, and return to the live repo for confirmation. The focus of high-quality auditing is not to pile up more problems, but to eliminate invalid problems as quickly as possible.&lt;/p&gt;

&lt;p&gt;In this repository, one of the most critical harness rules is: &lt;strong&gt;never let the same context serve as both implementer and completion judge.&lt;/strong&gt; Completion must be re-evaluated against the live repo by a fresh session or independent audit. The reason the closures of Plan 143 and Plan 145 carry weight is precisely because "completion" is not self-reported by the implementer, but comes from an independent convergence judgment.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Memory Harness
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/logs/&lt;/code&gt;, &lt;code&gt;docs/bugs/&lt;/code&gt;, &lt;code&gt;docs/discussions/&lt;/code&gt; constitute cross-session externalized memory.&lt;/p&gt;

&lt;p&gt;This layer is especially important because for AI, "why that understanding is invalid" is itself part of the system's memory. It is often insufficient to retain only the final conclusion; you must also retain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which premise has been falsified&lt;/li&gt;
&lt;li&gt;Which path has been proven to diverge&lt;/li&gt;
&lt;li&gt;Which terminological translation degrades the problem&lt;/li&gt;
&lt;li&gt;Which "completed" judgment was later overturned by the live repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this memory harness, the system loses a portion of its historical trajectory information each time.&lt;/p&gt;

&lt;p&gt;True closed-loop is not "define the attractor once, then execute harness forever," but "define attractor → expand → correct → update attractor → expand again." The three-way split of &lt;code&gt;flux-compiler&lt;/code&gt; / &lt;code&gt;flux-action-core&lt;/code&gt; / &lt;code&gt;flux-runtime&lt;/code&gt; is an example of the attractor being refined by practice before continuing expansion.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Why a New Attractor Is Usually Not Evolved by AI on Its Own
&lt;/h2&gt;

&lt;p&gt;Even with harness in place, you cannot expect AI to slowly evolve a new attractor on its own through high-speed iteration.&lt;/p&gt;

&lt;p&gt;At least under the training distribution and biases of current mainstream models, this generally cannot be expected to happen naturally.&lt;/p&gt;

&lt;p&gt;To be more specific:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current mainstream AI excels at high-speed expansion and convergence around an existing attractor.&lt;/li&gt;
&lt;li&gt;However, it typically falls back to the average solution it has seen.&lt;/li&gt;
&lt;li&gt;Truly novel conceptual decompositions, boundary redefinitions, and architectural languages still require a human to propose first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The responsibility for defining a new attractor cannot be silently outsourced to AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In large-scale framework development, the division of labor between humans and AI cannot be simplified to "AI writes code, humans do review." The more realistic division is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Humans define new attractors.&lt;/li&gt;
&lt;li&gt;AI performs high-speed expansion around the defined attractor.&lt;/li&gt;
&lt;li&gt;Harness continuously pulls the trajectory back on track.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Concepts like the separation of &lt;code&gt;ActionScope&lt;/code&gt; and &lt;code&gt;Data Scope&lt;/code&gt;, or lexical scoping—concepts that genuinely change the system's structural language—cannot grow by letting AI freely sample average solutions. They are new attractors that must be proposed first; only then can AI perform large-scale expansion on the new baseline.&lt;/p&gt;

&lt;p&gt;A limitation must be acknowledged: &lt;strong&gt;this means the effectiveness of this methodology depends on the presence of people within the team capable of defining attractors.&lt;/strong&gt; This is not a weakness of the methodology, but a fact it correctly identifies—architectural judgment is a scarce resource. In traditional collaboration, this judgment could partially reside in the architect's mind, transmitted through oral tradition and code review. AI has no cross-session memory; any architectural judgment not explicitly externalized does not exist for AI. The engineering contribution of this methodology is precisely to externalize this scarce resource into a &lt;strong&gt;versionable, auditable, inheritable repository structure&lt;/strong&gt; so that it does not have to leave with the individual. However, if no one on the team can make such judgments at all, the methodology cannot generate them out of thin air.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;p&gt;The truly difficult part of large-scale AI development is not getting AI to write more code, but ensuring the system continues to converge toward the correct structure during high-speed expansion.&lt;/p&gt;

&lt;p&gt;This convergence problem has &lt;strong&gt;no positive object&lt;/strong&gt; in traditional methodologies where state is the first-class citizen—it can only be indirectly acknowledged through negative terms like "debt," "fragility," and "corrosion." For the convergence problem to become a first-class citizen object that can be expressed, discussed, and engineered, the methodology must incorporate trajectory into its foundational categories.&lt;/p&gt;

&lt;p&gt;Whoever proposes a new attractor defines the structural baseline for the system's subsequent evolution.&lt;/p&gt;

&lt;p&gt;Compressing this methodology to its core, only one line remains:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State Space → Attractor → Trajectory → Control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not a more complex engineering process; it is a more fundamental engineering conceptual structure. Only with a structure defining where the system should converge in the long run can there be a judgment of whether the trajectory has deviated; only with a judgment of trajectory deviation can the subsequent harness, guardrail, verification, audit, and closure have a unified meaning.&lt;/p&gt;

&lt;p&gt;In the age of AI, what is truly scarce is not more agents that can write code, but people who can first answer the question, "Where should the system converge?"&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;nop-chaos-flux is open source:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-chaos-flux" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>aigc</category>
      <category>programming</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>From Spec-Driven Development to Attractor-Guided Engineering</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Thu, 21 May 2026 11:52:48 +0000</pubDate>
      <link>https://dev.to/canonical/from-spec-driven-development-to-attractor-guided-engineering-134i</link>
      <guid>https://dev.to/canonical/from-spec-driven-development-to-attractor-guided-engineering-134i</guid>
      <description>&lt;p&gt;&lt;code&gt;nop-chaos-flux&lt;/code&gt; is a low-code runtime framework built on React 19, Zustand 5, and Vite 8. It is inspired by Baidu AMIS but independently implemented from scratch based on innovative design principles. It includes a JSON Schema compiler and runtime, as well as design tools such as a report designer and Flow Designer.&lt;/p&gt;

&lt;p&gt;The initial version of this project was completed by a single programmer in two months, developed entirely through AI automation. Unlike typical AI-assisted development, as features were continuously added, the project did not suffer from quality degradation. Instead, module boundaries became clearer, document categorization more stable, testing and auditing increasingly captured real issues, and code quality continuously improved.&lt;/p&gt;

&lt;p&gt;I recently gave some internal sharing sessions and named this practice Attractor-Guided Engineering (AGE). Later, during code reviews, I found that many people did not truly understand it. Some operated in a way close to casual vibe coding, while others adopted a spec-driven development style similar to OpenSpec, leaning overall toward task-driven, feature-by-feature development. As the workload accumulated, inconsistencies in the code steadily built up, and deviations from the architectural design became the norm.&lt;/p&gt;

&lt;p&gt;This article analyzes the differences between AGE and spec-driven development, and what ordinary business projects can learn from the large-scale AI engineering practices of &lt;code&gt;nop-chaos-flux&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Hierarchy
&lt;/h2&gt;

&lt;p&gt;At the heart of AGE lies the following conceptual hierarchy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State Space → Attractor → Trajectory → Control&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State Space&lt;/strong&gt;: All possible implementation states the system can evolve into under current constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attractor&lt;/strong&gt;: The stable structure to which the system is repeatedly pulled back during long-term evolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trajectory&lt;/strong&gt;: The actual evolutionary path preserved after each round of generation, verification, and correction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control&lt;/strong&gt;: Various mechanisms that continuously influence the trajectory through local signals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All possible combinations of code, documentation, and tests that the repository could evolve into under existing constraints constitute the state space. The continuous actions of humans, AI, review, CI, and document updates form the evolutionary rules. The live repo history created by the superposition of the two is the trajectory. The attractor is the stable structure to which the system is repeatedly pulled back over long-term iteration.&lt;/p&gt;

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

&lt;p&gt;Large-scale AI development is essentially a controlled convergence problem for a dynamical system. AI expands the state space extremely fast. The key is not to add guardrails everywhere, but to first figure out: what structure should the system be pulled back to over the long term?&lt;/p&gt;

&lt;p&gt;An attractor is not a fully written-out end point, not a roadmap, and not a "scope of permitted activity." It is a structure implicitly defined by a small set of high-order constraints: local implementations can vary, but the whole will be pulled back to the same type of form by these relationships.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;nop-chaos-flux&lt;/code&gt;, what first defines the attractor is not the plan, lint, test, audit, or any single spec file, but the architecture docs with precedence under &lt;code&gt;docs/architecture/&lt;/code&gt;. In the following text, these architecture docs with owner and precedence are referred to as owner docs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docs/architecture/README.md&lt;/code&gt; explicitly states: &lt;code&gt;docs/architecture/&lt;/code&gt; is the current final-state architecture baseline, &lt;code&gt;flux-design-principles.md&lt;/code&gt; is the governing-principles anchor, &lt;code&gt;frontend-programming-model.md&lt;/code&gt; holds the top-level primitives and core-boundary precedence, and other normative docs hold local precedence within their respective topics.&lt;/p&gt;

&lt;p&gt;These documents do not enumerate all correct implementations. They define a stable structure like an equation: what primitives exist, which dependency directions are legal, which owner boundaries must not be broken, and which old patterns no longer belong to the correct state space. They first define the cluster of states that can sustainably exist, so that subsequent implementation, testing, planning, and auditing have a reference.&lt;/p&gt;

&lt;p&gt;Plan, verification, audit, logs, bugs, testing all come later. They are not the attractor itself, but the harness that keeps the system trajectory continuously close to the attractor.&lt;/p&gt;

&lt;p&gt;Flux/AGE is not centered on spec evolution, but on attractor definition and trajectory convergence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Development History
&lt;/h2&gt;

&lt;p&gt;"Architecture docs define the attractor" might sound like ordinary document governance at first, but the difference becomes clear if you carefully examine the actual development records in &lt;code&gt;docs/logs/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, &lt;code&gt;docs/plans/371-deep-audit-2026-05-19-owner-routing-plan.md&lt;/code&gt; is a typical entry point. It does not directly change the code, but converges the &lt;code&gt;64&lt;/code&gt; retained findings from the &lt;code&gt;2026-05-19&lt;/code&gt; deep audit into an owner-routing baseline. Each finding has a unique owner bucket, priority, successor plan, and owner-doc obligation. No ownerless items, no multiply-owned items, no silent downgrade to vague follow-ups.&lt;/p&gt;

&lt;p&gt;Its role is to first freeze how a round of deviations should be resolved, after which the subsequent execution plans close the local trajectory to concrete outcomes. &lt;code&gt;docs/plans/382-deep-audit-2026-05-19-table-and-crud-owner-state-and-event-contract-plan.md&lt;/code&gt; resolves the table/CRUD owner state and event payload: &lt;code&gt;Current Baseline&lt;/code&gt; declares the live status of explicit empty-array owner state and event payload, execution items fix the empty-array fallback, focused tests prove the result, &lt;code&gt;docs/components/table/design.md&lt;/code&gt; and &lt;code&gt;docs/components/crud/design.md&lt;/code&gt; synchronize the owner contract, and finally repo-wide &lt;code&gt;pnpm typecheck&lt;/code&gt;, &lt;code&gt;pnpm build&lt;/code&gt;, &lt;code&gt;pnpm lint&lt;/code&gt;, &lt;code&gt;pnpm test&lt;/code&gt; all pass, with the independent closure audit &lt;code&gt;ses_1bd9ed593ffeVpkho4lb4wPR6p&lt;/code&gt; recording &lt;code&gt;Verdict: acceptable&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docs/plans/388-deep-audit-2026-05-19-form-tree-widget-accessibility-plan.md&lt;/code&gt; demonstrates another type of closure: visible node roving focus, &lt;code&gt;ArrowUp&lt;/code&gt;/&lt;code&gt;ArrowDown&lt;/code&gt;/&lt;code&gt;Home&lt;/code&gt;/&lt;code&gt;End&lt;/code&gt; navigation, loading &lt;code&gt;aria-busy&lt;/code&gt;/&lt;code&gt;aria-describedby&lt;/code&gt; for input-tree and tree-select all have focused proof, but the plan explicitly rules &lt;code&gt;No owner-doc update required&lt;/code&gt;. This shows that a plan is not just a to-do list; it is also responsible for judging whether this change modifies the owner-doc baseline.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docs/plans/400-deep-audit-2026-05-19-test-harness-reliability-plan.md&lt;/code&gt; and &lt;code&gt;docs/bugs/62-e2e-shared-websocket-error-suppression-fix.md&lt;/code&gt; demonstrate the role of memory harness. The problem was not a business function failure, but that the E2E shared fixture's filter scope was too broad, filtering out real transport/runtime failures as well. The fix not only changes the code, but also adds &lt;code&gt;tests/e2e/fixtures-hard-gate.spec.ts&lt;/code&gt; to prove it now fails, and records a rule in the bug note: if future tests genuinely expect a WebSocket failure, a per-test allowance must be used, and fixture-wide suppression must not be restored.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docs/logs/2026/05-19.md&lt;/code&gt; and &lt;code&gt;docs/logs/2026/05-20.md&lt;/code&gt; are not mere daily logs. They record the focused proof of each closure slice, owner-doc rulings, repo-wide gates, independent audits, and full-green baselines.&lt;/p&gt;

&lt;p&gt;These materials form a real chain: owner docs define the long-term structure, audits discover deviations, plans route and freeze ownership, focused proof demonstrates local results, owner-doc rulings decide whether to update, logs/bugs/testing preserve cross-session memory, and closure audits re-judge completion status from the live repo.&lt;/p&gt;

&lt;p&gt;This is the harness in AGE. The goal is not to make each task appear more complete, but to make the system trajectory continuously return to the vicinity of the attractor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where OpenSpec's Structure Excels
&lt;/h2&gt;

&lt;p&gt;OpenSpec is a representative spec-driven development framework that structures a category of work well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;openspec/specs/&lt;/code&gt; stores the behavioral specifications of current capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openspec/changes/&lt;/code&gt; stores proposed changes, including &lt;code&gt;proposal.md&lt;/code&gt; (why change, what changes, impact), &lt;code&gt;design.md&lt;/code&gt; (technical design when necessary), and &lt;code&gt;tasks.md&lt;/code&gt; (implementation checklist).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;changes/&amp;lt;name&amp;gt;/specs/&lt;/code&gt; records spec deltas using &lt;code&gt;ADDED/MODIFIED/REMOVED/RENAMED&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Archive applies the deltas back to the main specs through fixed rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mechanism lowers the cost of updating specifications. OpenSpec does not require the AI to freely understand the entire requirement and then arbitrarily modify documents each time. Instead, it uses fixed sections, requirement header matching, and delta application to merge structured changes back into the main specs. This approach is well-suited for scenarios where behavioral specifications are clear and need to be parseable, archivable, and re-writable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where OpenSpec Is Limited
&lt;/h2&gt;

&lt;p&gt;OpenSpec's spec format (Requirement, Scenario, SHALL/MUST, delta sections) is tool-parseable friendly, but is not flexible enough as a way to organize general project knowledge.&lt;/p&gt;

&lt;p&gt;A lot of repository knowledge does not naturally grow into requirement/scenario form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture hierarchy and precedence.&lt;/li&gt;
&lt;li&gt;History of terminology misunderstandings.&lt;/li&gt;
&lt;li&gt;External research materials (PPT, discussion records).&lt;/li&gt;
&lt;li&gt;Analysis conclusions from a source code audit.&lt;/li&gt;
&lt;li&gt;Phenomena discovered through manual testing.&lt;/li&gt;
&lt;li&gt;The elimination path of a complex bug.&lt;/li&gt;
&lt;li&gt;Why a plan cannot be closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If everything must first be translated into a spec/change to gain an official place, the conversion cost is high, and the original context is also lost. External documents, discussion records, analysis reports, and bug retrospectives could directly become repository memory. Forcing them into requirement/scenario format tends to flatten the information.&lt;/p&gt;

&lt;p&gt;In terms of execution verification, the two reflect different tool philosophies. OpenSpec's &lt;code&gt;tasks.md&lt;/code&gt; is a checklist; &lt;code&gt;/opsx:verify&lt;/code&gt; is an optional agent verification skill (requires manually enabling expanded workflows). &lt;code&gt;archive&lt;/code&gt; checks task status and prompts about risks, but can still proceed after user confirmation—strict closure is left to the team's own conventions.&lt;/p&gt;

&lt;p&gt;Flux plan, on the other hand, bakes independent closure audit in as a required step: you must start from the current baseline, write clear &lt;code&gt;Goals&lt;/code&gt;, &lt;code&gt;Non-Goals&lt;/code&gt;, execution items (each annotated with &lt;code&gt;Fix&lt;/code&gt;/&lt;code&gt;Decision&lt;/code&gt;/&lt;code&gt;Proof&lt;/code&gt;), and &lt;code&gt;Closure Gates&lt;/code&gt;; before marking &lt;code&gt;completed&lt;/code&gt;, an independent sub-agent or independent reviewer must go back to the live repo and perform a closure audit. &lt;code&gt;docs/plans/361-slot-contract-host-manifest-and-owner-doc-closure-plan.md&lt;/code&gt; puts together the current baseline, the finding ownership matrix, execution phases, closure gates, the deferred items that have been ruled on, and independent review evidence. This is not a checklist, but an execution contract that strictly defines closure conditions and requires independent audit. &lt;strong&gt;It emphasizes not what was done, but to what standard something counts as truly landed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Spec-Driven Easily Becomes Task-Oriented
&lt;/h2&gt;

&lt;p&gt;The default structure of spec-driven development easily pulls the attention of both humans and AI back to "how to complete this change."&lt;/p&gt;

&lt;p&gt;A change typically has a proposal, design, tasks, and delta specs. This is much better than verbal requirements, but it is naturally organized around one change: why change, what to change, how to do it, which checklist items are done. Over time, spec-driven development can easily become a more formal task dispatch system.&lt;/p&gt;

&lt;p&gt;This task orientation has a hidden risk: specs are updated, tasks are checked, archive is done, and both AI and humans get a strong sense of completion. But whether the system is truly closer to the long-term structure is not proven by the change itself. It must be verified by looking back at the architecture docs, the live repo, tests, logs, and independent audits.&lt;/p&gt;

&lt;p&gt;If one tries to long-term maintain specs to the level of precision in Flux, the cost is usually higher. What Flux maintains is not a single specification tree, but a set of repository memories with different responsibilities: architecture docs define the attractor, plans define local trajectory closure, logs record evolution, bugs preserve complex defect diagnosis, testing preserves manual findings, analysis preserves research judgments, and audit is responsible for looking back at the live repo. Cramming all of this into a spec/change structure incurs continuous conversion cost.&lt;/p&gt;

&lt;p&gt;Spec-driven can serve as a local harness within AGE to manage behavioral spec evolution. But it should not replace architecture docs, nor should it replace the separate repository memories of plan closure, logs, bugs, testing, and audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What If You Just Need to Look Up an Owner Doc?
&lt;/h2&gt;

&lt;p&gt;This reveals a fundamental difference between the two approaches.&lt;/p&gt;

&lt;p&gt;If, in Flux, you simply want to check the current owner contract of the renderer runtime, you can directly route from &lt;code&gt;docs/index.md&lt;/code&gt; to &lt;code&gt;docs/architecture/renderer-runtime.md&lt;/code&gt; and the relevant references. You do not need to create a change, do not need a proposal, do not need tasks, and do not need to rewrite the question into a spec delta.&lt;/p&gt;

&lt;p&gt;If it's just research, it might go into &lt;code&gt;docs/analysis/&lt;/code&gt;. If it's just a discovery from manual testing, it goes into &lt;code&gt;docs/testing/&lt;/code&gt; first. If it's a complex bug, it goes into &lt;code&gt;docs/bugs/&lt;/code&gt;. If it's an execution closure, then a plan is written. A stable baseline change then goes back to the owner doc.&lt;/p&gt;

&lt;p&gt;Flux's document organization is free but not arbitrary. Free means: it does not force all knowledge to first enter the same artifact workflow. Constraint means: each type of material has a clear responsibility and cannot arbitrarily compete for factual status.&lt;/p&gt;

&lt;p&gt;OpenSpec's organization is more structured. It is good at putting proposed behavioral changes into a change package and then writing spec deltas back to main specs. But general repository knowledge routing is not the main problem it aims to solve by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tasks Are Not Plans
&lt;/h2&gt;

&lt;p&gt;OpenSpec's &lt;code&gt;tasks.md&lt;/code&gt; does not correspond to Flux's &lt;code&gt;plans&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tasks.md&lt;/code&gt; at most corresponds to the execution checklist fragment inside a Flux plan, or the todo list of the current session. It can help AI avoid missing steps, but it does not answer these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the current live repo baseline?&lt;/li&gt;
&lt;li&gt;What is explicitly not being done this time?&lt;/li&gt;
&lt;li&gt;What evidence can prove it is truly complete?&lt;/li&gt;
&lt;li&gt;Which defects cannot be downgraded to follow-ups?&lt;/li&gt;
&lt;li&gt;Who independently verifies the completion status?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value of a Flux plan is not in "having more tasks," but in it being a closure contract for a local trajectory.&lt;/p&gt;

&lt;p&gt;So tasks are necessary for AI, but tasks are not the source of truth. &lt;code&gt;- [x]&lt;/code&gt; only indicates that the executor claims an item is complete. The real proof must return to the current code, tests, owner docs, and independent review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources of Change Go Beyond Spec Changes
&lt;/h2&gt;

&lt;p&gt;OpenSpec's path is very clear: organize behavioral spec evolution around specs and changes.&lt;/p&gt;

&lt;p&gt;Flux's sources of change are broader:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New requirements raised by users.&lt;/li&gt;
&lt;li&gt;Architectural drift discovered by reading source code.&lt;/li&gt;
&lt;li&gt;Owner boundary problems discovered by audits.&lt;/li&gt;
&lt;li&gt;Interaction problems exposed by testing issues.&lt;/li&gt;
&lt;li&gt;Historical regression risks recorded in bug notes.&lt;/li&gt;
&lt;li&gt;Design judgments derived from external research or analysis.&lt;/li&gt;
&lt;li&gt;A plan closure audit overturning a previous judgment of "completed."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These sources should not all be transformed into spec deltas first. They can first land in analysis, testing, bugs, logs, plans, or directly update architecture docs. Whether they ultimately need to become a behavioral contract depends on whether they are part of the long-term baseline.&lt;/p&gt;

&lt;p&gt;This is the significance of Flux's organizational freedom in documentation. Information from different sources first stops at different positions, rather than being shoved entirely into a single spec evolution channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Files-In, Files-Out Matters
&lt;/h2&gt;

&lt;p&gt;I have emphasized many times in sharing sessions that a best practice for AI-driven development is files-in, files-out. This is not just documentation fastidiousness—the attractor and the harness need a physical carrier.&lt;/p&gt;

&lt;p&gt;Files-in: do not leave input only in the chat window. Even if the content is messy, first write it to a requirements file, analysis file, or plan file, and then &lt;code&gt;@&lt;/code&gt; this file in OpenCode.&lt;/p&gt;

&lt;p&gt;Files-out: do not end with output just printed in the window. Important conclusions, analyses, plans, test records, bug diagnoses, and architectural constraints are all written into &lt;code&gt;docs/&lt;/code&gt;, categorized by responsibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture rules → &lt;code&gt;docs/architecture/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change closures → &lt;code&gt;docs/plans/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Execution trajectory → &lt;code&gt;docs/logs/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Manual testing findings → &lt;code&gt;docs/testing/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Complex defect diagnosis → &lt;code&gt;docs/bugs/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Research judgments → &lt;code&gt;docs/analysis/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not "write more documents." Once output is categorized and persisted, it enters the repository memory. The chat window is temporary context; files are the repository memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Is the Current Implementation Fact, Not the Only Fact
&lt;/h2&gt;

&lt;p&gt;Code is the source of truth for the current implementation. Types and tests protect the current behavior. The architecture owner docs with precedence define the attractor—the structure the system should converge to over the long term. Logs, bugs, analysis, and testing record the trajectory and externalize memory.&lt;/p&gt;

&lt;p&gt;These do not conflict. Conflicts arise in two situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When documents start regurgitating implementation details that easily rot.&lt;/li&gt;
&lt;li&gt;When the completed state of a document is taken as proof that the code is already correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenSpec's behavior-first boundary actually avoids the first problem to some extent: behavioral specs should write verifiable behavior, not internal implementation details. Flux further emphasizes the second problem: even if the document describes the correct behavior, it cannot replace the verification of the current repository. True closure must return to code, tests, owner docs, logs, and audit evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Difference
&lt;/h2&gt;

&lt;p&gt;What OpenSpec solves: how to use structured specs/changes/delta/archive to organize the update of behavioral specifications, focusing on the evolution flow of specs.&lt;/p&gt;

&lt;p&gt;What AGE solves: when AI rapidly expands the state space, how the system first defines an attractor, and then uses harnesses such as plan, verification, audit, logs, bugs, analysis, and testing to make the trajectory continuously converge.&lt;/p&gt;

&lt;p&gt;The two tools solve problems at different levels. OpenSpec's strength is the structured specification workflow. Flux/AGE's strength is using architecture owner docs with precedence to define the attractor, and then using free but responsibility-bounded document routing and a strict closure harness to make the repository converge over the long term.&lt;/p&gt;

&lt;p&gt;Moving from spec-driven development to Attractor-Guided Engineering is not moving from "writing specs" back to "not writing specs," but moving from "organizing changes into spec updates" toward "defining where the system should converge over the long term, and making every round of AI generation continuously pulled back by this structure."&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ordinary Projects Can Directly Adopt
&lt;/h2&gt;

&lt;p&gt;There is no need to copy the full governance of Flux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, files-in, files-out.&lt;/strong&gt; Write input into a file first before &lt;code&gt;@&lt;/code&gt;-ing it to AI; output goes into &lt;code&gt;docs/&lt;/code&gt;, not left only in the chat window. This step takes just a few minutes, but it gives AI traceable repository memory instead of relying on conversational context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, write an architecture document for the core business that defines the business attractor.&lt;/strong&gt; Do not write a code guide. Instead, write down the sources of truth, state transitions, ownership boundaries, and common misunderstandings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, write lightweight plans for complex changes.&lt;/strong&gt; Include the current baseline, goals, what is not being done, an execution checklist, proof items, and closure conditions. Before completion, have an independent session or independent reviewer re-verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, turn recurring problems into repository memory.&lt;/strong&gt; Manual issues go into testing, complex bugs go into bugs, research conclusions go into analysis, and high-frequency errors go into audit scripts.&lt;/p&gt;

&lt;p&gt;Specification updates are a necessary layer. System convergence still needs an attractor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nop-chaos-flux is open source:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-chaos-flux" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>aigc</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>NOP Chaos Flux Architecture Evolution: Rewriting from AMIS to a Modern Low-Code Runtime</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Tue, 19 May 2026 12:57:52 +0000</pubDate>
      <link>https://dev.to/canonical/nop-chaos-flux-architecture-evolution-rewriting-from-amis-to-a-modern-low-code-runtime-3nk2</link>
      <guid>https://dev.to/canonical/nop-chaos-flux-architecture-evolution-rewriting-from-amis-to-a-modern-low-code-runtime-3nk2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is based on the development logs under &lt;code&gt;docs/logs/2026/&lt;/code&gt; (2026-03-20 to 2026-05-03), sorting out the architectural decisions, module splits, performance optimizations, and platform evolution of the entire framework from zero to maturity. Each phase includes key code paths and document links for traceability.&lt;/p&gt;

&lt;p&gt;This article is a collation of historical evolution and implementation trajectory, not a current normative owner doc. For judgments involving current primitive boundaries, action execution model, resource publishing contracts, template instantiation, or package boundaries, the current owner docs and live code pointed to by &lt;code&gt;docs/architecture/README.md&lt;/code&gt; shall prevail.&lt;/p&gt;

&lt;p&gt;The "key path" filenames appearing in the text are recorded according to the repository state at that time; some paths may have been moved, split, or deleted today and should not be used as current entry indexes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Preface: Source of Design Ideas
&lt;/h2&gt;

&lt;p&gt;The core design ideas of Flux were not discovered gradually during implementation, but were established as early as the AMIS theory research phase. The two articles under &lt;code&gt;nop-entropy/docs/theory/amis/&lt;/code&gt; — &lt;a href="https://zhuanlan.zhihu.com/p/599773955" rel="noopener noreferrer"&gt;Why Baidu AMIS Framework is an Excellent Design&lt;/a&gt; and &lt;a href="https://zhuanlan.zhihu.com/p/601375558" rel="noopener noreferrer"&gt;Revisiting Baidu AMIS Framework and Declarative Programming&lt;/a&gt; — laid the theoretical foundation for the entire project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Env environment abstraction&lt;/strong&gt;: AMIS's &lt;code&gt;env&lt;/code&gt; object virtualizes all I/O operations, making &lt;code&gt;output = AmisPage(Input)&lt;/code&gt; possible. Flux's &lt;code&gt;RendererEnv&lt;/code&gt; is a modern implementation of this idea.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Api and value/function duality&lt;/strong&gt;: The Api object is a Ref encapsulation of remote async calls, essentially an asynchronous upgrade of &lt;code&gt;computed&lt;/code&gt;. Flux's Resource (&lt;code&gt;data-source&lt;/code&gt;) primitive directly inherits this idea.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data chain = lexical scope&lt;/strong&gt;: AMIS's data chain is essentially lexical scope lookup at the DSL level. Flux's &lt;code&gt;ScopeRef&lt;/code&gt; chain structure is a compile-time enhancement of this model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;xui:import&lt;/code&gt; action modularization&lt;/strong&gt;: The &lt;code&gt;xui:import&lt;/code&gt; attribute introduced by the Nop platform for AMIS injects external function libraries into the action system by lexical scope. Flux's &lt;code&gt;xui:imports&lt;/code&gt; + &lt;code&gt;ActionScope&lt;/code&gt; is a complete compile-time implementation of this mechanism.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declarative first&lt;/strong&gt;: From imperative DOM manipulation to reactive data binding to compiled artifact execution — each step increases the proportion of declarativeness. Flux's compile-first principle is the endpoint of this evolution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, the architectural evolution of Flux is not "discovering principles during design" but "systematically implementing established principles on a modern technology stack (React 19, Zustand, TypeScript 6.0)". The evolution history records split decisions, performance breakthrough bottlenecks, and contract refinements on the implementation path, not swings in design direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Most Fundamental Shift: From Runtime Interpretation to Compile-Time Execution
&lt;/h3&gt;

&lt;p&gt;The above principles answer "what to design"; the most fundamental implementation shift throughout the evolution is "how to execute":&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AMIS is essentially a runtime interpreter&lt;/strong&gt; — takes a JSON schema, reads and executes it on the fly. Data chain is looked up at runtime, actions are dispatched at runtime, validation is triggered at runtime, field visibility is judged at runtime. All design principles operate at the runtime level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flux inserts a compilation phase between DSL and runtime&lt;/strong&gt;, moving forward various categories of AMIS runtime behavior into compiled artifacts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AMIS Runtime Behavior&lt;/th&gt;
&lt;th&gt;Flux Compiled Artifact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime type judgment of values&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CompiledValueNode&lt;/code&gt; five static node types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime traversal of schema structure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TemplateNode&lt;/code&gt; immutable graph (compile once, instantiate multiple times)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime resolution of actions&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CompiledActionProgram&lt;/code&gt; / &lt;code&gt;CompiledActionNode&lt;/code&gt; IR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime wiring of host contracts&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CapabilityProjectionManifest&lt;/code&gt; compile-time visible and verifiable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime exposure of schema problems&lt;/td&gt;
&lt;td&gt;Compile-time diagnostics (unknown attributes, contract shape validation)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This shift was not completed at once but runs through the entire evolution process as the main thread: from value compilation (03-25) to template instantiation (04-07) to action pre-compilation (04-20) to compiler package extraction (04-21) — each step is a milestone on the same path of "moving runtime judgment forward to compile time". The final three-layer split of &lt;code&gt;flux-compiler&lt;/code&gt; / &lt;code&gt;flux-action-core&lt;/code&gt; / &lt;code&gt;flux-runtime&lt;/code&gt; is the physical form of this shift: the compiler is responsible for producing immutable artifacts, and the runtime only consumes and instantiates them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Phase 1: Core Concept Establishment and Package Structure Setup&lt;/li&gt;
&lt;li&gt;Phase 2: Flow Designer from Proof of Concept to Production-Grade&lt;/li&gt;
&lt;li&gt;Phase 3: Renaming, Styling System, and Component Migration&lt;/li&gt;
&lt;li&gt;Phase 4: Complex Renderers and Architecture Audit&lt;/li&gt;
&lt;li&gt;Phase 5: Code Audit and Quality Convergence&lt;/li&gt;
&lt;li&gt;Phase 6: Runtime Architecture Convergence and Performance Optimization&lt;/li&gt;
&lt;li&gt;Phase 7: Frontend Programming Model Finalization and In-depth Design&lt;/li&gt;
&lt;li&gt;Phase 8: Template Instantiation and Node Identity System&lt;/li&gt;
&lt;li&gt;Phase 9: Deep Audit, Performance Optimization, and Architecture Convergence&lt;/li&gt;
&lt;li&gt;Phase 10: Compiler Independence and Package Boundary Hardening&lt;/li&gt;
&lt;li&gt;Phase 11: Comprehensive Quality Convergence and Host Maturity&lt;/li&gt;
&lt;li&gt;Key Principles of Architectural Evolution&lt;/li&gt;
&lt;li&gt;Appendix: Timeline Overview&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Phase 1: Core Concept Establishment and Package Structure Setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-03-20 ~ 2026-03-23&lt;/p&gt;

&lt;p&gt;On 03-20, systematic bug analysis and first-round fixes of the early Flux runtime were completed (dual-state desynchronization, concurrent submit race, validation coverage, etc.). On the same day, &lt;code&gt;@nop-chaos/amis-debugger&lt;/code&gt; (later renamed &lt;code&gt;nop-debugger&lt;/code&gt;) was created, positioned from the start as an AI-first structured diagnostic tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Action Scope and Import Semantics
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/architecture/action-scope-and-imports.md&lt;/code&gt; established one of the most core conceptual layers of Flux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ScopeRef&lt;/code&gt;&lt;/strong&gt; is a pure data scope, only carrying data reads/writes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ActionScope&lt;/code&gt;&lt;/strong&gt; is a capability scope, carrying namespaced actions and imported library capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;xui:import&lt;/code&gt;&lt;/strong&gt; is declarative import semantics (order-independent, repeatable, deduplicated by normalized key), not execution order semantics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dispatch path is fixed as: &lt;code&gt;built-in → component:&amp;lt;method&amp;gt; → namespaced action&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Flow Designer Package Creation
&lt;/h3&gt;

&lt;p&gt;The two packages &lt;code&gt;@nop-chaos/flow-designer-core&lt;/code&gt; and &lt;code&gt;@nop-chaos/flow-designer-renderers&lt;/code&gt; were created in this phase. Core contains the pure graph runtime (&lt;code&gt;GraphDocument&lt;/code&gt;, &lt;code&gt;GraphNode&lt;/code&gt;, &lt;code&gt;GraphEdge&lt;/code&gt;, &lt;code&gt;DesignerConfig&lt;/code&gt;), and Renderers contains renderer definitions for &lt;code&gt;designer-page&lt;/code&gt;, &lt;code&gt;designer-field&lt;/code&gt;, &lt;code&gt;designer-canvas&lt;/code&gt;, &lt;code&gt;designer-palette&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 Collaborative Documentation System
&lt;/h3&gt;

&lt;p&gt;The complexity of Flow Designer gave birth to a layered documentation system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/flow-designer/design.md&lt;/code&gt; — target architecture&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/flow-designer/runtime-snapshot.md&lt;/code&gt; — current implementation snapshot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/flow-designer/collaboration.md&lt;/code&gt; — runtime collaboration boundaries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/architecture/flow-designer/canvas-adapters.md&lt;/code&gt; — canvas adapter boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key decision&lt;/strong&gt;: Split documentation into "target state" and "snapshot state" to avoid confusion between target architecture and current implementation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flux-runtime/src/action-runtime.ts&lt;/code&gt;, &lt;code&gt;packages/flow-designer-core/src/core.ts&lt;/code&gt;, &lt;code&gt;docs/architecture/action-scope-and-imports.md&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Phase 2: Flow Designer from Proof of Concept to Production-Grade
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-03-23 ~ 2026-03-27&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Canvas Bridge Pattern
&lt;/h3&gt;

&lt;p&gt;Introduced the &lt;code&gt;DesignerCardCanvasBridge&lt;/code&gt; contract, abstracting canvas interactions (select, delete, move, connect, reconnect, viewport sync) as bridge callbacks, allowing the card canvas and XYFlow canvas to share the same command adapter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Renderer UI Events → Bridge Callbacks → Command Adapter → Core Mutations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key decision&lt;/strong&gt;: Replacing the canvas renderer does not require reintroducing direct graph mutation paths. All mutations go through the shared command adapter.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Command Adapter
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;designer-command-adapter.ts&lt;/code&gt; introduced a target-side command normalization layer, providing a unified result shape of &lt;code&gt;ok&lt;/code&gt;/&lt;code&gt;snapshot&lt;/code&gt;/&lt;code&gt;data&lt;/code&gt;/&lt;code&gt;error&lt;/code&gt;/&lt;code&gt;reason&lt;/code&gt;. Both Provider and canvas bridge dispatch commands through this surface, avoiding fragmented semantic rejection logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Schema-Driven Designer
&lt;/h3&gt;

&lt;p&gt;Flow Designer completed the migration from hardcoded React components to JSON configuration-driven. Node/edge rendering is defined through the &lt;code&gt;body: SchemaInput&lt;/code&gt; field, allowing complex node appearances to be composed using AMIS schemas such as &lt;code&gt;flex&lt;/code&gt;, &lt;code&gt;container&lt;/code&gt;, &lt;code&gt;tpl&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;. &lt;code&gt;classAliases&lt;/code&gt; and &lt;code&gt;themeStyles&lt;/code&gt; enable theme customizability.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Production-Grade Visual Alignment
&lt;/h3&gt;

&lt;p&gt;Completed visual alignment with the &lt;code&gt;flow-editor-static.html&lt;/code&gt; prototype, unifying node two-line semantics, selection states, palette icon chips, quick action buttons, edge/label tokens, minimap anchor positions, etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flow-designer-renderers/src/canvas-bridge.tsx&lt;/code&gt;, &lt;code&gt;packages/flow-designer-renderers/src/designer-command-adapter.ts&lt;/code&gt;, &lt;code&gt;apps/playground/src/schemas/workflow-designer-schema.json&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Phase 3: Renaming, Styling System, and Component Migration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-03-25 ~ 2026-03-29&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 AMIS → Flux Renaming
&lt;/h3&gt;

&lt;p&gt;Comprehensively migrated package references and documentation from the AMIS namespace to the Flux namespace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;amis-schema&lt;/code&gt; → &lt;code&gt;flux-core&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amis-runtime&lt;/code&gt; → &lt;code&gt;flux-runtime&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amis-react&lt;/code&gt; → &lt;code&gt;flux-react&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amis-debugger&lt;/code&gt; → &lt;code&gt;nop-debugger&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Window global variables renamed from &lt;code&gt;__NOP_AMIS_*&lt;/code&gt; to &lt;code&gt;__NOP_FLUX_*&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2 flux-core Modular Split
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;packages/flux-core/src/index.ts&lt;/code&gt; (1183 lines) was split into a modular structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;types.ts&lt;/code&gt; (687 lines) — all type definitions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;validation-model.ts&lt;/code&gt; (174 lines) — validation model functions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils/object.ts&lt;/code&gt; — object utilities&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils/path.ts&lt;/code&gt; — path utilities&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils/schema.ts&lt;/code&gt; — schema utilities&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;constants.ts&lt;/code&gt; — constants&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.3 Styling System Established
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/architecture/styling-system.md&lt;/code&gt; established a TailwindCSS-first styling solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semantic attributes&lt;/strong&gt; (&lt;code&gt;direction&lt;/code&gt;, &lt;code&gt;gap&lt;/code&gt;, &lt;code&gt;align&lt;/code&gt;) as syntactic sugar for Tailwind classes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;classAliases&lt;/code&gt;&lt;/strong&gt; mechanism for reusable Tailwind class definitions, supporting nested alias expansion and scope inheritance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout renderers only emit marker classes&lt;/strong&gt; (&lt;code&gt;nop-container&lt;/code&gt;, &lt;code&gt;nop-flex&lt;/code&gt;), marker classes carry no visual styling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spacing explicitly declared in schema via &lt;code&gt;stack-*&lt;/code&gt;/&lt;code&gt;hstack-*&lt;/code&gt; aliases&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.4 shadcn/ui Migration
&lt;/h3&gt;

&lt;p&gt;Created &lt;code&gt;@nop-chaos/ui&lt;/code&gt; package, based on the shadcn/ui component library pattern (class-variance-authority + tailwind-merge + lucide-react), migrating the underlying layer from radix-ui to base-ui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Button, Input as first migrated components&lt;/li&gt;
&lt;li&gt;Gradually covering the full component set: Textarea, Checkbox, Switch, RadioGroup, Select, Dialog, Tabs, Table, Card, etc.&lt;/li&gt;
&lt;li&gt;First batch of renderers (Button, Input, Form) migrated to &lt;code&gt;@nop-chaos/ui&lt;/code&gt;, subsequent renderers follow in batches&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.5 RendererComponentProps Contract
&lt;/h3&gt;

&lt;p&gt;Established the &lt;code&gt;RendererComponentProps&lt;/code&gt; pattern that all renderers must follow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Source&lt;/th&gt;
&lt;th&gt;Provides&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;props.props&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compiled runtime values&lt;/td&gt;
&lt;td&gt;Schema-driven values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;props.meta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compiled metadata&lt;/td&gt;
&lt;td&gt;Control state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;props.regions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pre-compiled child render handles&lt;/td&gt;
&lt;td&gt;Render child fragments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;props.events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runtime event handlers&lt;/td&gt;
&lt;td&gt;Event binding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;props.helpers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stable runtime helpers&lt;/td&gt;
&lt;td&gt;dispatch, evaluate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3.6 FieldFrame and Renderer Wrapping Contract
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;FieldFrame&lt;/code&gt; component was introduced into the &lt;code&gt;flux-react&lt;/code&gt; layer to uniformly handle form label/error/hint wrapping. The &lt;code&gt;RendererDefinition.wrap&lt;/code&gt; flag lets &lt;code&gt;NodeRenderer&lt;/code&gt; automatically add labels and error displays for renderers that need field wrapping.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.7 Report Designer and Spreadsheet Migration
&lt;/h3&gt;

&lt;p&gt;Migrated four packages from &lt;code&gt;nop-chaos-next&lt;/code&gt; into the workspace (completed 03-25):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@nop-chaos/spreadsheet-core&lt;/code&gt; / &lt;code&gt;spreadsheet-renderers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@nop-chaos/report-designer-core&lt;/code&gt; / &lt;code&gt;report-designer-renderers&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Integrated workspace configuration (tsconfig references, path aliases, Vite aliases), fixed runtime/test issues, ensured all tests pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.8 testid and Architecture Consistency
&lt;/h3&gt;

&lt;p&gt;On 03-29, added the &lt;code&gt;testid&lt;/code&gt; field to &lt;code&gt;BaseSchema&lt;/code&gt;, propagated through the compilation→parsing pipeline, all production renderers apply &lt;code&gt;data-testid&lt;/code&gt; to the root element. On the same day, completed an architecture consistency audit, discovering issues such as implicit layout injection by renderers, validation trigger semantic drift, theme token naming drift, etc., and established a two-phase fix strategy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/ui/src/&lt;/code&gt;, &lt;code&gt;docs/architecture/styling-system.md&lt;/code&gt;, &lt;code&gt;packages/flux-react/src/field-frame.tsx&lt;/code&gt;, &lt;code&gt;packages/spreadsheet-renderers/src/&lt;/code&gt;, &lt;code&gt;packages/report-designer-renderers/src/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Phase 4: Complex Renderers and Architecture Audit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-03-28 ~ 2026-03-31&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Full shadcn/ui Migration
&lt;/h3&gt;

&lt;p&gt;On 03-28, completed the full migration of the shadcn/ui component library. The &lt;code&gt;@nop-chaos/ui&lt;/code&gt; package expanded to cover the full suite of components including Inputs/fields, Overlay, Layout/feedback, etc. Flow Designer, form renderers, code editor, etc., fully switched to shadcn/ui components.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Code Editor Package
&lt;/h3&gt;

&lt;p&gt;On 03-30, &lt;code&gt;@nop-chaos/flux-code-editor&lt;/code&gt; was created based on CodeMirror 6, unifying the expression editor and SQL editor. Features include: support for 8 languages, expression/SQL completion, expression validation, friendly name tagging, template mode, fullscreen toggle, light/dark themes. Subsequently on 03-31, SQL enhancements (formatting, snippet templates, variable panel, SQL execution result preview) were completed.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Condition Builder
&lt;/h3&gt;

&lt;p&gt;On 03-30, a complete &lt;code&gt;condition-builder&lt;/code&gt; renderer was implemented in &lt;code&gt;flux-renderers-form&lt;/code&gt;, supporting embedded/selector mode, AND/OR/NOT logic, field search, grouping, unique fields, nested groups, custom operators.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Word Editor Package
&lt;/h3&gt;

&lt;p&gt;On 03-31, &lt;code&gt;@nop-chaos/word-editor-core&lt;/code&gt; (framework-agnostic bridge layer with zero React dependencies + Store) and &lt;code&gt;@nop-chaos/word-editor-renderers&lt;/code&gt; (EditorCanvas, RibbonToolbar, FontControls, WordEditorPage) were created. Integrated &lt;code&gt;@hufe921/canvas-editor&lt;/code&gt; as the canvas rendering engine, with template expressions stored as hyperlinks. On the same day, completed Phase 1 basic editor integration and Phase 1~4 toolbar controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5 Architecture Audit
&lt;/h3&gt;

&lt;p&gt;On 03-31, conducted a comprehensive audit of core packages (flux-core, flux-runtime, flux-react, flux-formula, 3 renderer packages), analyzing approximately 32,000 lines of non-test source code. Findings: flux-core's design is correct (it is a base package containing shared pure utilities, not a pure types package), form-runtime has been decomposed into 10 sub-modules, and the dependency flow is clean.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/ui/src/&lt;/code&gt;, &lt;code&gt;packages/flux-code-editor/src/&lt;/code&gt;, &lt;code&gt;packages/word-editor-core/src/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Phase 5: Code Audit and Quality Convergence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-01 ~ 2026-04-03&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Code Audit Fix Plan (Plan #25)
&lt;/h3&gt;

&lt;p&gt;Executed 14 fixes covering 8 packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build hygiene&lt;/strong&gt;: Removed stale tsconfig include paths, created &lt;code&gt;scripts/verify-no-src-artifacts.mjs&lt;/code&gt; CI guard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logical correctness&lt;/strong&gt;: Fixed Flow Designer &lt;code&gt;allowMultiEdge&lt;/code&gt; logic error, unified &lt;code&gt;executeApiObject()&lt;/code&gt; request pipeline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defensive fixes&lt;/strong&gt;: Wrapped &lt;code&gt;NodeRenderer&lt;/code&gt; with &lt;code&gt;React.memo&lt;/code&gt;, added boundary protection for &lt;code&gt;evaluateArray&lt;/code&gt;/&lt;code&gt;evaluateObject&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance optimizations&lt;/strong&gt;: API cache LRU eviction, Proxy cache WeakMap&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Comprehensive Code Overhaul (Plan #27)
&lt;/h3&gt;

&lt;p&gt;Executed comprehensive code overhaul including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Render phase remains side-effect free&lt;/li&gt;
&lt;li&gt;Form path state &lt;code&gt;relatedPaths&lt;/code&gt; fix&lt;/li&gt;
&lt;li&gt;Extracted shared hook for form field controller&lt;/li&gt;
&lt;li&gt;Dynamic renderer API payload validation&lt;/li&gt;
&lt;li&gt;Changed root component registry from module-level mutable state to instance-level state&lt;/li&gt;
&lt;li&gt;Added change detection to &lt;code&gt;ScopeRef.merge()&lt;/code&gt; method&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 Data Source Redesign
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;DataSourceSchema&lt;/code&gt; removed the &lt;code&gt;body&lt;/code&gt; region, instead injecting data into the current scope. If &lt;code&gt;dataPath&lt;/code&gt; is set, the response is written to &lt;code&gt;scope[dataPath]&lt;/code&gt;; otherwise, the response is merged as a plain object into the current scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 useOwnScopeSelector Dual Hooks and Full Adoption of @nop-chaos/ui
&lt;/h3&gt;

&lt;p&gt;On 04-03, &lt;code&gt;flux-react&lt;/code&gt; exposed &lt;code&gt;useOwnScopeSelector()&lt;/code&gt; in parallel with the lexical &lt;code&gt;useScopeSelector()&lt;/code&gt;. Report Designer shell renderers migrated to the own-scope hook, consuming only fragment host data. On the same day, completed adoption migration of &lt;code&gt;word-editor-renderers&lt;/code&gt;, &lt;code&gt;report-designer-renderers&lt;/code&gt;, &lt;code&gt;spreadsheet-renderers&lt;/code&gt; to &lt;code&gt;@nop-chaos/ui&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5 Dependency and Lint Upgrades
&lt;/h3&gt;

&lt;p&gt;From 04-02 to 04-03, the workspace upgraded to &lt;code&gt;eslint-plugin-react-hooks&lt;/code&gt; &lt;code&gt;recommended-latest&lt;/code&gt; strict rule set (later deepened on 04-16 to React 19 strict lint baseline), completed Lucide React patch fixes, and cleaned up all build artifact leaks in &lt;code&gt;src/&lt;/code&gt; directories.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flux-runtime/src/request-runtime.ts&lt;/code&gt;, &lt;code&gt;packages/flux-renderers-data/src/data-source-renderer.tsx&lt;/code&gt;, &lt;code&gt;scripts/verify-no-src-artifacts.mjs&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Phase 6: Runtime Architecture Convergence and Performance Optimization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-04 ~ 2026-04-06&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Formily Comparative Analysis and Performance Direction
&lt;/h3&gt;

&lt;p&gt;Completed a detailed comparison with 10+ low-code platforms (AMIS, Formily, LowCode Engine, Appsmith, ToolJet, Retool, etc.). Core findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The reactivity model is the most critical shortcoming&lt;/strong&gt;: The current Pull Model triggers evaluation of O(number of nodes × number of expressions) on parent scope changes, whereas Formily's Push Model is O(number of dependents)&lt;/li&gt;
&lt;li&gt;Flux's AOT compilation, orthogonal scope design, and field metadata-driven compilation are unique architectural advantages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision&lt;/strong&gt;: Maintain Flux's compile-first general-purpose platform baseline, allowing only thin local capability extensions in the form subdomain&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 Dependency Tracking and Change Path Notification
&lt;/h3&gt;

&lt;p&gt;Implemented ScopeChange dependency tracking baseline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ScopeStore&lt;/code&gt; carries &lt;code&gt;ScopeChange&lt;/code&gt; (set of changed paths)&lt;/li&gt;
&lt;li&gt;Formula leaf evaluation refreshes dependency set after each successful run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NodeRenderer&lt;/code&gt; subscriptions gate metadata/property recomputation through dependency path intersection&lt;/li&gt;
&lt;li&gt;Later evolved into &lt;strong&gt;lexical root binding&lt;/strong&gt; model: dependency tracking converges to lexical roots like &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;row&lt;/code&gt;, &lt;code&gt;record&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.3 Source Registry and Reaction Runtime
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source Registry&lt;/strong&gt; (&lt;code&gt;source-registry.ts&lt;/code&gt;): &lt;code&gt;RendererRuntime&lt;/code&gt; exposes &lt;code&gt;registerDataSource(...)&lt;/code&gt;, sources are bucketed by &lt;code&gt;ScopeRef.id&lt;/code&gt;, the &lt;code&gt;data-source&lt;/code&gt; renderer is only responsible for registration/release lifecycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reaction Runtime&lt;/strong&gt; (&lt;code&gt;reaction-runtime.ts&lt;/code&gt;): &lt;code&gt;ReactionSchema&lt;/code&gt; supports &lt;code&gt;watch&lt;/code&gt;, &lt;code&gt;when&lt;/code&gt;, &lt;code&gt;immediate&lt;/code&gt;, &lt;code&gt;debounce&lt;/code&gt;, &lt;code&gt;once&lt;/code&gt;, reaction execution async scheduling occurs after writes stabilize&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-cascade protection&lt;/strong&gt;: Queued reaction triggers merge change paths by pending turn, self-cascading reactions hard-stop after a limited number of times&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.4 Action Control Flow Extensions
&lt;/h3&gt;

&lt;p&gt;The action system added &lt;code&gt;when&lt;/code&gt;/&lt;code&gt;parallel&lt;/code&gt;/&lt;code&gt;timeout&lt;/code&gt;/&lt;code&gt;retry&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;when&lt;/code&gt;: Precondition check, returns structured skip result if false&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parallel&lt;/code&gt;: &lt;code&gt;Promise.all&lt;/code&gt; parallel execution&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timeout&lt;/code&gt;: Structured timeout result, cancelable request-like actions participate in actual cancellation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;retry&lt;/code&gt;: Retry strategy with fixed attempts/fixed delay&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.5 Complex Renderer State Ownership
&lt;/h3&gt;

&lt;p&gt;On 04-05, the Table renderer introduced a &lt;code&gt;local&lt;/code&gt;/&lt;code&gt;controlled&lt;/code&gt; two-level state ownership model, extended to three levels on 04-06 with the addition of &lt;code&gt;scope&lt;/code&gt; mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;local&lt;/code&gt; (default) — internal renderer state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controlled&lt;/code&gt; — external schema/runtime driven&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scope&lt;/code&gt; (added 04-06) — reads/writes reactive state directly from the current rendering scope&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.6 Frontend Programming Model Documentation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/architecture/frontend-programming-model.md&lt;/code&gt; was established as the top-level architecture baseline document, defining Flux's seven core primitives (at that time the first primitive was still called Base Tree, officially renamed to Template on 04-21). The seven primitives are: Template (formerly Base Tree), ScopeRef, Value, Resource, Reaction, Capability, Host Projection.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.7 WorkbenchShell Extraction
&lt;/h3&gt;

&lt;p&gt;On 04-04, extracted the shared &lt;code&gt;WorkbenchShell&lt;/code&gt; React component from various designers into &lt;code&gt;packages/flux-react/src/workbench/&lt;/code&gt;. The page renderers of Flow Designer and Report Designer migrated from handwritten three-column layouts to the unified &lt;code&gt;WorkbenchShell&lt;/code&gt;. Shell is purely presentational, carrying no Flux scope or domain knowledge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flux-runtime/src/source-registry.ts&lt;/code&gt;, &lt;code&gt;packages/flux-runtime/src/reaction-runtime.ts&lt;/code&gt;, &lt;code&gt;packages/flux-runtime/src/action-runtime.ts&lt;/code&gt;, &lt;code&gt;packages/flux-react/src/workbench/workbench-shell.tsx&lt;/code&gt;, &lt;code&gt;docs/architecture/frontend-programming-model.md&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Phase 7: Frontend Programming Model Finalization and In-depth Design
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-06 ~ 2026-04-11&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This phase had parallel work with Phase 8 (Template Instantiation), with overlapping dates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  7.1 Programming Model Evolution Discussions
&lt;/h3&gt;

&lt;p&gt;After multiple rounds of in-depth discussions (8 rounds of discussion recorded in &lt;code&gt;docs/discussions/2026-04-06-programming-model-optimality-critique.md&lt;/code&gt;), finally established:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the seven primitives closed, do not introduce an alternative primitive system&lt;/li&gt;
&lt;li&gt;Understand &lt;code&gt;data-source&lt;/code&gt; as "registering a named dynamic value into scope"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; as the sole normalized publication path, &lt;code&gt;mergeToScope: true&lt;/code&gt; as the only special publication mode&lt;/li&gt;
&lt;li&gt;Action semantics (&lt;code&gt;when&lt;/code&gt; + &lt;code&gt;then&lt;/code&gt; + &lt;code&gt;onError&lt;/code&gt; + &lt;code&gt;parallel&lt;/code&gt;) already form a DAG at execution time&lt;/li&gt;
&lt;li&gt;Distinguish between "progressive authoring surface" and "DAG execution semantics"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.2 Action/API Convergence Construction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Renamed declarative request from &lt;code&gt;ApiObject&lt;/code&gt; to &lt;code&gt;ApiSchema&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type: 'source'&lt;/code&gt; as an action-based anonymous value consumption form&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data-source&lt;/code&gt; as the named/dispatch extension of &lt;code&gt;source&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Standardized built-in action naming to camelCase (&lt;code&gt;openDialog&lt;/code&gt;, &lt;code&gt;showToast&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.3 Validation System In-depth Design
&lt;/h3&gt;

&lt;p&gt;On 04-11, completed a unified validation design (&lt;code&gt;docs/analysis/2026-04-11-flux-validation-unified-design.md&lt;/code&gt;), covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;modelGeneration&lt;/code&gt; counter to track validation model replacements&lt;/li&gt;
&lt;li&gt;Async run identity quintuple (&lt;code&gt;ownerId&lt;/code&gt;, &lt;code&gt;modelGeneration&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;ruleId&lt;/code&gt;, &lt;code&gt;runGeneration&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Two lifecycle paths: owner-compatible model refresh vs. owner boundary change&lt;/li&gt;
&lt;li&gt;State retention rules: always reset materialized caches and async runs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.4 Form Linkage and Hidden Field Policy
&lt;/h3&gt;

&lt;p&gt;On 04-11, fully implemented the &lt;code&gt;HiddenFieldPolicy&lt;/code&gt; contract (Plan 67): &lt;code&gt;clearValueWhenHidden&lt;/code&gt;, &lt;code&gt;validatePath&lt;/code&gt; skipping, &lt;code&gt;notifyFieldHidden&lt;/code&gt;, 21 new tests.&lt;br&gt;
Constraint-based declarative linkage (&lt;code&gt;xui:linkage&lt;/code&gt;) compiled into existing node metadata/properties and validation flow.&lt;br&gt;
Field presentation snapshot (&lt;code&gt;effectiveDisabled&lt;/code&gt;/&lt;code&gt;effectiveRequired&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  7.5 Owner Status Model
&lt;/h3&gt;

&lt;p&gt;On 04-09, unified loading/pending/status as owner-specific read-only summaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal form expressions standardized to &lt;code&gt;$form&lt;/code&gt; binding&lt;/li&gt;
&lt;li&gt;Cross-form observers standardized to explicit &lt;code&gt;statusPath&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Surface owners (dialog/drawer) expose external read-only status via &lt;code&gt;statusPath&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.6 Component Documentation System and xui:imports Expression Projection
&lt;/h3&gt;

&lt;p&gt;On 04-07, established the &lt;code&gt;docs/components/&lt;/code&gt; component documentation system, each component directory carries &lt;code&gt;design.md&lt;/code&gt; + &lt;code&gt;example.json&lt;/code&gt;, distinguishing registered renderers from planned renderers. Component naming standardized to Flux native vocabulary rather than AMIS legacy names.&lt;/p&gt;

&lt;p&gt;On the same day, completed &lt;code&gt;xui:imports&lt;/code&gt; expression projection; import aliases can now be used in expressions as &lt;code&gt;$alias.method(...)&lt;/code&gt;, sharing the same import namespace provider mapping as the existing &lt;code&gt;namespace:method&lt;/code&gt; action dispatch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;docs/architecture/frontend-programming-model.md&lt;/code&gt;, &lt;code&gt;docs/architecture/api-data-source.md&lt;/code&gt;, &lt;code&gt;docs/architecture/action-scope-and-imports.md&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. Phase 8: Template Instantiation and Node Identity System
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-07 ~ 2026-04-08&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1 Template Instantiation Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docs/architecture/template-instantiation-and-node-identity.md&lt;/code&gt; established the architecture of "compile the template once, instantiate it multiple times at runtime":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cid&lt;/code&gt; is strictly a mount-time active node bridge ID&lt;/li&gt;
&lt;li&gt;Structure resolution belongs to the runtime-owned resolver&lt;/li&gt;
&lt;li&gt;Canonical runtime address as &lt;code&gt;NodeLocator = runtimeId + templateGraphId + templateNodeId + instancePath&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.2 Repeated Instance Identity Propagation
&lt;/h3&gt;

&lt;p&gt;Table row child rendering (cell, buttons, expanded) passes in &lt;code&gt;[{ repeatedTemplateId: 'table.row', instanceKey: rowKey }]&lt;/code&gt;, row child debug locator data can now see the real &lt;code&gt;instancePath&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.3 NodeRenderer Compatibility Migration
&lt;/h3&gt;

&lt;p&gt;Through Plan 40, gradually migrated &lt;code&gt;CompiledSchemaNode&lt;/code&gt; dependencies to &lt;code&gt;NodeInstance&lt;/code&gt;/&lt;code&gt;templateNode&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NodeFrameWrapper&lt;/code&gt; consumes &lt;code&gt;templateNode&lt;/code&gt; + explicit renderer &lt;code&gt;wrap&lt;/code&gt; metadata&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RendererComponentProps&lt;/code&gt; and &lt;code&gt;useCurrentNodeMeta()&lt;/code&gt; mirror &lt;code&gt;templateNode&lt;/code&gt; + optional &lt;code&gt;locator&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fragment/dialog ownership seams migrated to active-node-first fallback&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.4 Compiler-Integrated Diagnostics
&lt;/h3&gt;

&lt;p&gt;Plan 41 implemented compiler-integrated schema diagnostics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flux-core&lt;/code&gt; exposes a formal schema diagnostic contract&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CompileSchemaOptions&lt;/code&gt; carries diagnostic/validation policy&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RendererDefinition&lt;/code&gt; can contribute &lt;code&gt;schemaValidator&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Form and table renderers contributed renderer-owned schema validator checks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.5 BEM Migration Completed
&lt;/h3&gt;

&lt;p&gt;All internal &lt;code&gt;__&lt;/code&gt; markers cleaned up, field framework, code editor, spreadsheet/report designer, workbench areas migrated to &lt;code&gt;data-slot&lt;/code&gt;/&lt;code&gt;data-*&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;docs/architecture/template-instantiation-and-node-identity.md&lt;/code&gt;, &lt;code&gt;packages/flux-react/src/node-instance.ts&lt;/code&gt;, &lt;code&gt;packages/flux-runtime/src/node-resolver.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Phase 9: Deep Audit, Performance Optimization, and Architecture Convergence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-12 ~ 2026-04-20&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This phase was the highest-density convergence period of the entire project, with code changes, document audits, performance optimizations, and architectural decisions densely interwoven.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  9.1 Architecture Document Consistency Audit and Governance System Maturation
&lt;/h3&gt;

&lt;p&gt;On 04-12, completed the first full-scope architecture document consistency audit, checking all files under &lt;code&gt;docs/architecture/&lt;/code&gt; for consistency with code and with each other. Discovered cross-document conflicts (&lt;code&gt;Final Execution Schema&lt;/code&gt; wording, node identity model, &lt;code&gt;xui:imports&lt;/code&gt; boundaries, style contract drift, etc.), established a repair strategy sharded by document family.&lt;/p&gt;

&lt;p&gt;This phase also marked the formal maturation of Flux's unique development governance method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First write owner doc (target state architecture document)&lt;/li&gt;
&lt;li&gt;Then write execution plan&lt;/li&gt;
&lt;li&gt;Write daily log after execution&lt;/li&gt;
&lt;li&gt;Finally use an independent sub-audit to confirm closure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many subsequent Plans (73~121) followed this method.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2 Plan 82: Architecture Contract Implementation Convergence
&lt;/h3&gt;

&lt;p&gt;Plan 82 was the core convergence plan from 04-12 to 04-14, covering multiple parallel contract alignment threads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;xui:imports node lifecycle tightening&lt;/strong&gt; (Phase 5): The creation of &lt;code&gt;ActionScope&lt;/code&gt; for import declaration nodes and namespace registration began to separate from renderer policies; module loading deduplication and scope namespace lifecycle initially became independent. The final import-owned boundary was finalized in Plan 133 on 04-23 (see Phase 10, 10.3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surface family extraction&lt;/strong&gt; (Phase 5): dialog/drawer state extracted from &lt;code&gt;page.store&lt;/code&gt; into independent &lt;code&gt;SurfaceStore&lt;/code&gt;, &lt;code&gt;SurfaceRuntime&lt;/code&gt; became the unified owner for dialog/drawer/surface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value adaptation contract convergence&lt;/strong&gt; (Phase 6): &lt;code&gt;detail-field&lt;/code&gt;, &lt;code&gt;detail-view&lt;/code&gt;, &lt;code&gt;object-field&lt;/code&gt;, &lt;code&gt;array-field&lt;/code&gt;, &lt;code&gt;variant-field&lt;/code&gt; gradually aligned to shared value-adaptation helper and unified scope model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture narrowing decision&lt;/strong&gt;: After multiple rounds of implementation attempts, the architecture documentation clearly positioned &lt;code&gt;object-field&lt;/code&gt;, &lt;code&gt;array-field&lt;/code&gt;, &lt;code&gt;variant-field&lt;/code&gt; as inline live-edit controls (editing directly writes to parent form), only &lt;code&gt;detail-field&lt;/code&gt;/&lt;code&gt;detail-view&lt;/code&gt; retain staged owner semantics (confirm/cancel boundaries)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.3 ScopeRef Read-Write Separation and Per-Path Subscription
&lt;/h3&gt;

&lt;p&gt;From 04-14 to 04-15, performed a major refactoring of ScopeRef's core APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;read()&lt;/code&gt; → &lt;code&gt;readVisible()&lt;/code&gt; + &lt;code&gt;materializeVisible()&lt;/code&gt;&lt;/strong&gt; (Plan 89): &lt;code&gt;readVisible()&lt;/code&gt; uses the prototype chain to provide a lazy lexical view; &lt;code&gt;materializeVisible()&lt;/code&gt; is called only at explicit flattening boundaries (formula broad-access, debugger dump, request &lt;code&gt;includeScope: '*'&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-path fine-grained subscription&lt;/strong&gt; (Plan 90): &lt;code&gt;FormStore&lt;/code&gt; added a &lt;code&gt;subscribeToPath(path)&lt;/code&gt; mechanism; keystrokes on field A no longer wake subscribers of field B, achieving O(1) field-level invalidation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host Projection scope base&lt;/strong&gt; (Plan 87): &lt;code&gt;RendererRuntime.createHostProjectionScope(...)&lt;/code&gt; moved the read-only/write-protection boundary of host projection from React hooks into a shared runtime contract&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.4 Performance Optimization Series (Plans 100~110)
&lt;/h3&gt;

&lt;p&gt;On 04-16, executed an entire performance optimization plan series, from audit to per-package implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Playground loading and bundle boundaries&lt;/strong&gt; (Plan 102)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flux React hot path fixes&lt;/strong&gt; (Plan 103): &lt;code&gt;NodeRenderer&lt;/code&gt; &lt;code&gt;useSyncExternalStore&lt;/code&gt; selector stabilization, &lt;code&gt;ClassAliasesContext&lt;/code&gt; broadcast debouncing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formula runtime hot path&lt;/strong&gt; (Plan 104)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spreadsheet performance and virtualization&lt;/strong&gt; (Plan 105): &lt;code&gt;setCells()&lt;/code&gt; batch operations, grid virtualization (binary search for visible range), &lt;code&gt;requestAnimationFrame&lt;/code&gt; batch selection/fill/zoom&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime and form invalidation performance&lt;/strong&gt; (Plan 106): parallel field validation, &lt;code&gt;computeScopeState&lt;/code&gt; caching, &lt;code&gt;publishStatus&lt;/code&gt; skip unchanged updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collection renderer scalability&lt;/strong&gt; (Plan 107): table viewport-driven virtualization (threshold 50 rows, overscan 10), row scope cache changed from full clone to in-place mutation + generation counter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form field consumer performance&lt;/strong&gt; (Plan 108): &lt;code&gt;useBoundFieldValue()&lt;/code&gt; uses &lt;code&gt;UNUSED_VALUE&lt;/code&gt; sentinel selector to avoid inactive subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow Designer performance hygiene&lt;/strong&gt; (Plan 109): node synchronization reduced from O(n²) to O(n)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API request and cache hygiene&lt;/strong&gt; (Plan 110): source refresh O(1) name indexing, polling changed from &lt;code&gt;setInterval&lt;/code&gt; to &lt;code&gt;setTimeout&lt;/code&gt; chain&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.5 @nop-chaos/flux-renderers-form-advanced Split
&lt;/h3&gt;

&lt;p&gt;On 04-16, split 11 advanced renderers from &lt;code&gt;flux-renderers-form&lt;/code&gt; (~15,800 lines) into the new &lt;code&gt;@nop-chaos/flux-renderers-form-advanced&lt;/code&gt; package: condition-builder, variant-field, detail-view, detail-field, object-field, array-field, array-editor, tag-list, key-value, etc. &lt;code&gt;flux-renderers-form&lt;/code&gt; was reduced to ~3,000 lines. Dependency direction confirmed as form-advanced → form → basic (no cycles).&lt;/p&gt;

&lt;h3&gt;
  
  
  9.6 Capability Projection Manifest
&lt;/h3&gt;

&lt;p&gt;On 04-16, introduced the Capability Projection Manifest architecture (Plan 112), upgrading host protocols from runtime wiring conventions to compile-time visible and verifiable static contracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HostCapabilityProjectionManifest&lt;/code&gt; declares host projection fields and namespaced capability methods&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RendererDefinition.hostContract&lt;/code&gt; lets renderer definitions carry host contract metadata&lt;/li&gt;
&lt;li&gt;Flow Designer as the first pilot, declaring 30 &lt;code&gt;designer:*&lt;/code&gt; methods&lt;/li&gt;
&lt;li&gt;Compiler-integrated diagnostics: &lt;code&gt;validateActionShape()&lt;/code&gt; can now validate host action parameter shapes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.7 @nop-chaos/flux-i18n Internationalization Package
&lt;/h3&gt;

&lt;p&gt;On 04-17, created the &lt;code&gt;@nop-chaos/flux-i18n&lt;/code&gt; package, based on i18next and react-i18next, supporting zh-CN (default) and en-US. All translation keys use the &lt;code&gt;flux.&lt;/code&gt; prefix. Subsequently migrated hardcoded strings from packages like condition-builder, report-designer, code-editor, form-advanced to &lt;code&gt;t()&lt;/code&gt; calls, upgrading the ESLint &lt;code&gt;i18next/no-literal-string&lt;/code&gt; rule from &lt;code&gt;warn&lt;/code&gt; to &lt;code&gt;error&lt;/code&gt;, ensuring that new hardcoded strings cause build failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.8 ValueAdapter Unified Protocol
&lt;/h3&gt;

&lt;p&gt;On 04-20, &lt;code&gt;docs/architecture/value-adaptation-and-detail-field.md&lt;/code&gt; established &lt;code&gt;ValueAdapter&lt;/code&gt; as the canonical shared protocol (Plan 121):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple fields use declarative adapters: &lt;code&gt;stringAdapter()&lt;/code&gt;, &lt;code&gt;booleanStringAdapter()&lt;/code&gt;, array adapters&lt;/li&gt;
&lt;li&gt;Composite owners (object-field, variant-field) uniformly connect to &lt;code&gt;actionAdapter()&lt;/code&gt; for &lt;code&gt;transformInAction&lt;/code&gt; / &lt;code&gt;transformOutAction&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Staged helpers of detail-field/detail-view internally delegate to &lt;code&gt;actionAdapter()&lt;/code&gt;, keeping the public API unchanged&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ValueAdapter&lt;/code&gt; becomes the standard access method for new value-oriented fields, replacing JSX local type conversions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.9 CompiledSchemaNode Complete Elimination
&lt;/h3&gt;

&lt;p&gt;On 04-16, the compilation pipeline no longer passes through the &lt;code&gt;CompiledSchemaNode&lt;/code&gt; intermediate layer, directly generating &lt;code&gt;TemplateNode&lt;/code&gt; from &lt;code&gt;SchemaInput&lt;/code&gt;. &lt;code&gt;CompiledSchemaMeta&lt;/code&gt; and &lt;code&gt;CompiledNodeRuntimeState&lt;/code&gt; were demoted to type aliases. This cleanup simplified the compilation pipeline and eliminated an indirection layer that no longer held value after the template/instance separation landed.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.10 Renderers Contract Unified Static Metadata
&lt;/h3&gt;

&lt;p&gt;On 04-20 (Plan 117), added unified static contract fields to &lt;code&gt;RendererDefinition&lt;/code&gt;: &lt;code&gt;rendererClass&lt;/code&gt;, &lt;code&gt;rendererTraits&lt;/code&gt;, &lt;code&gt;propContracts&lt;/code&gt;, &lt;code&gt;eventContracts&lt;/code&gt;, &lt;code&gt;componentCapabilityContracts&lt;/code&gt;, &lt;code&gt;scopeExportContracts&lt;/code&gt;. &lt;code&gt;propContracts&lt;/code&gt; immediately participates in compiler unknown attribute checking; the remaining fields are reserved for tooling (Inspector, online editor). button, form, crud, designer-page served as the first pilots.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.11 Action Pre-compilation and Async Governance
&lt;/h3&gt;

&lt;p&gt;On 04-20 (Plans 119~120), pushed the action system into the compile phase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CompiledActionProgram IR&lt;/strong&gt;: &lt;code&gt;compileAction()&lt;/code&gt; compiles &lt;code&gt;ActionSchema&lt;/code&gt; to &lt;code&gt;CompiledActionProgram&lt;/code&gt;/&lt;code&gt;CompiledActionNode&lt;/code&gt;; the runtime executor no longer mixes raw schema execution paths internally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async governance convergence&lt;/strong&gt;: Shared &lt;code&gt;async-governance.ts&lt;/code&gt; base unified the run identity, stale publish gating, and debug diagnostics for three categories of async runtime owners: data-source, reaction, and async validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.12 Documentation Governance and Deep Audits
&lt;/h3&gt;

&lt;p&gt;From 04-12 to 04-19, multiple rounds of deep audits were produced (12 audit dimensions covering API surface, state ownership, reactivity precision, async safety, validation consistency, renderer contracts, style compliance, field slot modeling, lifecycle, etc.). After each audit, only true defects still reproducible in the current code were fixed, avoiding over-fixing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flux-core/src/value-adapter.ts&lt;/code&gt;, &lt;code&gt;packages/flux-runtime/src/async-governance.ts&lt;/code&gt;, &lt;code&gt;packages/flux-runtime/src/action-compiler.ts&lt;/code&gt;, &lt;code&gt;packages/flux-i18n/src/&lt;/code&gt;, &lt;code&gt;packages/flux-renderers-form-advanced/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  10. Phase 10: Compiler Independence and Package Boundary Hardening
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-21 ~ 2026-04-25&lt;/p&gt;

&lt;h3&gt;
  
  
  10.1 Compiler Package Extraction
&lt;/h3&gt;

&lt;p&gt;Extracted the &lt;code&gt;@nop-chaos/flux-compiler&lt;/code&gt; package from &lt;code&gt;flux-runtime&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema compilation/validation&lt;/li&gt;
&lt;li&gt;Action pre-compilation&lt;/li&gt;
&lt;li&gt;Compilation symbol table&lt;/li&gt;
&lt;li&gt;Diagnostics and validation lowering&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux-runtime&lt;/code&gt; briefly retained a compatibility re-export layer (removed in Plan 124 on 04-22; runtime side no longer holds any compiler code)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.2 Action Core Package Extraction
&lt;/h3&gt;

&lt;p&gt;On 04-22, further extracted the &lt;code&gt;@nop-chaos/flux-action-core&lt;/code&gt; package from &lt;code&gt;flux-runtime&lt;/code&gt;, with &lt;code&gt;ActionRuntimeAdapter&lt;/code&gt; becoming the unified action invocation boundary. By this step, Flux completed a three-layer split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flux-compiler&lt;/code&gt; responsible for "turning schema into executable artifacts"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux-action-core&lt;/code&gt; responsible for "action dispatching, control flow, and unified invocation exit"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux-runtime&lt;/code&gt; responsible for "connecting compiled artifacts with the host environment and holding lifecycle"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.3 Import Boundary Semantic Convergence
&lt;/h3&gt;

&lt;p&gt;On 04-23, the creation of &lt;code&gt;ActionScope&lt;/code&gt; for &lt;code&gt;xui:imports&lt;/code&gt; was separated from renderer policy into import-owned boundary semantics (Plan 133). Module loading deduplication and scope namespace registration operate independently; import lifecycle and compile-time diagnostics participate in the compilation pipeline, completing the second phase of the &lt;code&gt;ActionScope&lt;/code&gt; / &lt;code&gt;xui:imports&lt;/code&gt; model proposed in late March.&lt;/p&gt;

&lt;p&gt;On the same day, Plan 132 eliminated runtime fallback reads of raw &lt;code&gt;Schema&lt;/code&gt; objects — &lt;code&gt;DataSource&lt;/code&gt; and &lt;code&gt;Reaction&lt;/code&gt; fully migrated to compiled data; the runtime no longer holds uncompiled schemas. This is a direct manifestation of the compile-forward mainline.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.4 Base Tree → Template Renaming
&lt;/h3&gt;

&lt;p&gt;On 04-21, the first primitive of the programming model was renamed from &lt;code&gt;Base Tree&lt;/code&gt; to &lt;code&gt;Template&lt;/code&gt;, emphasizing its nature as a compile-time immutable program definition. &lt;code&gt;SchemaCompiler&lt;/code&gt; produces an immutable &lt;code&gt;TemplateNode&lt;/code&gt; graph; the runtime only consumes and instantiates.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.5 Data Domain Owner Architecture
&lt;/h3&gt;

&lt;p&gt;On 04-22, the &lt;code&gt;Data Domain Owner&lt;/code&gt; concept was formally elevated to an architecture baseline document (&lt;code&gt;docs/architecture/data-domain-owner.md&lt;/code&gt;). &lt;code&gt;object-field&lt;/code&gt;, &lt;code&gt;array-field&lt;/code&gt;, &lt;code&gt;variant-field&lt;/code&gt; aligned to the Data Domain Owner baseline — composite fields become explicit data domain owners, with clear value adaptation, validation coordination, and sub-scope lifecycle. This complements the staged owner semantics of &lt;code&gt;detail-field&lt;/code&gt;/&lt;code&gt;detail-view&lt;/code&gt;: two ownership models (inline live-edit vs. staged confirm/cancel boundaries) cover all composite field paradigms.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.6 DingFlow Tree Mode
&lt;/h3&gt;

&lt;p&gt;Introduced a structured process tree contract: nodes can have branch groups, branches implicitly merge, continuation flow enters the downstream &lt;code&gt;child&lt;/code&gt; of the owner node. In tree mode, free connections, free reconnections, and manual node dragging are disabled.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.7 CRUD Contract Finalization and Shared Context Menu
&lt;/h3&gt;

&lt;p&gt;The design and implementation of CRUD spanned multiple phases: component contract document completed on 04-12 (&lt;code&gt;docs/components/crud/design.md&lt;/code&gt;), entered implementation around 04-17, and completed interaction and contract finalization on 04-24 ~ 04-25:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD selection summary and refresh behavior stabilized&lt;/li&gt;
&lt;li&gt;Spreadsheet shared context menu baseline (copy, cut, paste, clear, insert/delete rows/columns)&lt;/li&gt;
&lt;li&gt;Double-click fill handle uses adjacent data region for auto-fill down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On 04-25, Plan 139 removed the &lt;code&gt;DataSourceSchema.api&lt;/code&gt; field; all remote calls are uniformly dispatched via &lt;code&gt;{ action: 'ajax', args: ... }&lt;/code&gt;. &lt;code&gt;ApiSchema&lt;/code&gt; is explicitly defined as a transport contract used internally by the &lt;code&gt;ajax&lt;/code&gt; action; author side no longer directly touches independent API definitions — the convergence from independent execution paths to unified action dispatch is completed here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flux-compiler/src/&lt;/code&gt;, &lt;code&gt;packages/flux-action-core/src/&lt;/code&gt;, &lt;code&gt;docs/architecture/flux-runtime-module-boundaries.md&lt;/code&gt;, &lt;code&gt;docs/architecture/capability-projection-manifest.md&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  11. Phase 11: Comprehensive Quality Convergence and Host Maturity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 2026-04-25 ~ 2026-05-03&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This phase was the second high-density convergence period after Phase 9 (04-12~04-20), but the focus shifted from "architecture contract alignment" to "comprehensive quality convergence" — performance audit, test institutionalization, adversarial security review, validation owner boundary precision, host tooling engineering. If Phase 9 answered "is the architecture right?", Phase 11 answered "is the implementation robust enough".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  11a. Performance Audit and Hot Path Optimization (04-26)
&lt;/h3&gt;

&lt;p&gt;Conducted in-depth performance audits on four hot paths: runtime, form, spreadsheet, report-designer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eliminated &lt;code&gt;JSON.stringify&lt;/code&gt; full-value comparisons&lt;/strong&gt;: Form &lt;code&gt;valuesPath&lt;/code&gt; publication used &lt;code&gt;JSON.stringify&lt;/code&gt; for change detection, incurring significant serialization overhead in high-field-count forms. Replaced with path-aware structural comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spreadsheet batch writes&lt;/strong&gt;: Batch operations like paste/cut changed from per-cell full Map cloning to &lt;code&gt;setCells()&lt;/code&gt; batch interface, eliminating O(n) immutable clone overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition-builder recursive structural equality&lt;/strong&gt;: Condition builder used &lt;code&gt;JSON.stringify&lt;/code&gt; for value comparison; replaced with recursive structural equality function, avoiding stringification overhead and key-order sensitivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path-aware form value subscription&lt;/strong&gt;: &lt;code&gt;useCurrentFormState&lt;/code&gt; added an optional &lt;code&gt;{ path: name }&lt;/code&gt; parameter; field-level subscribers are woken only when the specified path changes, eliminating cascading re-renders of unrelated fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full adoption in advanced form renderers&lt;/strong&gt;: Path-aware subscription extended to all advanced form renderers including object-field, array-field, detail-field, variant-field, array-editor, key-value, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11b. Test Coverage Institutionalization and Deep Audit (04-26 ~ 04-27)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Plan 143: Coverage threshold institutionalization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enforced 80% Vitest coverage thresholds in all core package configurations. Systematically closed coverage gaps in the following packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;flux-runtime, flux-react, flux-renderers-data&lt;/li&gt;
&lt;li&gt;flux-renderers-form, flux-renderers-form-advanced, flux-renderers-basic&lt;/li&gt;
&lt;li&gt;flux-formula&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;First 18-dimensional deep audit (04-27)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full-dimensional audit covering 24 packages, discovering 1 P0, 16 P1, 28 P2, 36 P3 issues. Audit dimensions included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture consistency, state ownership, async safety, reactivity precision&lt;/li&gt;
&lt;li&gt;Host contracts, test quality, accessibility, security&lt;/li&gt;
&lt;li&gt;Performance, boundary clarity, dependency direction, API surface stability&lt;/li&gt;
&lt;li&gt;Documentation synchronization, type safety, error handling, internationalization, observability, extensibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11c. Renderer Contract and Host Projection Convergence (04-26 ~ 04-30)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Plan 145: runtime/react/renderer hot spot boundary convergence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Extracted shared helper functions, established projected-owner scope base, CRUD owner bridging, Flow Designer page-shell/adapter split. Cross-package dependencies in renderer hot paths converged to explicit contracts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan 146: Domain-host projection and lexical convergence&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Word Editor real-time save vs. auto-save timing semantics clarified&lt;/li&gt;
&lt;li&gt;Report Designer standardized selection vocabulary&lt;/li&gt;
&lt;li&gt;Host projection interfaces of various domain designers aligned to a unified baseline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plan 144: Execution boundary diagnostics and host contract tooling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagnostic information carries source location, supporting precise jumping from runtime errors to schema definition locations&lt;/li&gt;
&lt;li&gt;Host contract manifest tooling, supporting automated contract checking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plan 150: &lt;code&gt;xui:actions&lt;/code&gt; — Schema-local named action chains&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introduced the &lt;code&gt;xui:actions&lt;/code&gt; attribute, allowing declaration of named action chains on schema nodes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;__xui_actions__&lt;/code&gt; synthetic namespace carries schema-local action definitions&lt;/li&gt;
&lt;li&gt;Lexical inheritance: child nodes inherit &lt;code&gt;xui:actions&lt;/code&gt; from the parent scope, sharing the same namespace resolution mechanism as &lt;code&gt;xui:imports&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Action chains support &lt;code&gt;when&lt;/code&gt;/&lt;code&gt;then&lt;/code&gt;/&lt;code&gt;onError&lt;/code&gt; control flow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11d. Adversarial Review and Security Hardening (05-01 ~ 05-02)
&lt;/h3&gt;

&lt;p&gt;Conducted an adversarial review of the entire codebase (24 packages), covering compiler-runtime contract consistency, reaction cascade depth, scope dangerous key filtering, formula parser/evaluator depth limits, form validation resilience, accessibility.&lt;/p&gt;

&lt;p&gt;Key fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;$Date&lt;/code&gt; symbol table fix&lt;/strong&gt;: Completed from 7 methods to 14 methods, covering all date operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;booleanStringAdapter("false")&lt;/code&gt; fix&lt;/strong&gt;: &lt;code&gt;Boolean("false")&lt;/code&gt; pitfall — the string &lt;code&gt;"false"&lt;/code&gt; is truthy in JavaScript; adapter must explicitly parse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action compilation depth limit&lt;/strong&gt;: &lt;code&gt;MAX_ACTION_COMPILE_DEPTH=128&lt;/code&gt; to prevent malicious nested action chains from causing compile stack overflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope snapshot sanitization&lt;/strong&gt;: &lt;code&gt;sanitizeSnapshot()&lt;/code&gt; blocks prototype pollution keys like &lt;code&gt;__proto__&lt;/code&gt;, &lt;code&gt;constructor&lt;/code&gt;, &lt;code&gt;prototype&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formula parser depth limit&lt;/strong&gt;: &lt;code&gt;MAX_PARSER_DEPTH=256&lt;/code&gt;, &lt;code&gt;MAX_EVAL_DEPTH=256&lt;/code&gt; to prevent deeply nested expression attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11e. Validation Owner Boundary Convergence (04-30 ~ 05-03)
&lt;/h3&gt;

&lt;p&gt;The validation owner boundary underwent three stages of precision refinement, finally forming a clear ownership hierarchy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan 157: validation owner boundary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;formId&lt;/code&gt; becomes a true targeting carrier, no longer just an identifier&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;submitWhenHidden&lt;/code&gt; semantics removed — submission behavior of hidden fields is uniformly controlled by the owner&lt;/li&gt;
&lt;li&gt;Registration identity maintains path-singleton: registrations on the same path are automatically replaced, no duplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plan 163: core boundary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flux-core&lt;/code&gt; completely removes React type dependencies, becoming a pure TypeScript package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux-react&lt;/code&gt; owns the &lt;code&gt;reactComponent&lt;/code&gt; convenience path&lt;/li&gt;
&lt;li&gt;Surface runtime creates an independent validation owner for each surface, achieving validation isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plan 168: validation owner convergence&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;formId&lt;/code&gt; resolution path unified&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;validateOn: 'change'&lt;/code&gt; no longer gates on &lt;code&gt;touched&lt;/code&gt; — validation on change, orthogonal to touched state&lt;/li&gt;
&lt;li&gt;Summary-gate enforcement during submission: collect all validation summaries on submit, block until all pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plan 174: Strict Validation Mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Schema authors can enable strict compilation mode, causing the compiler to report unknown attributes. This mechanism fills the last piece of schema validation: from "compiler ignores unknown attributes" to "unknown attributes are compile errors in strict mode".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Validation Owner Hierarchy&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Owner Level&lt;/th&gt;
&lt;th&gt;Coverage&lt;/th&gt;
&lt;th&gt;Typical Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;form&lt;/td&gt;
&lt;td&gt;All fields within the form&lt;/td&gt;
&lt;td&gt;Main form submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page-root&lt;/td&gt;
&lt;td&gt;Page-level validation&lt;/td&gt;
&lt;td&gt;Page-level linkage constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;surface&lt;/td&gt;
&lt;td&gt;Independent validation domain within dialog/drawer&lt;/td&gt;
&lt;td&gt;Popup form independent submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;detail-child&lt;/td&gt;
&lt;td&gt;Sub-validation domain within staged owner&lt;/td&gt;
&lt;td&gt;Detail row edit confirm/cancel boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  11f. Host Tooling and Engineering (04-30)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Turborepo introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Turborepo as the workspace task runner, enabling parallel execution of build/typecheck/test/lint. The task dependency graph is automatically topologically sorted by Turborepo, eliminating manual orchestration scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository-level audit toolchain&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;dependency-cruiser&lt;/strong&gt;: Dependency direction validation, preventing circular dependencies and illegal cross-layer references&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;knip&lt;/strong&gt;: Dead code detection, identifying unused exports, types, and dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stryker&lt;/strong&gt;: Mutation testing pilot, validating the effectiveness of test suites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semgrep&lt;/strong&gt;: Static security scanning, detecting known unsafe patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bundle analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Support for &lt;code&gt;pnpm analyze&lt;/code&gt; via &lt;code&gt;rollup-plugin-visualizer&lt;/code&gt;, visualizing bundle composition of each package, helping identify size regressions and unexpected dependencies.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key paths: &lt;code&gt;packages/flux-runtime/src/form-runtime.ts&lt;/code&gt;, &lt;code&gt;packages/spreadsheet-core/src/&lt;/code&gt;, &lt;code&gt;packages/flux-formula/src/&lt;/code&gt;, &lt;code&gt;packages/flux-core/src/&lt;/code&gt;, &lt;code&gt;docs/plans/143-*&lt;/code&gt;, &lt;code&gt;docs/plans/145-*&lt;/code&gt;, &lt;code&gt;docs/plans/157-*&lt;/code&gt;, &lt;code&gt;docs/plans/163-*&lt;/code&gt;, &lt;code&gt;docs/plans/168-*&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  12. Key Principles of Architectural Evolution
&lt;/h2&gt;

&lt;p&gt;Looking across the evolution history from 2026-03-20 to 2026-05-03, the following principles repeatedly appear in key decisions:&lt;/p&gt;

&lt;h3&gt;
  
  
  12.1 Compile First
&lt;/h3&gt;

&lt;p&gt;Flux always does as much work as possible at compile time: value classification, expression compilation, action pre-compilation, schema diagnostics. The runtime only executes compiled artifacts and makes no additional judgments. This principle runs from the five node types of &lt;code&gt;CompiledValueNode&lt;/code&gt; through the &lt;code&gt;TemplateNode&lt;/code&gt;/&lt;code&gt;NodeInstance&lt;/code&gt; separation.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.2 Data and Capability Separation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ScopeRef&lt;/code&gt; purely carries data, &lt;code&gt;ActionScope&lt;/code&gt; purely carries capabilities; they are orthogonally separated. This decision avoids turning &lt;code&gt;ScopeRef&lt;/code&gt; into a general-purpose method registry, keeping the scope model simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.3 Renderer Contract Consistency
&lt;/h3&gt;

&lt;p&gt;All renderers follow the unified &lt;code&gt;RendererComponentProps&lt;/code&gt; pattern, with data coming from &lt;code&gt;props.props&lt;/code&gt;/&lt;code&gt;props.meta&lt;/code&gt;/&lt;code&gt;props.regions&lt;/code&gt;/&lt;code&gt;props.events&lt;/code&gt;/&lt;code&gt;props.helpers&lt;/code&gt;, and do not directly access stores. This ensures renderer replaceability and testability.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.4 Marker Classes Carry No Styling
&lt;/h3&gt;

&lt;p&gt;Layout renderers only emit semantic marker classes (&lt;code&gt;nop-container&lt;/code&gt;, &lt;code&gt;nop-flex&lt;/code&gt;); marker classes carry no visual styling. All spacing/direction/padding is explicitly declared via &lt;code&gt;classAliases&lt;/code&gt; or semantic attributes in the schema. This avoids implicit layout and style drift.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.5 Domain Bridge Pattern
&lt;/h3&gt;

&lt;p&gt;Complex designers (Flow Designer, Report Designer, Spreadsheet) are integrated via the DomainBridge pattern: core packages provide pure logic runtime, renderer packages provide React integration, and the canvas is decoupled via bridge callbacks. This allows canvas implementations to be replaced without affecting core logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.6 Documentation as Architecture
&lt;/h3&gt;

&lt;p&gt;From the layered documentation system of Flow Designer to multiple rounds of discussion on the frontend programming model, the Flux project always uses documentation as the carrier of architectural decisions. The separation of target state and snapshot state, and the separation of discussion records from normative documents, ensure the sustainable maintenance of architectural knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.7 AI-First Observability
&lt;/h3&gt;

&lt;p&gt;The debugger was designed as AI-first from the start: structured automation APIs, diagnostic reports, session export, interaction tracing. Subsequent dependency tracking change paths, source/reaction registry snapshots, and node locator identity all follow the "machine-readable over human-readable" observability design.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.8 Design First, Implementation Approximates
&lt;/h3&gt;

&lt;p&gt;Flux's core design ideas (Env environment abstraction, Api/Resource as asynchronous reactive values, lexical scope data chain, &lt;code&gt;xui:imports&lt;/code&gt; action modularization, declarative first) were established as early as the AMIS theory research phase. The architectural evolution records not the discovery of design directions, but the gradual approximation of implementation precision to design principles — from runtime interpretation to compile-time staticization, from implicit conventions to explicit contracts, from monolithic to layered package boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.9 Host Boundary Testing Ground
&lt;/h3&gt;

&lt;p&gt;Flow Designer is the first testing ground for Flux to validate host protocols. What Flux learned from Flow Designer is not "how to make a flowchart editor", but that complex controls must access the runtime via host boundaries, namespaced actions, bridge snapshots, and configuration-driven approaches. The same unified runtime later successfully accommodated two vastly different complex host paradigms: structured process tree (DingFlow) and Excel-native workbench (Spreadsheet/Report Designer).&lt;/p&gt;

&lt;h3&gt;
  
  
  12.10 Implementation-Driven Convergence
&lt;/h3&gt;

&lt;p&gt;Although design ideas were established early, the implementation path was not achieved overnight. Flux's architecture gradually became precise through continuous implementation, failure, regression, splitting, renaming, rewriting documentation, and then being forced to converge by sub-audits. Each step of implementation advancement was accompanied by clear documentation and regression test coverage, ensuring traceability of implementation decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.11 Audit Rule Extraction Forms Long-Term Governance Loop
&lt;/h3&gt;

&lt;p&gt;From the deep audits of Phase 9 to the 18-dimensional audit of Phase 11, the Flux project continuously distilled audit findings into reusable governance rules: coverage thresholds (Plan 143), compilation depth limits, scope snapshot sanitization, strict validation mode. The output of each audit is not just fixes, but the extraction of new rules. These rules are written into code (threshold configs, compiler checks) rather than documentation, forming an automated governance loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.12 Adversarial Review Complements Deep Audit
&lt;/h3&gt;

&lt;p&gt;Deep audits discover problems from architectural dimensions (state ownership, dependency direction, contract consistency); adversarial reviews expose vulnerabilities from an attacker's perspective (prototype pollution, deep nesting, truthy traps). The two complement each other: deep audits ensure "architecture is correct", adversarial reviews ensure "attacks do not succeed". Phase 11 institutionalized both as standard processes before release.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.13 Reactive Subscription Precision is an Architectural Concern
&lt;/h3&gt;

&lt;p&gt;From per-path subscription (Plan 90) in Phase 9 to path-aware &lt;code&gt;useCurrentFormState&lt;/code&gt; in Phase 11, subscription precision has always been an architectural concern, not a local optimization. The wake-up scope of React re-renders directly determines the responsiveness performance of forms, tables, and designers. Flux's answer is progressive precision from full-value comparison → dependency path intersection → path-aware precise subscription; each step is an architectural decision, not an implementation detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.14 Validation Owner Hierarchy
&lt;/h3&gt;

&lt;p&gt;The ownership of the validation system is not a binary "has/has not", but a hierarchical model: form (form domain) → page-root (page domain) → surface (popup domain) → detail-child (staged sub-domain). Each layer has an independent lifecycle, submission gating, and validation summary. This hierarchy was the result of three Plans (157 → 163 → 168) gradually converging in Phase 11, evolving from implicit "form owns all validation" to an explicit four-layer ownership model.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Appendix: Timeline Overview
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Key Events&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Phase 1&lt;/td&gt;
&lt;td&gt;03-20 ~ 03-23&lt;/td&gt;
&lt;td&gt;Bug #1~#5 analysis and fixes, debugger birth, ActionScope/Import semantics established, Flow Designer packages created, canvas bridge initial implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 2&lt;/td&gt;
&lt;td&gt;03-23 ~ 03-27&lt;/td&gt;
&lt;td&gt;Canvas bridge, command adapter, schema-driven designer, production-grade visual alignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 3&lt;/td&gt;
&lt;td&gt;03-25 ~ 03-29&lt;/td&gt;
&lt;td&gt;AMIS→Flux renaming, flux-core split, styling system, shadcn/ui migration, FieldFrame, Report/Spreadsheet migration, testid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 4&lt;/td&gt;
&lt;td&gt;03-28 ~ 03-31&lt;/td&gt;
&lt;td&gt;Full shadcn/ui migration, Code Editor, Condition Builder, Word Editor, architecture audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 5&lt;/td&gt;
&lt;td&gt;04-01 ~ 04-03&lt;/td&gt;
&lt;td&gt;Code audit fixes, comprehensive overhaul, data source redesign, dual-hook design, full @nop-chaos/ui adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 6&lt;/td&gt;
&lt;td&gt;04-04 ~ 04-06&lt;/td&gt;
&lt;td&gt;Formily comparison, dependency tracking, source registry, reaction runtime, action control flow, WorkbenchShell, table state ownership, programming model doc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 7&lt;/td&gt;
&lt;td&gt;04-06 ~ 04-11&lt;/td&gt;
&lt;td&gt;Programming model finalization, Action/API convergence, Owner Status, component documentation system, imports expression projection, validation design, HiddenFieldPolicy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 8&lt;/td&gt;
&lt;td&gt;04-07 ~ 04-08&lt;/td&gt;
&lt;td&gt;Template instantiation, repeated instance identity, NodeRenderer migration, compiler diagnostics, BEM cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 9&lt;/td&gt;
&lt;td&gt;04-12 ~ 04-20&lt;/td&gt;
&lt;td&gt;Deep audit, architecture doc consistency, Plan 82 contract convergence, ScopeRef read-write separation, per-path subscription, performance optimization series (Plans 100~110), form-advanced split, Capability Projection Manifest, flux-i18n, ValueAdapter unified protocol, CompiledSchemaNode elimination, action pre-compilation IR, async governance convergence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 10&lt;/td&gt;
&lt;td&gt;04-21 ~ 04-25&lt;/td&gt;
&lt;td&gt;Compiler package extraction, action core package extraction, Import Boundary convergence, Base Tree→Template, DingFlow tree mode, CRUD, shared context menu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 11&lt;/td&gt;
&lt;td&gt;04-25 ~ 05-03&lt;/td&gt;
&lt;td&gt;Performance audit and hot path optimization, test coverage institutionalization (Plan 143), 18-dimensional deep audit, renderer contract convergence (Plans 145/146/144), xui:actions (Plan 150), adversarial security review and hardening, validation owner four-layer boundary convergence (Plans 157/163/168), Strict Validation Mode (Plan 174), Turborepo engineering&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;The architectural evolution of NOP Chaos Flux is a process of systematically implementing established design ideas on a modern technology stack. The core designs — Env environment abstraction, Api/Resource as asynchronous reactive values, lexical scope data chain, &lt;code&gt;xui:imports&lt;/code&gt; action modularization, declarative first — were established as early as the AMIS theory research phase (see &lt;code&gt;c:/can/nop/nop-entropy/docs/theory/amis/&lt;/code&gt;). What Flux did was not to invent these principles, but to solve the structural limitations of AMIS at the schema layer (parallel field explosion) and runtime layer (MST tight coupling), and to implement these principles in a compile-first, type-safe, package-boundary-clear manner.&lt;/p&gt;

&lt;p&gt;The strongest mainline throughout the evolution is from runtime interpretation to compile-time execution: value classification, template instantiation, action pre-compilation, host contract staticization, compiler package extraction — each step is a milestone on the same path of moving runtime judgment forward to compile time. But this mainline is not the only one. Running in parallel and equally important are two others: the ownership convergence of owner / validation / surface (from implicit dual-state to explicit staged owner, finally converging to the four-layer validation owner of form / page-root / surface / detail-child), and the boundary explicitization of host contract / import boundary / capability manifest (from runtime wiring conventions to compile-time visible contracts). The final three-layer split of &lt;code&gt;flux-compiler&lt;/code&gt; / &lt;code&gt;flux-action-core&lt;/code&gt; / &lt;code&gt;flux-runtime&lt;/code&gt; is the physical form of the compile-forward mainline. Phase 11 built on the three-layer split to complete comprehensive quality convergence: performance hot path optimization, 80% coverage institutionalization, adversarial security review, validation owner boundary precision, host tooling engineering — a leap from "architecture correct" to "implementation robust".&lt;/p&gt;

&lt;p&gt;The resulting architecture — DSL-first + compilation/execution separation + orthogonal scopes + template instantiation + domain bridging + compile-time host contracts + layered validation owner + automated quality governance — provides a clear modern runtime reference for declarative frontend low-code DSLs.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;nop-chaos-flux is open source:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-chaos-flux" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>react</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Design Principles of nop-chaos-flux, a Next-Generation Low-Code Rendering Framework</title>
      <dc:creator>canonical</dc:creator>
      <pubDate>Tue, 19 May 2026 12:38:06 +0000</pubDate>
      <link>https://dev.to/canonical/design-principles-of-nop-chaos-flux-a-next-generation-low-code-rendering-framework-3chc</link>
      <guid>https://dev.to/canonical/design-principles-of-nop-chaos-flux-a-next-generation-low-code-rendering-framework-3chc</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;nop-chaos-flux is the rendering layer of the Nop platform—a low‑code runtime driven by declarative DSLs, designed to render and execute application pages described by Schema in the browser. Its DSL surface syntax resembles that of Baidu AMIS, but achieves conceptual unification (e.g., eliminating the &lt;code&gt;xxxOn&lt;/code&gt; suffix family). Its internal compilation model, runtime architecture, and expression engine have all been redesigned.&lt;/p&gt;

&lt;p&gt;Most low‑code platforms treat the Schema as the runtime input configuration. The runtime then simultaneously carries authoring‑time structures, domain semantics, and scheduling logic. Every new capability adds another set of primitives, a new global provider, another authoritative Schema channel, and the core keeps bloating.&lt;/p&gt;

&lt;p&gt;Flux starts from a different path: elevating the DSL from a runtime input format to an independent, first‑class structural layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. DSL First
&lt;/h2&gt;

&lt;p&gt;The DSL is not an input format fed to the runtime; it is a &lt;strong&gt;first‑class artifact&lt;/strong&gt; of the platform: an independent, operable structural layer. Before ever entering the runtime, it already possesses its own lifecycle, transformation space, and organization rules.&lt;/p&gt;

&lt;p&gt;Many systems have a DSL, but it is only used as a runtime input format—there is no independent structural manipulation. Flux does not see it that way. Flux’s DSL is a structural layer that can be edited, composed, trimmed, and transformed even outside the runtime:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Edit&lt;/td&gt;
&lt;td&gt;Source location retention, aliases, editor metadata, round‑trip fidelity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge / Inherit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;x:extends&lt;/code&gt; inheritance, override expansion, fragment composition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trim&lt;/td&gt;
&lt;td&gt;Permission trimming, feature flag trimming, profile assembly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transform&lt;/td&gt;
&lt;td&gt;i18n string replacement, static default expansion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta‑programming&lt;/td&gt;
&lt;td&gt;Express variations through structural conventions (not by growing runtime interfaces)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;DSL transformations are layered: permission trimming, i18n replacement, and default expansion each operate independently. Removing authoring‑time metadata must not change runtime behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Authoring–Execution Separation
&lt;/h2&gt;

&lt;p&gt;Even when adopting a DSL‑first approach, many systems still maintain only one model, forcing the runtime to directly carry authoring‑time structures. Flux deliberately does not do this. Instead, it places the Authoring Model and the Execution Model on opposite sides of a pre‑compilation boundary.&lt;/p&gt;

&lt;p&gt;The point of this principle is not “having two models” per se, but acknowledging that the two sides have different optimisation goals: authoring time serves understanding, editing, composition, and fidelity; execution time serves conceptual simplification, reduced runtime overhead, and stable execution semantics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two‑sided optimisation goals
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Authoring Model&lt;/th&gt;
&lt;th&gt;Execution Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Optimisation goal&lt;/td&gt;
&lt;td&gt;Understandability, domain expressiveness, editing fidelity&lt;/td&gt;
&lt;td&gt;Performance, unified internal concepts, minimal runtime overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural form&lt;/td&gt;
&lt;td&gt;Retains source location, aliases, editor metadata, domain‑specific edit structures&lt;/td&gt;
&lt;td&gt;Final assembled Execution Schema, no redundancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;Round‑trip fidelity, author intent never lost&lt;/td&gt;
&lt;td&gt;Behavioural equivalence, deterministic execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replaceability&lt;/td&gt;
&lt;td&gt;Many editors/designers/collaborative engines can produce the same DSL&lt;/td&gt;
&lt;td&gt;The same Final Execution Schema can execute on different runtime hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Significance of the boundary
&lt;/h3&gt;

&lt;p&gt;The pre‑compilation boundary means more than “do some optimisation early”. It ensures that structural problems that should never land on the runtime surface are resolved at the structural layer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compile‑time structural decisions&lt;/strong&gt; — type resolution, renderer binding, default expansion are done during the loading phase; runtime overhead is zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compile‑time policy trimming&lt;/strong&gt; — permission nodes, feature flag branches are removed before entering the runtime; the runtime never sees them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compile‑time action DAG assembly&lt;/strong&gt; — &lt;code&gt;then&lt;/code&gt; / &lt;code&gt;onError&lt;/code&gt; / &lt;code&gt;parallel&lt;/code&gt; are assembled at compile time into a cycle‑free execution graph; no graph discovery or cycle detection at runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified Value IR&lt;/strong&gt; — All forms of Value (literal/expression/template/array/object) are compiled into a unified IR; evaluation is unified at runtime.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;If a problem can be solved at the structural transformation layer, it must never be dragged onto the runtime surface.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Reactive Data‑Driven
&lt;/h2&gt;

&lt;p&gt;Flux’s core execution model is reactive and declarative. The author does not need to explicitly build imperative linkage logic: whenever a dynamic value reads a path from the scope via a field path, name, or &lt;code&gt;${expr}&lt;/code&gt;, it automatically falls into the dependency graph and will be re‑evaluated when the dependency changes.&lt;/p&gt;

&lt;p&gt;Basic rhythm: &lt;strong&gt;evaluate → collect dependencies → propagate changes → targeted re‑evaluation / invalidation → republish&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dependency tracking is a built‑in design semantic of the Value primitive. Dependencies are automatically collected during evaluation, not declared statically beforehand. Value, Resource, and Reaction all use this mechanism, but with different consequences: Value is re‑evaluated, Resource is marked dirty and refreshed, a Reaction may trigger a Capability.&lt;/p&gt;

&lt;p&gt;The current implementation uses React and &lt;code&gt;useSyncExternalStore&lt;/code&gt; to interface with the rendering host, but the principle itself is not tied to any UI framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read/Write and Effect Separation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt;: Value / Resource published values / Host Projection snapshots are all read‑only via ScopeRef.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write&lt;/strong&gt;: User edits, &lt;code&gt;FormRuntime.setValue&lt;/code&gt;, &lt;code&gt;ScopeRef.update&lt;/code&gt;, Resource publication—these modify owner‑owned data and belong to the data owner side; they will publish store/scope changes, but that is not equivalent to triggering an action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command / Effect&lt;/strong&gt;: Schema‑authored commands (API calls, &lt;code&gt;setValue&lt;/code&gt; action, submission, navigation, host commands, etc.) are dispatched only through Capability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change → Effect&lt;/strong&gt;: Data changes do not directly trigger actions; they must pass through a Reaction or a Semantic Lifecycle Entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rendering Host Interfacing
&lt;/h3&gt;

&lt;p&gt;The Store layer runs the reactive logic self‑consistently; React is merely a rendering host that subscribes to Store snapshots.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Settled Update Turn&lt;/code&gt; is a runtime‑store concept, not a React &lt;code&gt;useEffect&lt;/code&gt; ordering concept.&lt;/li&gt;
&lt;li&gt;React concurrent mode can interrupt, replay, and discard renders; Flux does not constrain such scheduling behaviour—it only defines when the store settles an update turn and when a stable snapshot is published.&lt;/li&gt;
&lt;li&gt;The rendering host consumes the published results; it does not directly hold reactive protocol objects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Gradual Evolution
&lt;/h2&gt;

&lt;p&gt;Complex capabilities in Flux should not be obtained by continually inventing new primitives; they should grow naturally from simpler existing forms. This principle constrains two things at the same time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The author‑visible DSL naturally extends from simple forms to complex forms without frequent mental model switches.&lt;/li&gt;
&lt;li&gt;Complex capabilities inside the runtime should be composed from existing primitives (derived system) as much as possible, instead of expanding the primitive set under pressure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DSL‑level evolution: natural growth from simple forms
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Simple form&lt;/th&gt;
&lt;th&gt;→&lt;/th&gt;
&lt;th&gt;Complex form&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;literal → expression → anonymous source&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;named &lt;code&gt;data-source&lt;/code&gt; (Resource)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;single‑step dispatch&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;when&lt;/code&gt; guard → &lt;code&gt;then&lt;/code&gt;/&lt;code&gt;onError&lt;/code&gt; branches → &lt;code&gt;parallel&lt;/code&gt; fan‑out → compilable to DAG execution graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;visible&lt;/code&gt; (display level)&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;when&lt;/code&gt; (lifecycle activation) → &lt;code&gt;loop&lt;/code&gt; (collection expansion) → &lt;code&gt;dynamic-renderer&lt;/code&gt; (remote assembly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host write&lt;/td&gt;
&lt;td&gt;semantic command&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;generic patch‑style &lt;code&gt;applyPatch&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Value evolution
&lt;/h4&gt;

&lt;p&gt;The same property chooses the appropriate form based on complexity. How the consumer reads the value stays the same: &lt;code&gt;${countries}&lt;/code&gt; remains uniform from literal to data‑source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// literal&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;"options"&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="s2"&gt;"draft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"published"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"archived"&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="c1"&gt;// expression&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;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${role === 'admin' ? adminOptions : userOptions}"&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="c1"&gt;// source: field‑level anonymous request, not published to scope&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;"options"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/countries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"params"&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;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${form.region}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// data-source: named Resource with producer lifecycle &amp;amp; scheduling policy&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data-source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/countries"&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;"interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stopWhen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${countries.complete}"&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;h4&gt;
  
  
  Action evolution
&lt;/h4&gt;

&lt;p&gt;The compiler recursively assembles nested schemas into a &lt;code&gt;CompiledActionNode&lt;/code&gt; DAG (&lt;code&gt;flux-compiler/action-compiler.ts&lt;/code&gt;). The runtime simply traverses edges to execute; no graph discovery or cycle detection is needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// single-step dispatch&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// when guard: skip if condition not met, result marked skipped&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${isEnabled}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// then/onError branches: different paths based on ActionResult triage&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/users"&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;"then"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"showToast"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Save successful"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"onError"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"showToast"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${error.message}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// parallel fan-out + onSettled aggregation&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parallel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parallel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/notify/email"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/notify/sms"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"onSettled"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"showToast"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Notifications complete"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// form submission: submitAction owned by the form node; button is only a thin component:submit trigger&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"form"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"profile-form"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"submitAction"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"onSubmitSuccess"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"closeSurface"&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;"onSubmitError"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"showToast"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${error.message}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;Branch contexts (&lt;code&gt;result&lt;/code&gt; / &lt;code&gt;error&lt;/code&gt; / &lt;code&gt;prevResult&lt;/code&gt;) are automatically injected into the evaluation environment during dispatching (&lt;code&gt;flux-action-core/action-core.ts&lt;/code&gt; &lt;code&gt;createBranchEvaluationBindings&lt;/code&gt;).&lt;/p&gt;

&lt;h4&gt;
  
  
  Structure evolution
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;visible&lt;/code&gt; and &lt;code&gt;when&lt;/code&gt; are not synonyms: fields hidden by &lt;code&gt;visible&lt;/code&gt; still participate in validation; subtrees with &lt;code&gt;when=false&lt;/code&gt; are entirely inactive and do not participate in the lifecycle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// visible: display‑level toggle, node still exists&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"input-text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"adminCode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${role === 'admin'}"&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="c1"&gt;// when: lifecycle activation, affects existence and subtree validation&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fragment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${showSummary}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Summary content"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// loop: collection expansion, each iteration gets its own repeated‑item scope&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"loop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${users}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"itemName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"indexName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"idx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${idx + 1}. ${user.name}"&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;"empty"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No data"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;// dynamic-renderer: runtime remote assembly, decides which fragment to render&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;// Note: it is not a second Resource facet — data‑source produces named values, dynamic‑renderer assembles fragments&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dynamic-renderer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"loadAction"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/schema/${componentType}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Loading..."&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;h2&gt;
  
  
  5. Lexical Ownership
&lt;/h2&gt;

&lt;p&gt;This principle is an organisational constraint for Principle 3. Data, capabilities, resources, reactions, and runtime sidecars belong to the lexical scope or subtree boundary; they are not held by a global runtime mega‑object.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three resolution mechanisms
&lt;/h3&gt;

&lt;p&gt;Data lookup (ScopeRef), action lookup (ActionScope), and instance location (ComponentHandleRegistry) are architecturally separate resolution mechanisms, each with its own scoping rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lexical shadowing
&lt;/h3&gt;

&lt;p&gt;Child scopes override parent publications through natural lexical shadowing, not global overrides. Bindings with the same name can independently exist in different lexical scopes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// page scope has items&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&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;"items"&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="s2"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b"&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;"body"&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="c1"&gt;// dialog child scope also has items, shadows parent&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dialog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&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;"items"&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="s2"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"y"&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;"body"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${items}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// → ["x", "y"]&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;h3&gt;
  
  
  Resource publication ownership
&lt;/h3&gt;

&lt;p&gt;Within the same owning scope, the same binding target should not be long‑term co‑occupied by two simultaneously active publishing producers. This constraint applies to authoritative publication (continuous publication by a Resource), not ordinary writes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// compliant: two forms write to the same path at different times&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dialog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"form"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"createForm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"onSubmitSuccess"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${result}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"form"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"editForm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"onSubmitSuccess"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${result}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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="c1"&gt;// violation: two data‑sources simultaneously claim to publish "status"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data-source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/a"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data-source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/b"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="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;Runtime sidecars (Resource state, Reaction state, caches, diagnostics) follow lexical ownership, but they must not become methods or mutable protocol objects attached to a ScopeRef. The Scope hosts the data environment; it does not carry bridges, controllers, handles, or other command‑like objects.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Domain Isolation &amp;amp; Abstraction
&lt;/h2&gt;

&lt;p&gt;The Flux core maintains a small, stable abstraction layer. Its goal is not to absorb all frontend domain semantics, but to provide a sufficiently stable execution kernel that allows different domains to grow outside the core.&lt;/p&gt;

&lt;p&gt;The litmus test for this principle is not “can the core directly describe all complex systems?” but “can the core provide a stable embedding surface for complex systems without pushing domain complexity back into the core vocabulary?”&lt;/p&gt;

&lt;h3&gt;
  
  
  Isolation contract
&lt;/h3&gt;

&lt;p&gt;Interactions between domain systems (Flow Designer, Report Designer, Spreadsheet Editor, collaborative engines, CRDT/OT, etc.) and the Flux core are narrowed down to:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core → Domain (read)&lt;/td&gt;
&lt;td&gt;Host Projection&lt;/td&gt;
&lt;td&gt;Read‑only snapshot projection, host‑driven refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain → Core (write)&lt;/td&gt;
&lt;td&gt;Capability&lt;/td&gt;
&lt;td&gt;Namespaced command dispatch (e.g., &lt;code&gt;designer:*&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instance location&lt;/td&gt;
&lt;td&gt;ComponentHandleRegistry&lt;/td&gt;
&lt;td&gt;Explicit target component instance method invocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host‑private&lt;/td&gt;
&lt;td&gt;DomainBridge&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;getSnapshot/subscribe/dispatch&lt;/code&gt;, does NOT enter Schema‑visible Scope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why the core stays stable
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Graph algorithms, layout, collision detection, collaboration protocols, CRDT/OT, local‑first sync, gesture loops—these are all important, but they are &lt;strong&gt;domain systems&lt;/strong&gt; and should not become core primitives. From Flux’s perspective, they are just production strategies behind a Resource, host snapshots behind a Host Projection, or command systems behind a Capability.&lt;/li&gt;
&lt;li&gt;New domains plug in by declaring a host type + projection fields + capability namespace, without needing to introduce new global provider families, environment registries, or new authoritative Schema channels.&lt;/li&gt;
&lt;li&gt;Cross‑domain generic write pattern for editable hosts: read Host Projection → write Capability (structured patch DTO) → DomainBridge host‑private.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Business semantics ownership
&lt;/h3&gt;

&lt;p&gt;Business pipelines (form submission, dialog confirmation, page entry) belong to the &lt;strong&gt;node&lt;/strong&gt; that owns that lifecycle boundary, not to the UI trigger. Concrete examples are given in Section 4 (Semantic Lifecycle Entry). This is a concrete manifestation of lexical ownership and domain isolation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Principle&lt;/th&gt;
&lt;th&gt;One‑liner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;DSL First&lt;/td&gt;
&lt;td&gt;The DSL is a first‑class structural layer independent of the runtime: editable, composable, and transformable before execution.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Authoring–Execution Separation&lt;/td&gt;
&lt;td&gt;Authoring and execution serve different optimisation goals; they should be separated by a pre‑compilation boundary, not mixed in the runtime.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Reactive Data‑Driven&lt;/td&gt;
&lt;td&gt;The Value primitive has built‑in dependency tracking, read/write separation, and side effects are funnelled through Capability.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Gradual Evolution&lt;/td&gt;
&lt;td&gt;Complexity should grow naturally from simple DSL forms and existing primitives, not by expanding the primitive set under pressure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Lexical Ownership&lt;/td&gt;
&lt;td&gt;Data, capabilities, resources, reactions, and their sidecars belong to lexical/subtree boundaries, not to a global runtime mega‑object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Domain Isolation &amp;amp; Abstraction&lt;/td&gt;
&lt;td&gt;The core provides a small, stable execution kernel; domain complexity stays outside the core and embeds through a narrow contract.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;nop-chaos-flux is open source:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/entropy-cloud/nop-chaos-flux" rel="noopener noreferrer"&gt;https://github.com/entropy-cloud/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gitee: &lt;a href="https://gitee.com/canonical-entropy/nop-chaos-flux" rel="noopener noreferrer"&gt;https://gitee.com/canonical-entropy/nop-chaos-flux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>lowcode</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
