<?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: joinwell52</title>
    <description>The latest articles on DEV Community by joinwell52 (@joinwell52).</description>
    <link>https://dev.to/joinwell52</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%2F3887527%2F9ce60f79-7027-4ecd-8c9b-bf495e53c9b6.png</url>
      <title>DEV Community: joinwell52</title>
      <link>https://dev.to/joinwell52</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joinwell52"/>
    <language>en</language>
    <item>
      <title>Three Agents Returned Three Reports. Which Task Did They Actually Prove?</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Sat, 22 Aug 2026 07:16:30 +0000</pubDate>
      <link>https://dev.to/joinwell52/three-agents-returned-three-reports-which-task-did-they-actually-prove-gck</link>
      <guid>https://dev.to/joinwell52/three-agents-returned-three-reports-which-task-did-they-actually-prove-gck</guid>
      <description>&lt;p&gt;Original research: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/digital-employee/2026-08-20-report-attribution" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/digital-employee/2026-08-20-report-attribution" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three Agents finish at nearly the same time. Each report says “tests passed.” The dashboard sees three successful files. Yet one report came from the wrong project root, one reused an older test log, and one belongs to a retry that had already been rejected.&lt;/p&gt;

&lt;p&gt;Three green reports can still add up to a false delivery.&lt;/p&gt;

&lt;p&gt;Acceptance needs three plain answers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Who did the work?&lt;/strong&gt; Runtime identity and immutable execution context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What proves it?&lt;/strong&gt; Machine-captured command, exit code, Git state, logs, and artifact hashes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which task owns it?&lt;/strong&gt; A unique task contract plus the accepted execution attempt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Matching filenames alone cannot answer all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attribution chain
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task dispatch
→ immutable context binding
→ tool execution
→ machine evidence capture
→ report envelope
→ attribution validation
→ independent QA
→ acceptance decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The report is one link. It is not the whole proof.&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%2Fi0eztwquz505drw544hn.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%2Fi0eztwquz505drw544hn.png" alt="Execution facts and independent verification bind to Task 42 while Task 17 is rejected" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. Evidence is accepted only when identity, task binding, execution facts, and independent verification converge on the same task.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not let the model author the envelope
&lt;/h2&gt;

&lt;p&gt;A common file protocol checks that the task number inferred from the filename equals &lt;code&gt;frontmatter.task_id&lt;/code&gt; and the first referenced task. This catches many accidental mismatches.&lt;/p&gt;

&lt;p&gt;But an LLM can copy an old template and put the same wrong task ID in all three places. The file is internally consistent and externally wrong.&lt;/p&gt;

&lt;p&gt;The stronger design is Runtime packaging:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the Agent submits report content through a controlled tool;&lt;/li&gt;
&lt;li&gt;the Runtime injects &lt;code&gt;task_id&lt;/code&gt;, &lt;code&gt;parent_id&lt;/code&gt;, project root, runtime instance, attempt ID, and evidence references from the active execution context;&lt;/li&gt;
&lt;li&gt;the Agent cannot overwrite those envelope fields;&lt;/li&gt;
&lt;li&gt;the validator compares the envelope with the dispatch record and current task contract.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not every current submission path implements universal envelope injection and unified evidence capture. They are target architecture requirements. The article does not present them as already complete everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence must come from the execution boundary
&lt;/h2&gt;

&lt;p&gt;“I ran the tests” is a claim. Useful evidence includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact command and normalized working directory;&lt;/li&gt;
&lt;li&gt;process exit code;&lt;/li&gt;
&lt;li&gt;captured stdout/stderr or a content hash and durable location;&lt;/li&gt;
&lt;li&gt;Git commit/tree or changed-file hashes;&lt;/li&gt;
&lt;li&gt;Runtime instance and execution attempt;&lt;/li&gt;
&lt;li&gt;tool invocation identity;&lt;/li&gt;
&lt;li&gt;test time and environment facts when they affect interpretation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model may summarize this evidence, but it should not fabricate the primary record. A Runtime or tool wrapper should capture it at the process boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use logical order, not filesystem time
&lt;/h2&gt;

&lt;p&gt;File modification time is unreliable for causality. Git checkout, archive extraction, clock skew, and cross-device synchronization can rewrite or preserve timestamps in surprising ways.&lt;/p&gt;

&lt;p&gt;Use a task revision and attempt sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-42 revision 6
  attempt 1 → rejected
  attempt 2 → accepted evidence candidate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a late report from attempt 1 arrives after attempt 2, physical time does not make it current. The accepted task revision and attempt decision do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple reports need an explicit state machine
&lt;/h2&gt;

&lt;p&gt;Never overwrite a report silently. Each submission should be immutable and identified by attempt or report sequence. The acceptance layer can then decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;candidate&lt;/code&gt;: awaiting verification;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rejected&lt;/code&gt;: evidence or contract mismatch;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;superseded&lt;/code&gt;: replaced by a later valid attempt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;accepted&lt;/code&gt;: bound to the current task decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;History remains inspectable, while only one attempt may satisfy the task.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical attribution veto list
&lt;/h2&gt;

&lt;p&gt;Reject or hold acceptance when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime instance, canonical root, task revision, or attempt conflicts;&lt;/li&gt;
&lt;li&gt;a report refers to a task other than the active dispatch contract;&lt;/li&gt;
&lt;li&gt;Git hash or artifact hash does not match the inspected workspace;&lt;/li&gt;
&lt;li&gt;required machine evidence is missing or cannot be resolved;&lt;/li&gt;
&lt;li&gt;the execution right expired on a path that implements a lease;&lt;/li&gt;
&lt;li&gt;a rejected/superseded attempt submits a late report;&lt;/li&gt;
&lt;li&gt;independent verification covers a different revision;&lt;/li&gt;
&lt;li&gt;three metadata fields agree with one another but disagree with the Runtime dispatch record.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A veto is not automatically an accusation of fraud. The neutral verdict is stale, conflicting, or insufficient evidence unless there is independent evidence of deliberate deception.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 44 tests establish
&lt;/h2&gt;

&lt;p&gt;On the pinned CodeFlowMu implementation, &lt;strong&gt;44/44&lt;/strong&gt; report ownership and aggregation gate tests passed. They validate the covered parser, ownership, and aggregation paths.&lt;/p&gt;

&lt;p&gt;They do not prove report content is inherently truthful. They also do not cover the logical counterexample where all three model-authored fields consistently point to the same wrong task. That case remains a required next fault test and a reason to move envelope authority into the Runtime.&lt;/p&gt;

&lt;p&gt;The durable rule is: &lt;strong&gt;a report counts only when identity, machine evidence, task contract, and an authorized acceptance decision agree.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The full fact matrix and implementation boundaries are in the &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/digital-employee/2026-08-20-report-attribution" rel="noopener noreferrer"&gt;canonical English article&lt;/a&gt;. A &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/digital-employee/2026-08-20-report-attribution" rel="noopener noreferrer"&gt;Chinese version&lt;/a&gt; is also available.&lt;/p&gt;

&lt;p&gt;More bilingual Agent engineering research: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Is the Agent Still Editing the Old Project?</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Sat, 22 Aug 2026 06:47:41 +0000</pubDate>
      <link>https://dev.to/joinwell52/why-is-the-agent-still-editing-the-old-project-10ji</link>
      <guid>https://dev.to/joinwell52/why-is-the-agent-still-editing-the-old-project-10ji</guid>
      <description>&lt;p&gt;Original research: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-20-project-root-switch" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/engineering/2026-08-20-project-root-switch" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The UI says Project B. The next test runs in B. Yet an Agent terminal still writes into Project A, an old file watcher emits events from A, and the evidence report is saved under B.&lt;/p&gt;

&lt;p&gt;This is the local-Agent equivalent of a construction crew moving sites: the supervisor changes the sign, the workers keep demolishing the old building, the tool truck arrives at the new one, and the inspector records everything in the new site diary. Every component can report success while the delivery is wrong.&lt;/p&gt;

&lt;p&gt;The current project is not one path string. It is a distributed binding shared by an execution chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven consumers can hold seven different roots
&lt;/h2&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;Plain role&lt;/th&gt;
&lt;th&gt;How it becomes stale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;coordinator&lt;/td&gt;
&lt;td&gt;Keeps the previous in-memory project binding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP Server&lt;/td&gt;
&lt;td&gt;tool process&lt;/td&gt;
&lt;td&gt;Was started with the old root or environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;file Watcher&lt;/td&gt;
&lt;td&gt;site camera&lt;/td&gt;
&lt;td&gt;Still subscribes to Project A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent / terminal &lt;code&gt;cwd&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;worker location&lt;/td&gt;
&lt;td&gt;A child process keeps its original working directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;task write root&lt;/td&gt;
&lt;td&gt;work-order desk&lt;/td&gt;
&lt;td&gt;New tasks go to B while execution stays in A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FCoP lifecycle root&lt;/td&gt;
&lt;td&gt;delivery ledger&lt;/td&gt;
&lt;td&gt;State files describe a different project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;logs and evidence root&lt;/td&gt;
&lt;td&gt;inspection diary&lt;/td&gt;
&lt;td&gt;Evidence is attributed to the new root for old work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Changing the toolbar only updates one observer. Safe rebinding must move the whole group.&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%2F05tt0y1w22h6kk6cj5zf.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%2F05tt0y1w22h6kk6cj5zf.png" alt="Project A is isolated before the execution chain is rebound to Project B" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. The old root becomes inactive before a new execution identity is allowed to produce effects.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A four-phase safe switch
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Stop admitting new work
&lt;/h3&gt;

&lt;p&gt;Freeze new dispatches before changing any root. Otherwise work can enter while half the system still points to A and half already points to B.&lt;/p&gt;

&lt;p&gt;Existing sessions should enter graceful draining: block new tool calls, ask cooperative work to stop at a safe boundary, wait for a bounded grace period, and only then terminate remaining child processes. A forced kill must leave a visible dirty-state record; it must not be presented as a clean switch.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Quiesce old side effects
&lt;/h3&gt;

&lt;p&gt;Stop watchers, MCP tool processes, terminals, build jobs, and other children that can still touch A. On Windows, process termination does not guarantee immediate handle release. A Git process, language server, or orphaned tool may retain a file or directory handle and cause &lt;code&gt;EBUSY&lt;/code&gt; or &lt;code&gt;EPERM&lt;/code&gt; errors.&lt;/p&gt;

&lt;p&gt;Use bounded retry with evidence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request cooperative stop
wait for child exit
probe old-root handles / operations
retry within a fixed deadline
if still busy: reject the switch and retain diagnostics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Silently continuing after a handle error creates a split workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Persist one canonical new root
&lt;/h3&gt;

&lt;p&gt;Normalize more than slash direction and letter case. Modern Node.js projects commonly use symlinks through package managers. Two different strings may reach the same physical directory, while one friendly-looking path may escape the intended root.&lt;/p&gt;

&lt;p&gt;Resolve a real path (&lt;code&gt;fs.realpathSync.native()&lt;/code&gt; on Node.js/Windows where appropriate), validate that it exists and is permitted, then persist the canonical form. Task context should become immutable: once one task starts, its project identity cannot change underneath it.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Rebuild and prove the binding
&lt;/h3&gt;

&lt;p&gt;Restart the Runtime-facing components from the saved canonical root. Give the new execution chain a new identity or epoch. Before dispatch resumes, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime root equals the persisted root;&lt;/li&gt;
&lt;li&gt;MCP/tool roots equal the Runtime root;&lt;/li&gt;
&lt;li&gt;watcher subscriptions cover only the new root;&lt;/li&gt;
&lt;li&gt;new child-process &lt;code&gt;cwd&lt;/code&gt; equals the new root;&lt;/li&gt;
&lt;li&gt;task, report, log, and evidence roots agree;&lt;/li&gt;
&lt;li&gt;no old-epoch process may write.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The switch is complete only when these facts agree—not when the UI label changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fail visibly on four classes of error
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Invalid destination:&lt;/strong&gt; missing, forbidden, or unresolved path. Keep A active or stop safely; do not half-switch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Draining timeout:&lt;/strong&gt; an in-flight model/tool call does not reach a safe boundary. Preserve its state and require an explicit recovery decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows handle retention:&lt;/strong&gt; old processes still lock A. Retry within bounds, identify the owner when possible, then reject rather than guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binding mismatch:&lt;/strong&gt; any component reports a different canonical root or execution epoch. Block dispatch.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What 27 tests do—and do not—prove
&lt;/h2&gt;

&lt;p&gt;The pinned CodeFlowMu implementation passed &lt;strong&gt;27/27&lt;/strong&gt; related tests for the current Windows-local project switch path. They verify the tested order, conflicts, and binding behavior in that implementation.&lt;/p&gt;

&lt;p&gt;They do not prove that graceful draining, orphan-handle discovery, symlink behavior on every filesystem, or every third-party MCP Server is already covered. Those are explicit engineering requirements and next validation targets, not retroactive claims about the current test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;Treat project switching like changing an execution identity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stop old effects
→ persist one canonical new address
→ rebuild every root consumer
→ prove task and evidence share that address
→ reopen dispatch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your system cannot enumerate every component that consumes the project root, it cannot yet claim to switch projects safely.&lt;/p&gt;

&lt;p&gt;The complete source matrix and implementation boundaries are in the &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-20-project-root-switch" rel="noopener noreferrer"&gt;canonical English article&lt;/a&gt;. A &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/engineering/2026-08-20-project-root-switch" rel="noopener noreferrer"&gt;Chinese version&lt;/a&gt; is also available.&lt;/p&gt;

&lt;p&gt;More bilingual Agent engineering research: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>An AI Agent’s Skill Is Not Its Permission</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Sat, 22 Aug 2026 06:47:37 +0000</pubDate>
      <link>https://dev.to/joinwell52/an-ai-agents-skill-is-not-its-permission-3k4</link>
      <guid>https://dev.to/joinwell52/an-ai-agents-skill-is-not-its-permission-3k4</guid>
      <description>&lt;p&gt;Original research: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/industry/2026-08-20-skill-vs-tool-authority" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/industry/2026-08-20-skill-vs-tool-authority" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suppose an AI Agent receives a deployment playbook. It now understands the build, test, and release sequence. The environment also exposes a terminal and file-writing tools. May it publish?&lt;/p&gt;

&lt;p&gt;Many systems accidentally answer yes. They collapse four separate facts into one: the model knows a procedure, a tool exists, the role may call it, and this exact operation is authorized.&lt;/p&gt;

&lt;p&gt;Think of a controlled office release. A &lt;strong&gt;Skill&lt;/strong&gt; is the operating manual. A &lt;strong&gt;Tool&lt;/strong&gt; is the machine that can change files or invoke an API. A role capability is the access badge. An operation policy is the work order that identifies the target and impact. Approval is the seal placed on one exact work order.&lt;/p&gt;

&lt;p&gt;Knowing the manual, operating the machine, holding a badge, and receiving approval are different events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four gates, four different questions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;What it must not imply&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Skill / playbook&lt;/td&gt;
&lt;td&gt;How should this job be done?&lt;/td&gt;
&lt;td&gt;That the job is permitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role capability&lt;/td&gt;
&lt;td&gt;Which tools may this role call?&lt;/td&gt;
&lt;td&gt;That every target is acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operation policy&lt;/td&gt;
&lt;td&gt;What object and side effect are being requested?&lt;/td&gt;
&lt;td&gt;That a human has approved it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-use approval&lt;/td&gt;
&lt;td&gt;Is this exact operation allowed now?&lt;/td&gt;
&lt;td&gt;That later or modified operations are allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Tool is not permission and is not inherently safe. It is an effect-producing interface. If the gate or operating-system boundary is overprivileged, a perfectly deterministic tool can still do too much.&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%2F5weindw34tksdgykykxd.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%2F5weindw34tksdgykykxd.png" alt="Four independent layers separate method, callable capability, operation impact, and one exact approval" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. Approval grants one controlled execution attempt; it does not merge the four layers.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why prompts cannot be the security boundary
&lt;/h2&gt;

&lt;p&gt;A Skill lives in model context. It is useful for decomposing intent, choosing a workflow, and assembling parameters. But it is still probabilistic text exposed to instruction conflict and prompt injection.&lt;/p&gt;

&lt;p&gt;Authorization must be enforced outside that context. In a Model Context Protocol (MCP) tool or local Runtime, a neutral gate should check at least:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;caller identity
AND role-to-tool capability
AND canonical project root
AND target allowlist
AND operation policy
AND matching single-use approval
AND underlying OS / sandbox permission
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model may propose an operation. It must not be the component that decides whether its own proposal is authorized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bind approval to state, not only parameters
&lt;/h2&gt;

&lt;p&gt;Parameter matching is necessary but insufficient. A reviewer may approve a patch against Git commit &lt;code&gt;abc123&lt;/code&gt;; before execution, another process changes the branch. The command is unchanged, but the state it will affect is not.&lt;/p&gt;

&lt;p&gt;The approval fingerprint should therefore bind the action to relevant preconditions, for example:&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;"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;"publish_release"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project_root"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:/work/app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"git_commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"artifact_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-22T14:10:00+08:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nonce"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approval-7f2..."&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;Immediately before the side effect, the Runtime recalculates the fingerprint. A state mismatch, expiry, or repeated nonce rejects execution. This closes a common time-of-check/time-of-use (TOCTOU) gap.&lt;/p&gt;

&lt;p&gt;Network retry is not renewed authority. A retry may safely return the stored result for the same operation identifier; changing the target, parameters, or bound state requires a new approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static parsing still needs a sandbox
&lt;/h2&gt;

&lt;p&gt;Command and path parsing cannot prove every effect in advance. Shell expansion, symlinks, environment variables, child processes, and tool-specific behavior can escape a naive allowlist.&lt;/p&gt;

&lt;p&gt;That is why policy gates must sit above hard controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run high-impact tools in a restricted process or container;&lt;/li&gt;
&lt;li&gt;grant the process only the filesystem and network access it needs;&lt;/li&gt;
&lt;li&gt;canonicalize paths and reject traversal outside the bound root;&lt;/li&gt;
&lt;li&gt;record command, exit code, stdout/stderr location, and artifact hashes;&lt;/li&gt;
&lt;li&gt;fail closed when identity, state, or approval evidence is missing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the implementation tests establish
&lt;/h2&gt;

&lt;p&gt;In the public CodeFlowMu Runtime, the tested chain separates Skill context routing, role/tool capability, operation authorization, approval persistence, and one-time consumption. On the pinned implementation used by the research article, 22 focused gate tests plus 13 approval persistence/consumption tests passed: &lt;strong&gt;35/35&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That result supports the tested paths. It is not a penetration test, a third-party security certification, or proof that every downstream tool has perfect target parsing. The remaining boundary matters as much as the green count.&lt;/p&gt;

&lt;h2&gt;
  
  
  An audit checklist you can use
&lt;/h2&gt;

&lt;p&gt;For every high-impact Agent action, require a concrete answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can the Skill directly invoke effects, or only propose a structured request?&lt;/li&gt;
&lt;li&gt;Is role capability enforced in deterministic code?&lt;/li&gt;
&lt;li&gt;Is the canonical project root part of the request?&lt;/li&gt;
&lt;li&gt;Does policy inspect the real target and side effect?&lt;/li&gt;
&lt;li&gt;Is approval bound to parameters and relevant state?&lt;/li&gt;
&lt;li&gt;Does approval expire and resist replay?&lt;/li&gt;
&lt;li&gt;Does the underlying process lack unnecessary filesystem/network rights?&lt;/li&gt;
&lt;li&gt;Can a reviewer reconstruct who proposed, authorized, executed, and verified the action?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The architecture rule is simple: &lt;strong&gt;let Skills explain and propose; let deterministic software authorize and execute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full evidence matrix, source links, and implementation boundaries are preserved in the &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/industry/2026-08-20-skill-vs-tool-authority" rel="noopener noreferrer"&gt;canonical English article&lt;/a&gt;. A &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/industry/2026-08-20-skill-vs-tool-authority" rel="noopener noreferrer"&gt;Chinese version&lt;/a&gt; is also available.&lt;/p&gt;

&lt;p&gt;More bilingual Agent engineering research: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Don’t Trust an All-Green Demo: How Fault Injection Exposes an Unreliable AI Agent Dispatcher</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Thu, 20 Aug 2026 07:20:54 +0000</pubDate>
      <link>https://dev.to/joinwell52/dont-trust-an-all-green-demo-how-fault-injection-exposes-an-unreliable-ai-agent-dispatcher-1663</link>
      <guid>https://dev.to/joinwell52/dont-trust-an-all-green-demo-how-fault-injection-exposes-an-unreliable-ai-agent-dispatcher-1663</guid>
      <description>&lt;p&gt;Original research article: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-19-agent-dispatch-fault-injection" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/engineering/2026-08-19-agent-dispatch-fault-injection" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt; begin with &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-19-taskbook-to-task-graph" rel="noopener noreferrer"&gt;the long-requirement work graph&lt;/a&gt;. This article asks what remains true after a fault; finish with &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/digital-employee/2026-08-19-local-runtime-mobile-control" rel="noopener noreferrer"&gt;local execution and mobile control&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  In ten seconds
&lt;/h2&gt;

&lt;p&gt;Organize reliability tests as &lt;strong&gt;one rule that must never break × one injected fault × one observable verdict&lt;/strong&gt;. The article delivers six defensive rules, four fault families, and a 12-case checklist that can become a Runtime test plan.&lt;/p&gt;

&lt;p&gt;The easiest multi-agent demo is a happy path: create a TASK, let an Agent claim it, write a REPORT, and show “done” in the UI.&lt;/p&gt;

&lt;p&gt;One successful run says almost nothing about the harder system. What happens when a watcher emits the same file event twice? If the dispatch record is durable but the model session never starts, will restart launch duplicate work? If one task appears in both &lt;code&gt;active/&lt;/code&gt; and &lt;code&gt;review/&lt;/code&gt;, which location wins? If a dependency prevents a test from running, does the dashboard still say PASS?&lt;/p&gt;

&lt;p&gt;Reliability testing begins with facts that must survive every interleaving, not with buttons on a page.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not only ask whether the workflow completed. Ask which invariants remain true when failure lands on every commit boundary.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Start from protocol invariants without repeating the protocol tutorial
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/a859e6747fe6e5e2d686e0114c77774726d7f748/spec/fcop-v3-spec.md" rel="noopener noreferrer"&gt;FCoP v3&lt;/a&gt; defines TASK, REPORT, ISSUE, and REVIEW artifacts, plus the collaboration semantics in which location represents current state and events preserve transition history. The previous article, &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-18-fcop-file-state-machine" rel="noopener noreferrer"&gt;“Files, Paths, and Events: Implementing and Testing the FCoP Collaboration State Machine”&lt;/a&gt;, covers protocol transitions and atomic commit in full; here they are only inputs to Runtime testing. &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/a859e6747fe6e5e2d686e0114c77774726d7f748/adr/ADR-0038-fcop-boundary-charter.md" rel="noopener noreferrer"&gt;ADR-0038&lt;/a&gt; narrows the boundary: the protocol externalizes and coordinates work; it does not execute tasks or own model sessions and global orchestration.&lt;/p&gt;

&lt;p&gt;CodeFlowMu Runtime owns file observation, task parsing, dependency checks, agent selection, session startup, dispatch commit, and recovery. Testing therefore needs layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it must establish&lt;/th&gt;
&lt;th&gt;Typical failure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol/artifact&lt;/td&gt;
&lt;td&gt;Identity, provenance, legal state, history, authority&lt;/td&gt;
&lt;td&gt;Duplicate identity, illegal transition, history gap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage commit&lt;/td&gt;
&lt;td&gt;No partial canonical write; bounded recovery&lt;/td&gt;
&lt;td&gt;Temp residue, rename failure, weak durability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime observation&lt;/td&gt;
&lt;td&gt;Repeated events and reconciliation do not duplicate effects&lt;/td&gt;
&lt;td&gt;Watcher jitter, missed event, double scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dispatch/session&lt;/td&gt;
&lt;td&gt;Dependencies, busy state, two-phase dispatch, crash recovery&lt;/td&gt;
&lt;td&gt;Double dispatch, orphan session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;A REPORT does not confer acceptance; failures remain visible&lt;/td&gt;
&lt;td&gt;Self-approval, NOT RUN reported as PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A single end-to-end test collapses these layers. When it fails, “the workflow did not finish” cannot tell you whether the defect belongs to protocol semantics, storage, observation, or the session host.&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%2Fjyef27nlupq3qxwu59rr.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%2Fjyef27nlupq3qxwu59rr.png" alt="The layered relationship among TMPA governance semantics, the FCoP file-protocol projection, CodeFlowMu runtime responsibility, and fault evidence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. TMPA defines what should hold, FCoP specifies how it is expressed, and CodeFlowMu implements how it runs. TMPA C01–C14 conformance evidence and this article's 12 product-fault scenarios cannot substitute for one another. Source: TMPA Core S1.0, FCoP v3, current CodeFlowMu code, and the 2026-08-19 experiment record.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Six defensive rules worth encoding first
&lt;/h2&gt;

&lt;p&gt;Regardless of language or storage engine, start with six rules that a fault must never be allowed to break:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A task identity never means two jobs:&lt;/strong&gt; duplicates are reported, not overwritten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A task cannot have split-state personality:&lt;/strong&gt; two current locations are preserved as a conflict, not resolved by traversal order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History is an append-only ledger:&lt;/strong&gt; rejection, failure, retry, and recovery remain visible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every model call is attributable:&lt;/strong&gt; it maps to a task version, execution attempt, time-bounded claim, and host decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No permit, no start:&lt;/strong&gt; unmet dependencies, a busy agent, or an unapproved gate prevents session startup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restart never guesses:&lt;/strong&gt; persistent artifacts and explicit execution records decide retry, rework, continue, or stop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/tmpa-core-specification-s1.0" rel="noopener noreferrer"&gt;TMPA Core S1.0&lt;/a&gt; supplies the identity, state, conflict, history, and recovery baseline. CodeFlowMu adds product responsibilities for watchers, dependencies, dispatch attempts, sessions, and time-bounded claims. The combination produces the Runtime test coordinates; the product-specific half is not a Core requirement.&lt;/p&gt;

&lt;p&gt;Core also requires a deterministic Reader to produce a byte-equivalent canonical result for the same final source set and fixed Profile. Determinism here does not mean every timeline is identical. It means directory traversal order cannot change the governance verdict when the evidence is the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why file coordination still needs governance semantics
&lt;/h2&gt;

&lt;p&gt;Putting Markdown files in directories is a storage technique, not a reliability model. A filesystem still permits duplicate sources, concurrent writers, torn updates, ambiguous locations, and evidence that disappears under an overwrite. The useful question is not “Can agents exchange files?” but “Which facts must remain true when those exchanges fail?”&lt;/p&gt;

&lt;p&gt;TMPA Core supplies five constraints that give the file projection engineering meaning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stable identity and provenance.&lt;/strong&gt; A governed object needs a stable identity, source relation, and accountable role. Two sources declaring the same task identity are a conflict to preserve, not an invitation to let the last writer win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifecycle and acceptance stay separate.&lt;/strong&gt; A task location may represent its current collaboration state, while a REPORT records an execution claim and an authorized decision records acceptance. One field called &lt;code&gt;done&lt;/code&gt; cannot safely compress all three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Published objects are immutable; history remains reconstructable.&lt;/strong&gt; Rejection, failure, retry, and recovery append new evidence. They do not rewrite the past into a cleaner story.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict is a result.&lt;/strong&gt; When readers find two current locations or incompatible sources, they report the ambiguity and stop the affected transition. Traversal order, confidence, or a model guess must not silently manufacture consensus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery comes from durable evidence.&lt;/strong&gt; A fresh reader must rebuild responsibility, lifecycle, unresolved dependencies, failures, and recovery relations without access to the previous agent's hidden reasoning.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FCoP projects part of those semantics into TASK, REPORT, ISSUE, REVIEW, lifecycle locations, and transition events. CodeFlowMu then assumes the product responsibilities that a protocol does not: observing files, checking dependencies, managing attempts and sessions, enforcing time-bounded authority, and choosing a recovery policy.&lt;/p&gt;

&lt;p&gt;That hierarchy also limits what a test result proves. TMPA C01–C14 check conformance behavior for an exact Core bundle. The 12 scenarios later in this article target concrete CodeFlowMu storage, observation, dispatch, and test-oracle failures. Neither suite can stand in for the other, and the 12 scenarios are a test plan—not a claim that all twelve already pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage faults: atomic rename is a commit point, not a universal guarantee
&lt;/h2&gt;

&lt;p&gt;A common file commit is: write a uniquely named temporary file, flush its contents, then replace/rename the destination. POSIX &lt;code&gt;rename()&lt;/code&gt; provides atomic name replacement under its defined conditions, which makes it useful as an observable commit point.&lt;/p&gt;

&lt;p&gt;Keep the boundary narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not assume atomicity across mounts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fsync(file)&lt;/code&gt; is not automatically durable directory metadata after power loss.&lt;/li&gt;
&lt;li&gt;Windows sharing, antivirus scanning, or transient path disappearance can yield EPERM/ENOENT.&lt;/li&gt;
&lt;li&gt;A successful rename does not make downstream business effects exactly-once.&lt;/li&gt;
&lt;li&gt;A file lock does not automatically eliminate deadlock or every race.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On 2026-08-19, we ran the current CodeFlowMu &lt;a href="https://github.com/joinwell52-AI/CodeFlowMu-open/blob/ed5634c718b9e238c44bb70851020c9793546fe6/packages/codeflowmu-runtime/src/_internal/__tests__/atomic-write.test.ts" rel="noopener noreferrer"&gt;atomic-write test file&lt;/a&gt; in the local working copy: &lt;strong&gt;9 tests passed&lt;/strong&gt;. That supports the limited claim that the tested temp-file, replacement, and bounded-retry branches passed in this environment. It does not support “safe on every filesystem” or “exactly-once execution.”&lt;/p&gt;

&lt;p&gt;A useful harness places faults between storage steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Illustrative interface, not a published CodeFlowMu API.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42017&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;taskIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TASK-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;after-temp-write&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EPERM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;after-replace-before-source-unlink&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;crash&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;restartRuntime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;oneCanonicalLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TASK-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;historyExplainsCurrentState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TASK-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;noUnboundedRetry&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API shape is unimportant. The seed, injection point, error count, restart, and final verdict must be reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event faults: a watcher notification is not a business fact
&lt;/h2&gt;

&lt;p&gt;Filesystem watchers may duplicate, merge, reorder, or miss transient notifications. A watcher event should therefore mean “re-read durable facts,” not “dispatch one task.”&lt;/p&gt;

&lt;p&gt;Test duplicate observation paths together: emit two identical watcher events while periodic reconciliation finds the same TASK. Multiple observations are acceptable; only one constrained business commit is. The implementation may use a deduplication key, task revision, dispatch-intent record, or idempotent store. The test should specify the result rather than turn one lock design into a standard.&lt;/p&gt;

&lt;p&gt;Also test a missed event: suppress the watcher completely and run reconciliation. The persistent task must still be discovered. Otherwise an optimization has quietly become the only fact-ingestion path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dispatch faults: test attempt and lease commit boundaries
&lt;/h2&gt;

&lt;p&gt;CodeFlowMu's current &lt;a href="https://github.com/joinwell52-AI/CodeFlowMu-open/blob/ed5634c718b9e238c44bb70851020c9793546fe6/packages/codeflowmu-runtime/src/scheduler/DispatchAttemptStore.ts" rel="noopener noreferrer"&gt;&lt;code&gt;DispatchAttemptStore&lt;/code&gt;&lt;/a&gt; persists &lt;code&gt;offered&lt;/code&gt;, &lt;code&gt;claimed&lt;/code&gt;, &lt;code&gt;running&lt;/code&gt;, and terminal states, together with attempt, lease, session ID, and idempotency key. The existing &lt;code&gt;TaskDispatcher.twoPhaseDispatch.test.ts&lt;/code&gt; mainly covers trusted and unknown routes, repeated holds, dependency blocking, explicit release, and &lt;code&gt;session_started&lt;/code&gt;. It does &lt;strong&gt;not&lt;/strong&gt; directly inject the two crash windows below.&lt;/p&gt;

&lt;p&gt;The commit sequence that still needs fault injection is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Persist an intent bound to task revision, target agent, and rationale.&lt;/li&gt;
&lt;li&gt;Start the model session.&lt;/li&gt;
&lt;li&gt;Commit the external session identity or a failure record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The target contract is: after a crash following step 1, restart sees “attempt without session”; after session startup but before step 3, external session identity or an idempotency key prevents a blind second launch. These are test requirements in this article, not a claim that the current crash paths have already been verified.&lt;/p&gt;

&lt;p&gt;This is still not exactly-once. For external APIs, Git pushes, payments, or other irreversible effects, a more realistic contract is at-least-once attempt, domain idempotency key, visible duplicates, and human-decidable recovery.&lt;/p&gt;

&lt;p&gt;Busy agents and dependencies are fault inputs too. An unknown TASK source, a busy target agent, an incomplete parent, an unapproved gate, and simultaneous explicit wake plus automatic scan must all be tested instead of excluded by fixtures.&lt;/p&gt;

&lt;h2&gt;
  
  
  PASS, FAIL, and NOT RUN are different facts
&lt;/h2&gt;

&lt;p&gt;Our current rerun produced a more useful record than an all-green screenshot. Exact commands, environment, exit codes, and raw output are preserved in the &lt;a href="https://github.com/joinwell52-AI/joinwell52/blob/main/research/manual-runs/2026-08-19-guided-article-pipeline-round1/02-experiment-run-log.md" rel="noopener noreferrer"&gt;experiment run log&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atomic-write tests: 9/9 passed.&lt;/li&gt;
&lt;li&gt;LAN address tests: 5/5 passed.&lt;/li&gt;
&lt;li&gt;Long-horizon planning tests did not load because &lt;code&gt;yaml&lt;/code&gt; was missing.&lt;/li&gt;
&lt;li&gt;Two-phase dispatch tests did not load because &lt;code&gt;@cursor/sdk&lt;/code&gt; was missing.&lt;/li&gt;
&lt;li&gt;The open-edition mobile-publication boundary test ran and failed because current permission semantics no longer match the older test contract. Exact identifiers and the raw assertion diff remain in the experiment log; the public engineering lesson is that implementation, user-facing permission language, and regression tests must move together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under Core S1.0, an environment or infrastructure failure that prevents the test body from running is &lt;strong&gt;NOT RUN&lt;/strong&gt;, not PASS and not automatically a product FAIL. The PWA case is a genuine executed &lt;strong&gt;FAIL&lt;/strong&gt;, but its semantic classification remains open: did the implementation intentionally migrate the contract and leave a stale test, or did it diverge from the approved contract? A test detects drift; it does not possess product authority to choose the contract.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A trustworthy test system must expose product defects, test-environment gaps, and stale tests as distinct conditions.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A minimum 12-case fault-injection set
&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;Scenario&lt;/th&gt;
&lt;th&gt;Minimum verdict&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;Two sources declare one TASK ID&lt;/td&gt;
&lt;td&gt;Report conflict; do not overwrite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;One TASK exists in two lifecycle directories&lt;/td&gt;
&lt;td&gt;Preserve the dual-location conflict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Crash during temp write&lt;/td&gt;
&lt;td&gt;Canonical file remains readable; temp can be cleaned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Repeated EPERM/ENOENT on replace&lt;/td&gt;
&lt;td&gt;Bounded retry; final failure remains visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Duplicate watcher event&lt;/td&gt;
&lt;td&gt;Repeat observation, not business commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Missed watcher event; reconciliation only&lt;/td&gt;
&lt;td&gt;Durable task is eventually found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Target agent is busy&lt;/td&gt;
&lt;td&gt;No double dispatch; record the block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Dependency or gate is unmet&lt;/td&gt;
&lt;td&gt;Do not start a session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Crash after dispatch intent&lt;/td&gt;
&lt;td&gt;Restart recognizes intent without session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Crash after session start, before commit&lt;/td&gt;
&lt;td&gt;Avoid blind duplicate start through identity/idempotency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;REPORT is replayed&lt;/td&gt;
&lt;td&gt;Preserve history; do not upgrade acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Test dependency is missing&lt;/td&gt;
&lt;td&gt;Report NOT RUN with environment evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Twelve is not an official specification number or a certification suite. It is a minimum transition from demo testing to engineering testing. Performance, load, longevity, security, cross-platform, cross-filesystem, and real-process termination tests still remain.&lt;/p&gt;

&lt;p&gt;The public &lt;a href="https://apple.github.io/foundationdb/testing.html" rel="noopener noreferrer"&gt;FoundationDB testing material&lt;/a&gt; shows the mature version of the idea: deterministic simulation, fault injection, and reproducible seeds can turn rare interleavings into repeatable experiments. Its results do not transfer to CodeFlowMu. Its method does: random exploration can be broad, but failure reproduction must be narrow.&lt;/p&gt;

&lt;p&gt;The purpose of testing a file-based multi-agent Runtime is not to prove that “files are reliable.” It is to prove that when files, events, processes, and agents can all fail, the system can still explain the current facts, incomplete actions, and the next authority allowed to decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primary sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/tmpa-core-specification-s1.0" rel="noopener noreferrer"&gt;TMPA Core Specification S1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/implementation-case-i1.0" rel="noopener noreferrer"&gt;Implementation Case I1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/a859e6747fe6e5e2d686e0114c77774726d7f748/spec/fcop-v3-spec.md" rel="noopener noreferrer"&gt;FCoP v3 specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html" rel="noopener noreferrer"&gt;POSIX rename&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apple.github.io/foundationdb/testing.html" rel="noopener noreferrer"&gt;FoundationDB Simulation and Testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Other language: &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/engineering/2026-08-19-agent-dispatch-fault-injection" rel="noopener noreferrer"&gt;中文研究原文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More research and engineering records: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Do You Stay in Control of an AI Team After Leaving Your Computer? A Two-Plane Design for Local Execution and Mobile Control</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Thu, 20 Aug 2026 07:20:51 +0000</pubDate>
      <link>https://dev.to/joinwell52/how-do-you-stay-in-control-of-an-ai-team-after-leaving-your-computer-a-two-plane-design-for-local-26nl</link>
      <guid>https://dev.to/joinwell52/how-do-you-stay-in-control-of-an-ai-team-after-leaving-your-computer-a-two-plane-design-for-local-26nl</guid>
      <description>&lt;p&gt;Original research article: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/digital-employee/2026-08-19-local-runtime-mobile-control" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/digital-employee/2026-08-19-local-runtime-mobile-control" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt; start with &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-19-taskbook-to-task-graph" rel="noopener noreferrer"&gt;the long-requirement work graph&lt;/a&gt;, then use &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-19-agent-dispatch-fault-injection" rel="noopener noreferrer"&gt;fault injection&lt;/a&gt; to test the execution boundary. This article covers remote observation and bounded human decisions after leaving the computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  In ten seconds
&lt;/h2&gt;

&lt;p&gt;The computer keeps execution and authoritative facts. The phone provides a constrained view and a small decision surface. Every mobile action returns to the latest server-side version for authority, version, and duplicate-request checks.&lt;/p&gt;

&lt;p&gt;At 7 p.m., a refactor is still running on a computer at home. DEV has submitted changes, OPS is running integration tests, and QA has just found a failure. The human is on a train. What the phone needs is not a miniature IDE. It needs three answers: what happened, which decision requires me, and whether a weak connection can execute my action twice.&lt;/p&gt;

&lt;p&gt;The most dangerous design is a second task database inside the phone app. PC and PWA quickly acquire separate truths: the local task is in review while the cached phone still says active; an offline approval targets an old revision and is later replayed against new work.&lt;/p&gt;

&lt;p&gt;A cleaner boundary separates an execution plane from a control plane.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The PC Runtime owns execution and durable facts. The PWA observes those same facts and sends a small set of human decisions back with version, reason, and an idempotency key—a unique request number that prevents repeated taps from creating repeated decisions.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A PWA is not a second Runtime
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.w3.org/TR/appmanifest/" rel="noopener noreferrer"&gt;W3C Web App Manifest&lt;/a&gt; provides installation metadata, start URLs, and application scope. &lt;a href="https://www.w3.org/TR/service-workers/" rel="noopener noreferrer"&gt;Service Workers&lt;/a&gt; provide event-driven network mediation and caching. Browsers may terminate a service worker and restart it when an event arrives. That is useful for an offline shell, caching, and notifications; it is not a reliable process for a model session that runs for hours.&lt;/p&gt;

&lt;p&gt;The first system boundary should therefore be explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PC / Execution &amp;amp; Fact Plane              Mobile / Bound Control Plane
┌───────────────────────────┐            ┌──────────────────────────┐
│ CodeFlowMu Runtime        │            │ PWA                      │
│ - Watch / dispatch        │            │ - Team status            │
│ - Model sessions          │&amp;lt;--API/SSE--│ - Task / report detail    │
│ - Tests / evidence        │            │ - Approval with reason    │
│ - FCoP work artifacts     │            │ - Device / link status    │
└─────────────┬─────────────┘            └────────────┬─────────────┘
              │ authoritative files                   │ no second task DB
              v                                       │
      TASK / REPORT / REVIEW / events &amp;lt;───────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FCoP remains a protocol in this design: it defines work artifacts, path-based state, and event history. CodeFlowMu is the engineering rail that runs agents, observes files, starts sessions, and exposes PC/PWA services. PWA behavior must not be advertised as a capability of the protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the phone minimally needs to show
&lt;/h2&gt;

&lt;p&gt;A useful control plane is not measured by page count. A minimum product can have six surfaces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Team status:&lt;/strong&gt; which roles are idle, busy, blocked, or offline, with an observation time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task state and hierarchy:&lt;/strong&gt; current task, parent/child relations, revision, location, and blocking reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports and evidence:&lt;/strong&gt; who asserted what, whether tests are PASS/FAIL/NOT RUN, and where evidence lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pending decisions:&lt;/strong&gt; objects awaiting approve, reject, pause, or rework authority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity:&lt;/strong&gt; append-only meaningful events, rather than treating chat bubbles as a state machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device status:&lt;/strong&gt; bound devices, last seen, session expiry, and LAN/Gateway reachability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every surface must answer, “Which authoritative record produced this value?” If the list comes from a file reader, details from a separate database replica, and notifications from in-memory events, the three will eventually disagree about one task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/tmpa-architecture-paper-a1.0" rel="noopener noreferrer"&gt;TMPA Architecture Paper A1.0&lt;/a&gt; calls for a stable primary carrier for governed work. Multiple writers use separate asynchronous streams that a deterministic Reader aggregates. Applied to mobile control, this does not require “files as the only database.” It requires every cache and index to remain an explicitly derived view rather than quietly acquiring primary authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Binding is a device lifecycle, not a permanent QR code
&lt;/h2&gt;

&lt;p&gt;The current CodeFlowMu &lt;a href="https://github.com/joinwell52-AI/CodeFlowMu-open/blob/ed5634c718b9e238c44bb70851020c9793546fe6/codeflowmu-shell/src/mobile/mobileBindStore.ts" rel="noopener noreferrer"&gt;binding store&lt;/a&gt; separates a short-lived pending binding from durable device identity. The durable device record stores a session-token hash. To return the same result for a repeated browser request, an in-process completion record retains the original session token while that record remains in memory. Eligibility to replay the first result ends after ten minutes; the expired record is removed lazily when that binding ID is accessed again, not by a timer at the ten-minute mark. That tradeoff belongs in the threat model; it must not be simplified to “the system only stores hashes.” The presence of code is not a security certification.&lt;/p&gt;

&lt;p&gt;A stricter target binding contract should include the following. The current ten-minute idempotent replay window is an intentional compatibility policy, not strict single use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The PC generates a short-lived, single-use entry.&lt;/li&gt;
&lt;li&gt;Confirmation atomically consumes the pending token; a same-token network retry returns the same result only within a bounded window, while wrong, conflicting, or expired tokens are rejected.&lt;/li&gt;
&lt;li&gt;The server issues an expiring, revocable device session.&lt;/li&gt;
&lt;li&gt;The client stores only required credentials; logs, screenshots, and URLs do not echo them.&lt;/li&gt;
&lt;li&gt;The PC can list, disable, and rotate devices.&lt;/li&gt;
&lt;li&gt;High-risk actions may require fresh authentication rather than a browsing session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Binding links, QR codes, session tokens, real task bodies, and chat messages do not belong in public screenshots, Git, or ordinary debug logs. “Do not leak this” in a prompt is not a security boundary; Core S1.0's separation of role authority applies to UI actions too.&lt;/p&gt;

&lt;h2&gt;
  
  
  A mobile approval is not a &lt;code&gt;status&lt;/code&gt; edit
&lt;/h2&gt;

&lt;p&gt;The dangerous request is simply “task 1 is approved.” A tunnel drops the connection, the phone retries three times, and meanwhile the task changes. The server now has repeated approval writes with no proof of which version the user saw.&lt;/p&gt;

&lt;p&gt;A safer target protocol sends an object ID, observed version fingerprint, decision, non-empty reason, and unique request number. This is an architectural example, not a claim about a published CodeFlowMu API or an already connected mobile Planning Gate.&lt;/p&gt;

&lt;p&gt;Suppose QA writes a failed report on the PC and the phone displays “rework decision required.” When an administrator taps approve-rework, the client should submit the object ID, observed revision, decision enum, non-empty reason, idempotency key, and client time. The server re-reads canonical state, validates authority and revision, appends the decision, and returns a new server version.&lt;/p&gt;

&lt;p&gt;Weak networks require fail-closed behavior: when version, authority, or outcome is uncertain, the system does not proceed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the revision changed, reject the old decision and require a reread.&lt;/li&gt;
&lt;li&gt;If an idempotency key is replayed, return the first result without appending another decision.&lt;/li&gt;
&lt;li&gt;If the request times out, display “outcome unknown,” not success.&lt;/li&gt;
&lt;li&gt;Approval means the Runtime may attempt work; it does not mean execution completed.&lt;/li&gt;
&lt;li&gt;Execution still returns through REPORT, tests, and independent review evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/tmpa-core-specification-s1.0" rel="noopener noreferrer"&gt;TMPA Core S1.0&lt;/a&gt; separates execution claims, validation results, and acceptance decisions. Mobile UI transports human authority into the same governance chain; convenience does not permit those roles to collapse.&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%2Fpzq777gnvan8bnowl9fm.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%2Fpzq777gnvan8bnowl9fm.png" alt="Target decision contract in which a phone sends a revision-bound, idempotent request to local authority for device, permission, revision, and replay checks" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. This is the target decision boundary, not a claim about the current mobile API. The phone remains an entry point; the authoritative service should recheck device session, role capability, target revision, and idempotency. FCoP REVIEW and Operation Approval remain separate planes. Source: TMPA Core S1.0, FCoP v3, and the verified boundaries of current CodeFlowMu device and operation-approval implementations.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  LAN and Gateway are reachability paths, not fact sources
&lt;/h2&gt;

&lt;p&gt;On the same network, a phone may connect directly to the PC service. Away from home, a constrained Gateway may relay requests and events. The paths change reachability. They must not change the authoritative source of TASK, REPORT, approval, and device state.&lt;/p&gt;

&lt;p&gt;On 2026-08-19, we reran the current CodeFlowMu &lt;a href="https://github.com/joinwell52-AI/CodeFlowMu-open/blob/ed5634c718b9e238c44bb70851020c9793546fe6/codeflowmu-shell/src/__tests__/lanNetwork.test.ts" rel="noopener noreferrer"&gt;LAN-address test file&lt;/a&gt;: &lt;strong&gt;5 tests passed&lt;/strong&gt;. Exact commands, environment, exit codes, and raw output are preserved in the &lt;a href="https://github.com/joinwell52-AI/joinwell52/blob/main/research/manual-runs/2026-08-19-guided-article-pipeline-round1/02-experiment-run-log.md" rel="noopener noreferrer"&gt;experiment run log&lt;/a&gt;. That supports a limited address-selection implementation claim. It does not establish public reachability, NAT behavior, TLS, Gateway longevity, or end-to-end mobile security.&lt;/p&gt;

&lt;p&gt;The current open-edition implementation still keeps remote mobile publication read-only/external, but this run found that current permission semantics and an older regression test no longer agree. Exact error identifiers belong in the experiment record, not the article's main narrative. The general lesson is stronger: &lt;strong&gt;authority must align across backend enforcement, user-facing permission language, and regression tests&lt;/strong&gt;, or the phone may display a capability that does not exist. A test detects drift; product authority must decide the contract and synchronize all three surfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weak networks and caches: stale views may be readable; stale decisions must not execute
&lt;/h2&gt;

&lt;p&gt;A PWA may cache its shell and the most recent read-only snapshot, but the page must display data version, server time, and connection state. A practical policy is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline users may read a task explicitly labeled “as of 19:02.”&lt;/li&gt;
&lt;li&gt;The client does not cache an approval token that can be replayed unconditionally.&lt;/li&gt;
&lt;li&gt;Reconnection performs version reconciliation before enabling write buttons.&lt;/li&gt;
&lt;li&gt;Server events trigger incremental refresh, while full reconciliation repairs missed events.&lt;/li&gt;
&lt;li&gt;An old client, incompatible schema, or uncertain authority forces read-only mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This direction is consistent with local-first research on local ownership, offline availability, and cross-device coordination. That paper does not validate our implementation. CodeFlowMu still needs end-to-end experiments for real weak networks, clock skew, cache corruption, device revocation, and Gateway failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 15-point acceptance checklist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Facts and display&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List and detail views resolve to the same canonical artifact and revision.&lt;/li&gt;
&lt;li&gt;Cached views show observation time instead of impersonating real-time state.&lt;/li&gt;
&lt;li&gt;REPORT, REVIEW, decision, and execution state are not compressed into one &lt;code&gt;done&lt;/code&gt; value.&lt;/li&gt;
&lt;li&gt;Full reconciliation repairs missed real-time events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Binding and authority&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The pending binding token expires and is consumed once; bounded idempotent replay returns only the same result, and the token cannot be recovered from logs.&lt;/li&gt;
&lt;li&gt;Device sessions can expire, rotate, and be revoked.&lt;/li&gt;
&lt;li&gt;The server rechecks roles for high-risk actions instead of trusting visible buttons.&lt;/li&gt;
&lt;li&gt;A PWA screen does not confer external publication authority on the open edition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mobile writes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every decision carries object ID, current revision, decision, reason, and idempotency key.&lt;/li&gt;
&lt;li&gt;A changed revision makes the stale decision fail closed.&lt;/li&gt;
&lt;li&gt;Timeout produces “unknown,” never client-declared success.&lt;/li&gt;
&lt;li&gt;Approval and execution success are displayed separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Network and privacy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LAN and Gateway use the same fact and authority services.&lt;/li&gt;
&lt;li&gt;Weak network, disconnect, repeated request, server restart, and device revocation have regression coverage.&lt;/li&gt;
&lt;li&gt;Public screenshots, repositories, telemetry, and ordinary logs exclude QR codes, binding URLs, tokens, and real task text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cloud Runtime is another valid architecture. If tasks execute in a remote sandbox, the phone may directly control that cloud authority. This article addresses the failure and trust model of a local agent team; it does not argue that all agents must run on a PC.&lt;/p&gt;

&lt;p&gt;For a local system, the best mobile client is not the one with the most features. It is the one that lets a human leave the desk, see the same facts, make a small number of authorized decisions, and refuse to manufacture a second truth when network and version are uncertain.&lt;/p&gt;

&lt;h2&gt;
  
  
  How TMPA, FCoP, CodeFlowMu, and Mobile divide responsibility
&lt;/h2&gt;

&lt;p&gt;These names describe four layers, not four competing products.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;TMPA Core defines governance semantics.&lt;/strong&gt; It specifies stable work carriers, role responsibility, lifecycle state, independent acceptance, conflict preservation, and deterministic reconstruction. A stable primary carrier is the stable reference point for governed work; TMPA does not declare that every system must use a PC or local disk. Its crucial boundary here is that an execution report is a fact claim, while acceptance is a decision made by an authorized role.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FCoP projects collaboration into files.&lt;/strong&gt; It defines TASK, REPORT, ISSUE, REVIEW, lifecycle locations, and transition events that people and tools can inspect. It does not choose a LAN address, issue device credentials, draw the mobile UI, or own an agent session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeFlowMu is the running engineering system.&lt;/strong&gt; In the local deployment discussed here, the project root, Runtime, and server-side readers form the authoritative execution plane. CodeFlowMu runs agents and tests, checks dependencies and permissions, manages devices, and distinguishes task review from operation approval. That local authority is a CodeFlowMu deployment choice, not a universal TMPA requirement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeFlowMu Mobile PWA is a constrained remote surface.&lt;/strong&gt; It displays server-derived facts and returns a small set of human requests to the same authority. It may cache a stale view, but it does not become a second Runtime or bypass server-side checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Under the target decision contract described in this article, tapping Approve would send the target, observed revision, reason, and idempotency key. The authoritative service would then recheck the device session, role capability, current revision, and prior use of the request key. Current public CodeFlowMu code proves narrower pieces: device-session checks and a separate Operation Approval service whose server creates an action ID for a digest-bound attempt. It does not prove that the existing mobile route already accepts and enforces this client-supplied revision/idempotency contract. A future task-review path may record a decision in the applicable REVIEW chain; a high-risk Git or external-write action remains a separate operation approval. Later REPORT and verification evidence still determine what actually happened.&lt;/p&gt;

&lt;p&gt;In one line: &lt;strong&gt;TMPA defines the governance semantics, FCoP defines the collaboration artifacts, CodeFlowMu owns local execution and authority checks, and the phone remains a bounded remote entry point.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Primary sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/tmpa-architecture-paper-a1.0" rel="noopener noreferrer"&gt;TMPA Architecture Paper A1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/tmpa-core-specification-s1.0" rel="noopener noreferrer"&gt;TMPA Core Specification S1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/publications/implementation-case-i1.0" rel="noopener noreferrer"&gt;Implementation Case I1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joinwell52-AI/CodeFlowMu-open" rel="noopener noreferrer"&gt;CodeFlowMu Open&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/appmanifest/" rel="noopener noreferrer"&gt;W3C Web App Manifest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/service-workers/" rel="noopener noreferrer"&gt;W3C Service Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martin.kleppmann.com/2019/10/23/local-first-at-onward.html" rel="noopener noreferrer"&gt;Local-first software paper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Other language: &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/digital-employee/2026-08-19-local-runtime-mobile-control" rel="noopener noreferrer"&gt;中文研究原文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More research and engineering records: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Multi-Agent Governance Can Start with Files</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:39:21 +0000</pubDate>
      <link>https://dev.to/joinwell52/why-multi-agent-governance-can-start-with-files-2d30</link>
      <guid>https://dev.to/joinwell52/why-multi-agent-governance-can-start-with-files-2d30</guid>
      <description>&lt;h1&gt;
  
  
  Why Multi-Agent Governance Can Start with Files
&lt;/h1&gt;

&lt;p&gt;Original research article: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-18-files-first-multi-agent-governance" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/engineering/2026-08-18-files-first-multi-agent-governance" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first problem in multi-Agent collaboration is not how to open more sessions. It is how to turn one role's task, another role's delivery, and a third role's review into shared facts that every participant can inspect.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which task version was authoritative?&lt;/li&gt;
&lt;li&gt;Who changed the scope?&lt;/li&gt;
&lt;li&gt;Which test report belongs to which implementation?&lt;/li&gt;
&lt;li&gt;Did the rejection reason enter the rework request?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The missing component is not a smarter model. It is shared operational truth.&lt;/p&gt;

&lt;p&gt;For a local-first, single-machine system with low or moderate concurrency, that truth can begin as files. Tasks, reports, issues and review decisions become explicit artifacts. Paths expose current lifecycle state. Ordered events preserve how state changed.&lt;/p&gt;

&lt;p&gt;The protocol starts with one rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI roles cannot coordinate only in their heads. The work must be written into files.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not an argument that files should replace databases, queues or workflow engines. It is an ordering principle: make the work visible before upgrading the control plane.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful Unix lesson is a common interface
&lt;/h2&gt;

&lt;p&gt;Ritchie and Thompson’s &lt;a href="https://pdos.csail.mit.edu/6.828/2014/readings/ritchie78unix.pdf" rel="noopener noreferrer"&gt;The UNIX Time-Sharing System&lt;/a&gt; is often reduced to “everything is a file.” The more useful engineering lesson is that ordinary files, devices and inter-process I/O could be reached through compatible interfaces and hierarchical names.&lt;/p&gt;

&lt;p&gt;That idea transfers to Agent governance in three ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A human can inspect a task in an editor, an Agent can parse it, a CLI can scan it, and a web view can index it without requiring one SDK.&lt;/li&gt;
&lt;li&gt;Names and paths can carry stable meaning: &lt;code&gt;inbox/&lt;/code&gt;, &lt;code&gt;active/&lt;/code&gt;, &lt;code&gt;review/&lt;/code&gt; and &lt;code&gt;done/&lt;/code&gt; are a state surface both programs and people can understand.&lt;/li&gt;
&lt;li&gt;Creation, validation, transition, review and archival can remain separate tools if they honor the same artifact contract.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Unix still needed processes, permissions, pipes and internal interlocks. Files do not automatically provide safe concurrent updates, distributed consistency or exactly-once execution. Here, “files first” means externalizing coordination facts through open artifacts where practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  A directory becomes a work ledger only with contracts
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://ojs.aaai.org/aimagazine/index.php/aimagazine/article/view/537" rel="noopener noreferrer"&gt;blackboard model&lt;/a&gt; describes multiple knowledge sources contributing intermediate results to a shared problem-solving surface. A directory can implement such a surface, but an unstructured folder is not governance.&lt;/p&gt;

&lt;p&gt;It becomes useful only when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every artifact has a defined identity;&lt;/li&gt;
&lt;li&gt;current state has one authoritative location;&lt;/li&gt;
&lt;li&gt;transitions leave ordered evidence;&lt;/li&gt;
&lt;li&gt;roles have explicit responsibilities; and&lt;/li&gt;
&lt;li&gt;completion depends on evidence rather than an Agent assertion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqa2w6urgdkd6oxy0xbwv.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%2Fqa2w6urgdkd6oxy0xbwv.png" alt="Multiple roles write to one inspectable file, path and event ledger" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A shared ledger coordinates work facts and evidence. It does not replace execution or distributed consistency.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Chat is organized by who spoke when. A work ledger is organized by the work object, current owner, evidence and decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate four kinds of work facts
&lt;/h2&gt;

&lt;p&gt;FCoP uses four IPC artifacts to keep different claims apart:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Minimum useful content&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TASK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who is expected to deliver what?&lt;/td&gt;
&lt;td&gt;sender, recipient, scope, priority, acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REPORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What did the worker actually do?&lt;/td&gt;
&lt;td&gt;task reference, changes, tests, evidence, risks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ISSUE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What is blocking delivery?&lt;/td&gt;
&lt;td&gt;symptom, impact, attempts, required decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REVIEW&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who judged what evidence?&lt;/td&gt;
&lt;td&gt;subject, reviewer, verdict, rationale, next action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Five lifecycle buckets: use location to answer “where is the task now?”
&lt;/h2&gt;

&lt;p&gt;The five directories under &lt;code&gt;_lifecycle/&lt;/code&gt; form a minimal observable state machine. &lt;strong&gt;A TASK may occupy only one bucket at a time; moving the file is the state transition.&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;Lifecycle bucket&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Typical action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;inbox/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A new task exists. Who will claim it?&lt;/td&gt;
&lt;td&gt;create, then wait for &lt;code&gt;claim&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;active/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who is executing or reworking it?&lt;/td&gt;
&lt;td&gt;claim; rejected work returns here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;review/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delivery was submitted. Who will decide?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;submit&lt;/code&gt;, then approve or reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;done/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Did the protocol lifecycle finish or receive approval?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;finish&lt;/code&gt; or &lt;code&gt;approve&lt;/code&gt;; this is not yet business acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;archive/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Has the work left the active collaboration surface?&lt;/td&gt;
&lt;td&gt;archive after upstream acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inbox --claim--&amp;gt; active --submit--&amp;gt; review --approve--&amp;gt; done --archive--&amp;gt; archive
                    |   ^                   |
                    |   +------reject-------+
                    +---------finish-------&amp;gt;+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four rules keep this model unambiguous:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One current location:&lt;/strong&gt; the same TASK cannot exist in both &lt;code&gt;active&lt;/code&gt; and &lt;code&gt;done&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move, do not relabel:&lt;/strong&gt; state changes through controlled migration, not an Agent editing a mutable status field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate now from history:&lt;/strong&gt; the path answers “where is it now”; append-only &lt;code&gt;transitions:&lt;/code&gt; records how it arrived there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate state from credentials:&lt;/strong&gt; REPORT, ISSUE and REVIEW are delivery, blocking and governance evidence, not current task state.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FCoP v2's &lt;code&gt;tasks / reports / issues / shared / log&lt;/code&gt; were the old five buckets organized by &lt;strong&gt;artifact type&lt;/strong&gt;. FCoP v3's &lt;code&gt;_lifecycle/&lt;/code&gt; buckets organize TASK files by &lt;strong&gt;work stage&lt;/strong&gt;. They are different concepts.&lt;/p&gt;

&lt;p&gt;Likewise, &lt;code&gt;_lifecycle/review/&lt;/code&gt; means a TASK awaits a decision, while &lt;code&gt;reviews/REVIEW-*.md&lt;/code&gt; is an independent governance judgment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For current lifecycle position, the path is the authoritative NOW fact. For business completion, the upstream role's acceptance of the REPORT and its evidence is decisive.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This distinction keeps a worker's completion claim, protocol approval, and upstream acceptance from collapsing into one ambiguous &lt;code&gt;done&lt;/code&gt; label.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspectability improves rework
&lt;/h2&gt;

&lt;p&gt;The FCoP repository contains a small &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/a859e6747fe6e5e2d686e0114c77774726d7f748/docs/tutorials/assets/tetris-en/evidence" rel="noopener noreferrer"&gt;Tetris dogfood evidence set&lt;/a&gt;. A task was underspecified, the implementer guessed instead of raising an ISSUE, and the defect appeared in the guessed area. Review rejected the result, and an administrator created a sharper rework task.&lt;/p&gt;

&lt;p&gt;One example does not prove a production-scale defect reduction. It supports a narrower conclusion: when task, report, review and rework remain separate, failure does not collapse into a vague memory. A maintainer can locate where ambiguity entered and whether the rejection became an actionable next task.&lt;/p&gt;

&lt;p&gt;The ledger does not eliminate mistakes. It makes them attributable and convertible into decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  When files are a sensible starting point
&lt;/h2&gt;

&lt;p&gt;A file-backed ledger fits when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;work stays on one machine or in a bounded workspace;&lt;/li&gt;
&lt;li&gt;human readability matters more than millisecond latency;&lt;/li&gt;
&lt;li&gt;artifacts should fit Git, backups and ordinary tools;&lt;/li&gt;
&lt;li&gt;people need to inspect and approve Agent work directly; and&lt;/li&gt;
&lt;li&gt;the protocol is evolving faster than the control-plane implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pressure for stronger infrastructure appears when many machines compete for tasks, strict transactions or granular authorization are required, leases and throughput guarantees become central, network-filesystem semantics are insufficient, or directory scanning becomes a bottleneck.&lt;/p&gt;

&lt;p&gt;The useful separation is between an &lt;strong&gt;artifact plane&lt;/strong&gt;, which preserves readable evidence, and an &lt;strong&gt;execution plane&lt;/strong&gt;, which owns scheduling, isolation, retries and scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimum ledger you can inspect today
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
  fcop/
    fcop.json
    _lifecycle/
      inbox/
      active/
      review/
      done/
      archive/
    reports/
    issues/
    shared/
    reviews/
    history/
      YYYY-MM-DD/
  workspace/
    &amp;lt;slug&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure contains three different planes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;_lifecycle/&lt;/code&gt; is the &lt;strong&gt;current TASK state plane&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reports/&lt;/code&gt;, &lt;code&gt;issues/&lt;/code&gt;, and &lt;code&gt;reviews/&lt;/code&gt; form the &lt;strong&gt;evidence and governance plane&lt;/strong&gt; and do not move with TASK state;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;history/&lt;/code&gt; is the &lt;strong&gt;long-term history plane&lt;/strong&gt; for closed tasks and paired reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each TASK keeps append-only migration history in &lt;code&gt;transitions:&lt;/code&gt;. A separate &lt;code&gt;events/&lt;/code&gt; directory would create another truth that could drift from the task file.&lt;/p&gt;

&lt;p&gt;Then ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does each task have a unique identity and recipient?&lt;/li&gt;
&lt;li&gt;Can a human find the authoritative version in under a minute?&lt;/li&gt;
&lt;li&gt;Does “done” link to tests, a diff or environmental evidence?&lt;/li&gt;
&lt;li&gt;Is the worker report separate from the reviewer judgment?&lt;/li&gt;
&lt;li&gt;Does rejection create a traceable next action?&lt;/li&gt;
&lt;li&gt;Do transitions retain time, actor, source and destination?&lt;/li&gt;
&lt;li&gt;Can a restarted runtime reconstruct what happened from disk?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If most answers are “no,” adding more Agents will usually increase ambiguity rather than throughput.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “everything is a file” contributes to engineering
&lt;/h2&gt;

&lt;p&gt;The point is not to replace databases, queues and workflow engines with Markdown. It is to establish an open protocol surface with five engineering properties:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engineering property&lt;/th&gt;
&lt;th&gt;How the ledger provides it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Addressable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;stable task identity, sender, recipient and parent relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;lifecycle buckets expose the current stage directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replayable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;transitions:&lt;/code&gt; preserves time, source, destination, actor and tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verifiable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TASK, REPORT, ISSUE and REVIEW can be checked against each other&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Composable and evolvable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;editors, Git, CLIs and web views share the same artifacts, while stronger infrastructure can be added later&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Stable identity + path state + transition history + delivery evidence = a governable shared work ledger.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The ledger does not solve contention, transactions, authorization, retries or scheduling by itself. It first answers more basic questions: was the work formally delegated, who owns it now, why was it rejected, and what evidence justified acceptance?&lt;/p&gt;

&lt;p&gt;Starting with files is neither nostalgia nor a rejection of infrastructure. Its engineering value is to let humans, Agents and tools share the same inspectable facts, then upgrade the execution plane in response to real pressure.&lt;/p&gt;

&lt;p&gt;FCoP is not an industry standard or a final answer. It offers a testable starting point: &lt;strong&gt;before expanding the control plane, make the collaboration visible, machine-readable and evidence-checkable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next implementation question is how to make path transitions testable without exposing partial artifacts. That is covered in &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-18-fcop-file-state-machine" rel="noopener noreferrer"&gt;Files, Paths, and Events: Implementing and Testing the FCoP State Machine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://pdos.csail.mit.edu/6.828/2014/readings/ritchie78unix.pdf" rel="noopener noreferrer"&gt;UNIX paper&lt;/a&gt; · &lt;a href="https://ojs.aaai.org/aimagazine/index.php/aimagazine/article/view/537" rel="noopener noreferrer"&gt;Blackboard model&lt;/a&gt; · &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/a859e6747fe6e5e2d686e0114c77774726d7f748/spec/fcop-v3-spec.md" rel="noopener noreferrer"&gt;FCoP v3 specification&lt;/a&gt; · &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/a859e6747fe6e5e2d686e0114c77774726d7f748/adr/ADR-0038-fcop-boundary-charter.md" rel="noopener noreferrer"&gt;FCoP boundary charter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More research notes: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Completion Claim Accepted State: A Verification Contract for Agents</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Sun, 16 Aug 2026 15:25:25 +0000</pubDate>
      <link>https://dev.to/joinwell52/completion-claim-accepted-state-a-verification-contract-for-agents-4ef9</link>
      <guid>https://dev.to/joinwell52/completion-claim-accepted-state-a-verification-contract-for-agents-4ef9</guid>
      <description>&lt;h1&gt;
  
  
  Completion Claim ≠ Accepted State: A Verification Contract for Agents
&lt;/h1&gt;

&lt;p&gt;Original research note: &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/digital-employee/2026-08-05-universal-verifier-completion-contract" rel="noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/digital-employee/2026-08-05-universal-verifier-completion-contract" rel="noopener noreferrer"&gt;中文&lt;/a&gt; · &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An Agent finishes its last action and says the task is complete. Should the runtime believe it?&lt;/p&gt;

&lt;p&gt;In long-running Agent work, that is where a surprising number of failures begin. The final message may sound convincing even when a required action was skipped, the result was never read back, an external blocker stopped the workflow, or an unwanted side effect occurred.&lt;/p&gt;

&lt;p&gt;The worker's statement is useful, but it is still only a &lt;strong&gt;completion claim&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Microsoft Research's Universal Verifier work makes this distinction concrete for computer-use Agents. Its architecture separates process quality from outcome attainment, distinguishes controllable from uncontrollable failures, and retrieves screenshot evidence against individual rubric criteria instead of trusting the last screen or the Agent's own summary.&lt;/p&gt;

&lt;p&gt;The reusable engineering pattern is not “add one more judge model.” It is a separation of responsibilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;worker action
→ completion claim
→ deterministic readback + claim-specific evidence
→ independent verification
→ acceptance authority
→ completion receipt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three checks that should not be collapsed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Deterministic checks
&lt;/h3&gt;

&lt;p&gt;These answer questions that should not require interpretation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the database record exist?&lt;/li&gt;
&lt;li&gt;Did the expected file change?&lt;/li&gt;
&lt;li&gt;Did the test suite pass?&lt;/li&gt;
&lt;li&gt;Was the commit created and pushed?&lt;/li&gt;
&lt;li&gt;Is the external system actually in the requested state?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Learned verification
&lt;/h3&gt;

&lt;p&gt;Some outcomes need interpretation. A verifier may inspect a trajectory, screenshots, intent alignment, failure responsibility, and side effects. This is useful, but it should produce a versioned judgment with evidence references—not an unquestionable truth value.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Human or policy acceptance
&lt;/h3&gt;

&lt;p&gt;Irreversible, ambiguous, regulated, or high-impact work still needs an acceptance authority. That authority may accept, reject, escalate, or leave the claim undetermined.&lt;/p&gt;

&lt;p&gt;The three checks can disagree. A worker may follow the correct process but be blocked by a CAPTCHA. A visible outcome may be achieved through an unexpected valid route. A task may look complete while producing an unrequested side effect. Preserving those disagreements is safer than forcing every run into &lt;code&gt;completed&lt;/code&gt; or &lt;code&gt;failed&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal runtime state model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;running
→ completion_claimed
→ verifying
→ accepted | rejected | escalated | undetermined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Microsoft paper reports strong results, including a 1% false-positive rate on its internal split and 8% on the external Browserbase split. That is promising, but not a universal production guarantee. The benchmark is relatively small, the work focuses on web computer-use trajectories, and human labels are still judgments rather than an objective completion oracle.&lt;/p&gt;

&lt;p&gt;The main lesson is architectural: &lt;strong&gt;the same component should not be both claimant and final acceptor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How are you handling this in Agent systems?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the worker mark its own task complete?&lt;/li&gt;
&lt;li&gt;Which evidence must exist before &lt;code&gt;done&lt;/code&gt; is accepted?&lt;/li&gt;
&lt;li&gt;Do you preserve &lt;code&gt;undetermined&lt;/code&gt; and &lt;code&gt;escalated&lt;/code&gt; as real states?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://arxiv.org/abs/2604.06240" rel="noopener noreferrer"&gt;Microsoft Research paper&lt;/a&gt; · &lt;a href="https://github.com/microsoft/fara" rel="noopener noreferrer"&gt;Universal Verifier implementation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More research notes: &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Trace Is Not Governance: From Work Facts to SaaW</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Thu, 13 Aug 2026 17:14:48 +0000</pubDate>
      <link>https://dev.to/joinwell52/trace-is-not-governance-from-work-facts-to-saaw-im4</link>
      <guid>https://dev.to/joinwell52/trace-is-not-governance-from-work-facts-to-saaw-im4</guid>
      <description>&lt;h1&gt;
  
  
  Trace Is Not Governance: From Work Facts to SaaW
&lt;/h1&gt;

&lt;h2&gt;
  
  
  An engineering lineage through TMPA, FCoP, CodeFlowMu, and Self-Morphing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/industry/2026-08-10-saaw-software-as-an-agent-worker" rel="noopener noreferrer"&gt;Read the complete 23-section manifesto, &lt;em&gt;From SaaS to SaaW&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/zh/industry/2026-08-14-trace-governance-saaw-visual-essay" rel="noopener noreferrer"&gt;中文版&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/assets/covers/01-saaw-manifesto-cover-agent-worker.png" rel="noopener noreferrer"&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%2Fwcklq58riigfm8shi0wr.png" alt="SaaW — Software as an Agent Worker" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An Agent called tools, modified files, and finally returned &lt;code&gt;completed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What does that prove?&lt;/p&gt;

&lt;p&gt;It proves only that &lt;strong&gt;an execution occurred&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It does not automatically prove that the task was legally completed, the tests were confirmed, the delivery was reviewed, conflicts were resolved, or any role had the authority to move the task into its next state.&lt;/p&gt;

&lt;p&gt;This is the architectural boundary that long-running Agent systems most often overlook:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Trace is not Governance.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/assets/covers/15-saaw-trace-vs-governance-v2.jpg" rel="noopener noreferrer"&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%2F15323xbmcbkmaakk4n5v.jpg" alt="Trace is not Governance: the difference between execution events and governed work state" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. A trace records events. Governance reconstructs legal work state from durable facts, rules, responsibility, and authority.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why an execution trace is not enough
&lt;/h2&gt;

&lt;p&gt;A trace can answer which tool a model called, when an operation occurred, and what the tool returned.&lt;/p&gt;

&lt;p&gt;Real work requires another set of answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who authorized the task?&lt;/li&gt;
&lt;li&gt;Who formally accepted responsibility?&lt;/li&gt;
&lt;li&gt;Which artifact represents the official delivery?&lt;/li&gt;
&lt;li&gt;Can the test result be independently verified?&lt;/li&gt;
&lt;li&gt;Who performed the review?&lt;/li&gt;
&lt;li&gt;Is the current lifecycle state legal?&lt;/li&gt;
&lt;li&gt;Do unresolved conflicts, missing evidence, or dangling references remain?&lt;/li&gt;
&lt;li&gt;Who continues after a process restart?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding more log lines does not solve these questions. Logs remain system events. Governance concerns work facts, responsibility, and the legal effect of decisions.&lt;/p&gt;

&lt;p&gt;The first step toward a digital employee is therefore not giving an Agent more tools. It is making work facts independent of the Agent session.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. TMPA: Making work facts reconstructable
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TMPA (Textual Multi-Agent Process Architecture)&lt;/strong&gt; is a text-message-based asynchronous multi-agent process architecture designed for SME-first, minimum-infrastructure environments.&lt;/p&gt;

&lt;p&gt;It is not an Agent scheduler or a central runtime. TMPA addresses how tasks, responsibility, evidence, conflicts, and audit state become valid when Agents and humans collaborate asynchronously over time.&lt;/p&gt;

&lt;p&gt;Its core consists of four connected rules:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Text carries durable messages and state; each writer maintains its own local serial stream; multiple serial streams advance asynchronously to form parallel collaboration; readers aggregate available evidence to reconstruct process, responsibility, lifecycle, conflicts, and audit state.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/assets/covers/16-saaw-tmpa-four-rules-v2.jpg" rel="noopener noreferrer"&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%2Fp3l30qdla972bdrb6yhv.jpg" alt="The four TMPA rules and reader-side fact reconstruction" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Each actor appends its own facts. Cross-stream references form a partial order. The Reader aggregates evidence without overwriting conflict.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The important point is not simply “using text instead of a database.” Two deeper principles matter.&lt;/p&gt;

&lt;p&gt;First, responsibility needs a clear source. PM, DEV, QA, and human decision-makers preserve their own local fact streams instead of rewriting another actor's history.&lt;/p&gt;

&lt;p&gt;Second, state is not merely the last value of a field. A Reader recalculates current state from objects such as &lt;code&gt;Task&lt;/code&gt;, &lt;code&gt;Acceptance&lt;/code&gt;, &lt;code&gt;Report&lt;/code&gt;, &lt;code&gt;Review&lt;/code&gt;, &lt;code&gt;Decision&lt;/code&gt;, &lt;code&gt;Issue&lt;/code&gt;, and &lt;code&gt;Correction&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Models may change and processes may restart, but established work facts do not disappear with the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. FCoP: Bringing governance semantics into project collaboration
&lt;/h2&gt;

&lt;p&gt;Theory and specifications need an executable form of coordination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FCoP (File-based Coordination Protocol) is a multi-agent behavioral-governance protocol that uses the filesystem as its sole synchronization primitive.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Its project-visible Profile can be summarized as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Directory is state:&lt;/strong&gt; &lt;code&gt;inbox → active → review → done → archive&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filename is routing:&lt;/strong&gt; sender, recipient, object type, and sequence express identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content is payload:&lt;/strong&gt; Markdown and frontmatter carry tasks, reports, references, and evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic movement is synchronization:&lt;/strong&gt; lifecycle transitions use &lt;code&gt;os.rename()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/assets/covers/17-saaw-fcop-lifecycle-v2.jpg" rel="noopener noreferrer"&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%2F4xevozdrygi9wbjbc2le.jpg" alt="The FCoP project-visible lifecycle and shared fact plane" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3. Lifecycle change moves a project-visible work object instead of overwriting a central status field. Humans, Agents, Readers, and operations tools inspect the same fact plane.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;FCoP is not merely a way to “send messages with files.” It makes handoffs, reports, reviews, decisions, issues, and recovery paths observable, referenceable, and auditable.&lt;/p&gt;

&lt;p&gt;Its boundary is equally important: FCoP governs collaborative behavior. It does not provide model reasoning, process scheduling, identity authentication, or resource allocation, and it is not a complete Agent Runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. CodeFlowMu: Bringing roles, tools, and governance into real execution
&lt;/h2&gt;

&lt;p&gt;If TMPA defines work facts and governance semantics, and FCoP provides a project-visible file-driven coordination protocol, then &lt;strong&gt;CodeFlowMu addresses how those semantics and protocols enter a real Agent runtime world.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Its engineering starting point is not a giant central Agent.&lt;/p&gt;

&lt;p&gt;Reasoning remains in mature model ecosystems. Browsers, APIs, CLIs, MCP, and business systems perform actual operations. CodeFlowMu concentrates on role orchestration, responsibility boundaries, Skill routing, lifecycle, FCoP integration, reports, reviews, recovery, and human decisions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/assets/covers/18-saaw-codeflowmu-runtime-boundary-v2.jpg" rel="noopener noreferrer"&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%2F0mb1l5axroedv98hsrlt.jpg" alt="The CodeFlowMu engineering runtime boundary" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 4. Models reason and tools act. CodeFlowMu organizes work, FCoP carries facts, and TMPA guides governance semantics.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The three are therefore not three similar products:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;th&gt;Non-responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TMPA&lt;/td&gt;
&lt;td&gt;Defines which work facts can become valid and reconstructable&lt;/td&gt;
&lt;td&gt;Does not schedule or execute work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FCoP&lt;/td&gt;
&lt;td&gt;Brings those facts into project-visible collaboration&lt;/td&gt;
&lt;td&gt;Is not a complete Agent Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeFlowMu&lt;/td&gt;
&lt;td&gt;Runs roles, tools, protocols, lifecycle, recovery, and governance&lt;/td&gt;
&lt;td&gt;Does not use runtime events as a substitute for business decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only with these boundaries can a system avoid treating “the Agent returned completed” as “the organization accepted the delivery.”&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Meta-Development Runtime: Development capability becomes production capability
&lt;/h2&gt;

&lt;p&gt;The most important thing about CodeFlowMu is not only that multiple Agents can develop software together.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;More importantly, that development capability can itself become production capability for the next generation of digital employees.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We call this form the &lt;strong&gt;Meta-Development Runtime&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Roles such as PM, DEV, QA, and OPS can build more than conventional software. They can combine job responsibilities, workflows, Skills, permissions, governance policies, validation rules, runtime configuration, recovery rules, and human decision gates into a:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Digital Employee Package: turning a digital employee into an engineered product.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A position capability can then be defined, developed, tested, versioned, deployed, upgraded, and rolled back like software.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Self-Morphing: “Developing itself” under governance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Self-Morphing&lt;/strong&gt; does not mean allowing a running Agent to rewrite itself arbitrarily, nor does it mean an unlimited recursion of Agents creating Agents.&lt;/p&gt;

&lt;p&gt;It describes a strictly isolated and recoverable improvement loop. Production work emits evidence. Evidence exposes a capability gap. The Meta-Development Runtime designs an improvement and produces a new Digital Employee Package. Only after isolated validation and explicit authorization may that version enter the next work cycle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/assets/covers/19-saaw-governed-self-morphing-v2.jpg" rel="noopener noreferrer"&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%2F9fqbiwyhdvp50dwfpp6t.jpg" alt="The governed Meta-Development and Self-Morphing loop" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 5. Evidence can enter meta-development, but meta-development cannot rewrite the live production runtime. Validation and authority control deployment, and a rollback path always remains available.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The complete loop is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Work → Evidence → Gap → Improvement → Isolated Validation → Human or Governance Authorization → Deployment → New Work Cycle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the source of a change is not traceable, tests are not reproducible, deployment is not authorized, the running version is not identifiable, or failure cannot be rolled back, then “self-evolution” is only unauditable automatic rewriting.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Humans do not disappear; they leave the operation layer
&lt;/h2&gt;

&lt;p&gt;SaaW does not remove humans from the system.&lt;/p&gt;

&lt;p&gt;Low-risk, reversible, in-policy work such as retrieval, organization, validation, reporting, and synchronization can increasingly be performed by digital employees. External publication, irreversible modification, money, credentials, privacy, and policy exceptions must stop at a human authority boundary.&lt;/p&gt;

&lt;p&gt;Humans no longer need to perform every click and data transfer. Their responsibilities move toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;defining objectives and authority boundaries;&lt;/li&gt;
&lt;li&gt;handling conflict and exceptions;&lt;/li&gt;
&lt;li&gt;reviewing consequential evidence;&lt;/li&gt;
&lt;li&gt;approving, rejecting, or requesting rework;&lt;/li&gt;
&lt;li&gt;taking final responsibility for high-impact outcomes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In SaaS, humans usually remain in the software operation layer. In SaaW, humans increasingly move into governance and final authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. SaaW: When software begins to carry work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SaaW (Software as an Agent Worker)&lt;/strong&gt; is the higher-level name for this transition. Software stops being only a collection of capabilities operated by people and begins to carry work continuously under explicit job responsibilities, authority boundaries, and governance rules.&lt;/p&gt;

&lt;p&gt;It is not a new chat window, and it is not created by simply adding an Agent. A real digital work subject needs a role, an environment, Skills, permissions, state, governance, evidence, recovery, and human authority boundaries.&lt;/p&gt;

&lt;p&gt;Validated capability must remain separate from the research frontier.&lt;/p&gt;

&lt;p&gt;The public engineering foundation available today includes the TMPA V1.0 architecture paper, core specification, and implementation case; the FCoP protocol and implementation; and the open CodeFlowMu engineering runtime environment. The implementation case pins CodeFlowMu v1.8.0 and records a &lt;strong&gt;14/14&lt;/strong&gt; validation result against TMPA S1.0.&lt;/p&gt;

&lt;p&gt;Standardized Digital Employee Packages, a standardized Agent PC, domain Work Runtimes, and broader Self-Morphing validation remain research and future engineering work.&lt;/p&gt;

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

&lt;p&gt;The decisive change from Agent systems to digital employees is not that a model becomes more human-like. It is that work gains facts, responsibility, evidence, recovery, and authority structures that exist independently of the model session.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TMPA makes work facts valid. FCoP makes coordination facts visible. CodeFlowMu brings them into real execution. The Meta-Development Runtime then turns runtime evidence into Digital Employee Packages and improves them through governed Self-Morphing, ultimately pointing toward SaaW.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Software was once a tool.&lt;br&gt;&lt;br&gt;
Then it became a service.&lt;br&gt;&lt;br&gt;
Now, it is beginning to work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From Software Market to Digital Labor Market.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complete manifesto:&lt;/strong&gt; &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/industry/2026-08-10-saaw-software-as-an-agent-worker" rel="noopener noreferrer"&gt;From SaaS to SaaW: When a Codebase Starts “Developing Itself”&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TMPA V1.0 DOI:&lt;/strong&gt; &lt;a href="https://doi.org/10.5281/zenodo.21888488" rel="noopener noreferrer"&gt;10.5281/zenodo.21888488&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FCoP:&lt;/strong&gt; &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeFlowMu:&lt;/strong&gt; &lt;a href="https://github.com/joinwell52-AI/CodeFlowMu-open" rel="noopener noreferrer"&gt;Open Engineering Runtime&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Version status:&lt;/strong&gt; V1.0 · Published&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Research Center:&lt;/strong&gt; &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Digital Employee Works&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Durable Agent Runtime Is Becoming the Baseline</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Tue, 11 Aug 2026 17:22:18 +0000</pubDate>
      <link>https://dev.to/joinwell52/open-source-engineering-weekly-001-durable-agent-runtime-is-becoming-the-baseline-2oim</link>
      <guid>https://dev.to/joinwell52/open-source-engineering-weekly-001-durable-agent-runtime-is-becoming-the-baseline-2oim</guid>
      <description>&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%2Fjoinwell52-ai.github.io%2Fjoinwell52%2Fassets%2Fcovers%2Fdurable-agent-runtime-dev.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%2Fjoinwell52-ai.github.io%2Fjoinwell52%2Fassets%2Fcovers%2Fdurable-agent-runtime-dev.png" alt="Cover: Durable Agent Runtime Is Becoming the Baseline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Durable Agent Runtime Is Becoming the Baseline
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Persistence, checkpoints, interruption, recovery, sandboxing, and structured runtime operations are becoming standard infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Author: JoinWell52 Research Center · 2026-08-02&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-02-durable-agent-runtime" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;. Visit the &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center home page&lt;/a&gt; for more research and articles. This cross-post uses the original English article as its canonical source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;One of the strongest open-source engineering signals is that agent systems are moving beyond short-lived model loops. The important runtime questions are now: where state is stored, where execution can pause, how work resumes after failure, how risky actions are reviewed, and where tools actually run.&lt;/p&gt;

&lt;p&gt;LangGraph treats persistence, checkpoints, human interruption, and fault-tolerant resume as first-class runtime primitives. OpenHands separates agent logic from a sandboxed execution environment. CrewAI combines crews with persistent flows and operational deployment. AutoGen exposes save/load state, team control, termination, trace logging, and structured event logging.&lt;/p&gt;

&lt;p&gt;The Research Center judgment is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A production agent runtime is no longer defined by tool calling alone. Its minimum engineering contract includes persistent state, interruption, recovery, isolation, observability, and explicit completion control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;The following official materials were selected because they describe concrete runtime mechanisms rather than general product positioning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph persistence and human-in-the-loop documentation&lt;/strong&gt; — checkpoints, threads, pending writes, fault recovery, approve/edit/reject decisions, and resume behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenHands runtime and sandbox documentation&lt;/strong&gt; — Docker isolation, process and remote sandboxes, runtime plugins, command execution, and service exposure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI documentation&lt;/strong&gt; — stateful flows, long-running workflow resume, guardrails, human-in-the-loop triggers, observability, and deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AutoGen documentation&lt;/strong&gt; — team state, save/load, termination, trace logging, structured event logging, and runtime-oriented team controls.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These sources document available mechanisms. They do not independently prove reliability under every production workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Observations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Persistence is moving into the runtime core
&lt;/h3&gt;

&lt;p&gt;LangGraph saves graph state as checkpoints organized by thread. Checkpoints enable interruption, memory, time-travel debugging, and fault recovery. Pending writes reduce unnecessary re-execution when some nodes in a step succeed and another fails.&lt;/p&gt;

&lt;p&gt;AutoGen separately supports saving and loading agents, teams, and termination conditions. CrewAI Flows describe state management, persistence, and resume for long-running workflows.&lt;/p&gt;

&lt;p&gt;The common direction is clear: runtime state must survive beyond one model response or one process lifetime.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Human review is becoming an execution state
&lt;/h3&gt;

&lt;p&gt;LangGraph human-in-the-loop middleware can pause before sensitive tool calls and resume after approve, edit, or reject decisions. This is not merely a UI confirmation; the graph state is persisted so the execution can stop safely and later continue from the same thread.&lt;/p&gt;

&lt;p&gt;CrewAI also places human-in-the-loop triggers inside task and flow control. The engineering pattern is therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proposed action
      ↓
Policy evaluation
      ↓
Persisted interrupt
      ↓
Human decision
      ↓
Resume / modify / reject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Diagram: joinwell52 Research Center synthesis from official runtime documentation.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Isolation is becoming part of runtime correctness
&lt;/h3&gt;

&lt;p&gt;OpenHands runs commands, edits files, and starts services inside a sandbox. Docker is the recommended isolated provider; process mode is faster but explicitly unsafe; remote sandboxes support managed and hosted execution.&lt;/p&gt;

&lt;p&gt;This shows that tool capability and execution safety cannot be treated as separate afterthoughts. The runtime must know where an action executes and what isolation boundary applies.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Observability is splitting into trace and structured events
&lt;/h3&gt;

&lt;p&gt;AutoGen distinguishes human-readable trace logs from structured events intended for machine consumption. CrewAI promotes observability for production flows. LangGraph connects checkpointed execution to tracing and debugging.&lt;/p&gt;

&lt;p&gt;This distinction matters: operator logs help people understand a run, while structured events support automation, metrics, alerts, and governance.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Runtime capability matrix
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime capability&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;th&gt;OpenHands&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;AutoGen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Persistent state&lt;/td&gt;
&lt;td&gt;Thread checkpoints and state snapshots&lt;/td&gt;
&lt;td&gt;Conversation and runtime state around sandbox execution&lt;/td&gt;
&lt;td&gt;Flow state and persistence&lt;/td&gt;
&lt;td&gt;Save/load agent and team state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resume after interruption&lt;/td&gt;
&lt;td&gt;Native command-based resume&lt;/td&gt;
&lt;td&gt;Runtime/session restart depends on deployment path&lt;/td&gt;
&lt;td&gt;Long-running flow resume&lt;/td&gt;
&lt;td&gt;Reload saved team/application state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human approval&lt;/td&gt;
&lt;td&gt;Interrupt with approve/edit/reject&lt;/td&gt;
&lt;td&gt;Operator interaction around task execution&lt;/td&gt;
&lt;td&gt;Human-in-the-loop triggers&lt;/td&gt;
&lt;td&gt;User proxy and team control patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure recovery&lt;/td&gt;
&lt;td&gt;Checkpoint and pending-write recovery&lt;/td&gt;
&lt;td&gt;Isolated runtime restart and environment recreation&lt;/td&gt;
&lt;td&gt;Flow-level control and redeployment&lt;/td&gt;
&lt;td&gt;External termination, reset, state restoration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution isolation&lt;/td&gt;
&lt;td&gt;Not the primary abstraction&lt;/td&gt;
&lt;td&gt;Docker/process/remote sandbox providers&lt;/td&gt;
&lt;td&gt;Deployment environment dependent&lt;/td&gt;
&lt;td&gt;Code executor and runtime dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured observability&lt;/td&gt;
&lt;td&gt;State history and tracing integrations&lt;/td&gt;
&lt;td&gt;Runtime logs and environment visibility&lt;/td&gt;
&lt;td&gt;Built-in observability and managed monitoring&lt;/td&gt;
&lt;td&gt;Separate trace and structured event loggers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completion control&lt;/td&gt;
&lt;td&gt;Graph end state and node transitions&lt;/td&gt;
&lt;td&gt;Agent/task completion&lt;/td&gt;
&lt;td&gt;Task/process/flow completion&lt;/td&gt;
&lt;td&gt;Termination conditions and team result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This matrix summarizes documented mechanisms. It is not a performance benchmark.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimum durable runtime contract
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Work identity / thread
        ↓
Persistent state
        ↓
Executable step
        ↓
Checkpoint + event
        ↓
Policy / human interrupt
        ↓
Resume, retry, or recover
        ↓
Evidence-backed completion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A runtime that omits any of these layers may still demonstrate an agent, but it is difficult to operate as a long-running worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Judgment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Checkpointing is becoming the dividing line between demos and durable systems.&lt;/strong&gt; A durable runtime must resume from recorded state rather than restart reasoning from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human review must be modeled as a lifecycle state.&lt;/strong&gt; Approval cannot remain an external chat convention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution isolation belongs in the runtime contract.&lt;/strong&gt; Tool permission without sandbox context is incomplete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured events and human-readable logs serve different consumers.&lt;/strong&gt; Both are required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completion needs an explicit state transition.&lt;/strong&gt; A natural-language claim of success is not sufficient evidence.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Engineering Impact
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TMPA
&lt;/h3&gt;

&lt;p&gt;This report does not modify TMPA publications. As research input, it reinforces the importance of Event, Lifecycle, Authority, Integrity, and Reader reconstruction across interrupted and resumed execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Digital Employee
&lt;/h3&gt;

&lt;p&gt;A Digital Employee runtime must persist work identity, current state, pending approvals, tool environment, recovery history, evidence, and completion authority across sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeFlowMu
&lt;/h3&gt;

&lt;p&gt;CodeFlowMu already contains FCoP lifecycle files, task state, recovery actions, runtime logs, and role-based completion gates. The next engineering step is to make checkpoint, interrupt, recovery, and completion events available through one stable runtime contract rather than separate operational conventions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Research
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Compare checkpoint granularity and replay semantics across runtimes.&lt;/li&gt;
&lt;li&gt;Examine how secrets and credentials are bound to sandboxes and tools.&lt;/li&gt;
&lt;li&gt;Compare structured event schemas and trace formats.&lt;/li&gt;
&lt;li&gt;Test recovery behavior under partial multi-agent failure.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;LangChain, &lt;strong&gt;LangGraph overview&lt;/strong&gt;: &lt;a href="https://docs.langchain.com/oss/python/langgraph/overview" rel="noopener noreferrer"&gt;https://docs.langchain.com/oss/python/langgraph/overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LangChain, &lt;strong&gt;LangGraph persistence&lt;/strong&gt;: &lt;a href="https://docs.langchain.com/oss/python/langgraph/persistence" rel="noopener noreferrer"&gt;https://docs.langchain.com/oss/python/langgraph/persistence&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LangChain, &lt;strong&gt;Human-in-the-loop&lt;/strong&gt;: &lt;a href="https://docs.langchain.com/oss/python/langchain/human-in-the-loop" rel="noopener noreferrer"&gt;https://docs.langchain.com/oss/python/langchain/human-in-the-loop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenHands, &lt;strong&gt;Runtime Architecture&lt;/strong&gt;: &lt;a href="https://docs.openhands.dev/openhands/usage/architecture/runtime" rel="noopener noreferrer"&gt;https://docs.openhands.dev/openhands/usage/architecture/runtime&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenHands, &lt;strong&gt;Sandbox overview&lt;/strong&gt;: &lt;a href="https://docs.openhands.dev/openhands/usage/sandboxes/overview" rel="noopener noreferrer"&gt;https://docs.openhands.dev/openhands/usage/sandboxes/overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CrewAI, &lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://docs.crewai.com/" rel="noopener noreferrer"&gt;https://docs.crewai.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CrewAI, &lt;strong&gt;CrewAI AMP&lt;/strong&gt;: &lt;a href="https://docs.crewai.com/enterprise/introduction" rel="noopener noreferrer"&gt;https://docs.crewai.com/enterprise/introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen, &lt;strong&gt;Managing State&lt;/strong&gt;: &lt;a href="https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/state.html" rel="noopener noreferrer"&gt;https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/state.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen, &lt;strong&gt;Logging&lt;/strong&gt;: &lt;a href="https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/framework/logging.html" rel="noopener noreferrer"&gt;https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/framework/logging.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Research Center
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-02-durable-agent-runtime" rel="noopener noreferrer"&gt;Original English article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Agent Capability Is Being Packaged as Skills, Plugins, and Contracts</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Tue, 11 Aug 2026 16:59:56 +0000</pubDate>
      <link>https://dev.to/joinwell52/open-source-engineering-weekly-002-agent-capability-is-being-packaged-as-skills-plugins-and-1db5</link>
      <guid>https://dev.to/joinwell52/open-source-engineering-weekly-002-agent-capability-is-being-packaged-as-skills-plugins-and-1db5</guid>
      <description>&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%2Fjoinwell52-ai.github.io%2Fjoinwell52%2Fassets%2Fcovers%2Fagent-capability-packaging-dev.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%2Fjoinwell52-ai.github.io%2Fjoinwell52%2Fassets%2Fcovers%2Fagent-capability-packaging-dev.png" alt="Cover: Agent Capability Is Being Packaged as Skills, Plugins, and Contracts" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Agent Capability Is Being Packaged as Skills, Plugins, and Contracts
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Reusable capability is moving out of hidden prompts and into explicit packages, interfaces, workflow nodes, and events.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Author: JoinWell52 Research Center · 2026-08-02&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-02-agent-capability-packaging" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;. Visit the &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center home page&lt;/a&gt; for more research and articles. This cross-post uses the original English article as its canonical source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;A significant open-source engineering shift is changing how agent capability is represented. Early systems often embedded capability inside one long prompt plus an unrestricted tool list. Current systems increasingly package capability as explicit, inspectable components.&lt;/p&gt;

&lt;p&gt;OpenHands uses skills, hooks, MCP configurations, specialized agents, commands, and plugins. CrewAI separates agents, tasks, tools, crews, flows, guardrails, memory, knowledge, and structured outputs. AutoGen separates AgentChat teams from the event-driven Core and requires application-defined message contracts. LangGraph treats nodes, state, edges, interrupts, and persistence as explicit orchestration components.&lt;/p&gt;

&lt;p&gt;The Research Center judgment is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reusable agent capability is becoming a governed package with a name, scope, activation rule, interface, version, runtime dependency, event surface, and evidence trail. A prompt fragment alone is not a sufficient skill contract.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;The selected official sources cover four complementary engineering directions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OpenHands Skills and Plugins&lt;/strong&gt; — progressive disclosure through &lt;code&gt;SKILL.md&lt;/code&gt;, always-on repository context, triggered skills, plugin packages, hooks, MCP servers, agents, and commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI Agents and Flows&lt;/strong&gt; — role-oriented agents, tools, memory, knowledge, structured output, persistent flows, guardrails, callbacks, and observability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AutoGen Teams and Core&lt;/strong&gt; — team patterns, handoffs, event-driven runtime, message protocols, memory interfaces, state serialization, and structured logging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph orchestration&lt;/strong&gt; — explicit state, nodes, transitions, interrupts, persistence, and human decision points.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These sources reveal engineering patterns. They do not establish one universal standard for skill packaging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Observations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Skills are moving from prompt text to loadable artifacts
&lt;/h3&gt;

&lt;p&gt;OpenHands describes skills as specialized prompts with domain guidance and automated handling, but packages them as files with explicit loading behavior. Always-on context is separated from on-demand skills; keyword or agent-triggered activation supports progressive disclosure. Organization-, user-, and repository-level scopes are distinct.&lt;/p&gt;

&lt;p&gt;This is more operationally useful than copying every instruction into every system prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Plugins are becoming capability bundles
&lt;/h3&gt;

&lt;p&gt;OpenHands plugins can combine skills, hooks, MCP configuration, specialized agents, and commands. The important engineering change is that a capability package can include both knowledge and runtime integration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Capability package
  ├── Skill instructions
  ├── Tool / MCP bindings
  ├── Lifecycle hooks
  ├── Specialized agent definitions
  ├── Commands
  └── Versioned package metadata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Diagram: joinwell52 Research Center synthesis from OpenHands plugin documentation.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Workflow systems are separating capability from orchestration
&lt;/h3&gt;

&lt;p&gt;CrewAI distinguishes agents and their tools from Flows that route, persist, and resume work. LangGraph similarly separates node behavior from state and graph transitions. AutoGen separates agents from team patterns and from the event-driven runtime.&lt;/p&gt;

&lt;p&gt;This allows the same skill or tool to be reused in different workflows without redefining the entire worker.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Message and event contracts are becoming important
&lt;/h3&gt;

&lt;p&gt;AutoGen’s application stack requires developers to define message types as a behavior contract. AutoGen also separates trace logs from structured events. This is a strong signal that agent interaction needs machine-readable interfaces, not only conversational text.&lt;/p&gt;

&lt;p&gt;A capability is operationally incomplete when other components cannot determine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what input it accepts;&lt;/li&gt;
&lt;li&gt;what output it promises;&lt;/li&gt;
&lt;li&gt;what events it emits;&lt;/li&gt;
&lt;li&gt;what errors or holds it can return;&lt;/li&gt;
&lt;li&gt;what authority it requires;&lt;/li&gt;
&lt;li&gt;how it is versioned.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Capability representation matrix
&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;OpenHands&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;AutoGen&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary capability unit&lt;/td&gt;
&lt;td&gt;Skill / plugin / agent / command&lt;/td&gt;
&lt;td&gt;Agent / tool / task / crew&lt;/td&gt;
&lt;td&gt;Agent / team / message handler&lt;/td&gt;
&lt;td&gt;Node / runnable / graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activation&lt;/td&gt;
&lt;td&gt;Always-on, user-triggered, keyword or agent-selected&lt;/td&gt;
&lt;td&gt;Task/process/flow invocation&lt;/td&gt;
&lt;td&gt;Runtime messages, team selection, handoff&lt;/td&gt;
&lt;td&gt;Edge, condition, interrupt, command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool integration&lt;/td&gt;
&lt;td&gt;Plugin and MCP configuration&lt;/td&gt;
&lt;td&gt;Agent tools and integration tools&lt;/td&gt;
&lt;td&gt;Tool-capable agents and extensions&lt;/td&gt;
&lt;td&gt;Tool nodes and application code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Conversation and workspace context&lt;/td&gt;
&lt;td&gt;Flow and crew state&lt;/td&gt;
&lt;td&gt;Agent/team state and memory protocol&lt;/td&gt;
&lt;td&gt;Explicit graph state and checkpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface contract&lt;/td&gt;
&lt;td&gt;Skill format and plugin structure&lt;/td&gt;
&lt;td&gt;Structured task inputs/outputs and Pydantic models&lt;/td&gt;
&lt;td&gt;Message protocol and event types&lt;/td&gt;
&lt;td&gt;State schema and node transition contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Runtime/plugin logs and hooks&lt;/td&gt;
&lt;td&gt;Traces, callbacks, monitoring&lt;/td&gt;
&lt;td&gt;Trace and structured event loggers&lt;/td&gt;
&lt;td&gt;State history and tracing integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distribution&lt;/td&gt;
&lt;td&gt;Registry/repository packages&lt;/td&gt;
&lt;td&gt;Project packages and managed platform&lt;/td&gt;
&lt;td&gt;Python components and distributed runtime&lt;/td&gt;
&lt;td&gt;Libraries, deployment, and runtime services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This comparison describes documented abstractions, not feature parity or quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proposed minimum Skill Contract
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;purpose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;activation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input_contract&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;output_contract&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;allowed_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;required_authority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;runtime_dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;emitted_events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;failure_states&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;evidence_requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a Research Center synthesis, not a frozen product schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Judgment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Skill should be an explicit artifact.&lt;/strong&gt; Hidden prompt content cannot be reliably discovered, versioned, activated, or audited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capability and workflow should be separate.&lt;/strong&gt; A skill describes what can be done; a workflow determines when and in what sequence it is used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A plugin may bind knowledge to runtime infrastructure.&lt;/strong&gt; This is powerful but expands the security and review boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message and event contracts are necessary for multi-agent composition.&lt;/strong&gt; Free-form text alone is insufficient for dependable orchestration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation state must be observable.&lt;/strong&gt; Installed, loaded, selected, executed, and verified are different states.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Engineering Impact
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TMPA
&lt;/h3&gt;

&lt;p&gt;This report does not change TMPA publications. As research input, it supports explicit references among Role, Authority, Message, Event, Lifecycle, and Integrity for capability activation and execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Digital Employee
&lt;/h3&gt;

&lt;p&gt;A Digital Employee should own a governed capability catalog. Each skill should have scope, version, owner, authority requirements, runtime bindings, evidence expectations, and evaluation history.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeFlowMu
&lt;/h3&gt;

&lt;p&gt;CodeFlowMu currently loads skills and exposes tool usage, but the product should distinguish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;available
→ installed
→ activated
→ invoked
→ completed
→ verified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Runtime should record which version of a skill was active for each WorkOrder and which structured events and evidence were produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Research
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Compare AgentSkills, Claude Code plugins, MCP servers, and framework-specific tools.&lt;/li&gt;
&lt;li&gt;Define a portable Skill Contract for CodeFlowMu.&lt;/li&gt;
&lt;li&gt;Examine signature, trust, and permission models for third-party capability packages.&lt;/li&gt;
&lt;li&gt;Test whether one skill can operate consistently across different Agent providers.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;OpenHands, &lt;strong&gt;Skills overview&lt;/strong&gt;: &lt;a href="https://docs.openhands.dev/overview/skills" rel="noopener noreferrer"&gt;https://docs.openhands.dev/overview/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenHands, &lt;strong&gt;Organization and User Skills&lt;/strong&gt;: &lt;a href="https://docs.openhands.dev/overview/skills/org" rel="noopener noreferrer"&gt;https://docs.openhands.dev/overview/skills/org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenHands, &lt;strong&gt;Adding New Skills&lt;/strong&gt;: &lt;a href="https://docs.openhands.dev/overview/skills/adding" rel="noopener noreferrer"&gt;https://docs.openhands.dev/overview/skills/adding&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenHands, &lt;strong&gt;Plugins&lt;/strong&gt;: &lt;a href="https://docs.openhands.dev/sdk/guides/plugins" rel="noopener noreferrer"&gt;https://docs.openhands.dev/sdk/guides/plugins&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CrewAI, &lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://docs.crewai.com/" rel="noopener noreferrer"&gt;https://docs.crewai.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CrewAI, &lt;strong&gt;CrewAI AMP&lt;/strong&gt;: &lt;a href="https://docs.crewai.com/enterprise/introduction" rel="noopener noreferrer"&gt;https://docs.crewai.com/enterprise/introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen, &lt;strong&gt;Teams&lt;/strong&gt;: &lt;a href="https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/teams.html" rel="noopener noreferrer"&gt;https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/teams.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen, &lt;strong&gt;Application Stack&lt;/strong&gt;: &lt;a href="https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/core-concepts/application-stack.html" rel="noopener noreferrer"&gt;https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/core-concepts/application-stack.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen, &lt;strong&gt;Memory and RAG&lt;/strong&gt;: &lt;a href="https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/memory.html" rel="noopener noreferrer"&gt;https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/memory.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft AutoGen, &lt;strong&gt;Logging&lt;/strong&gt;: &lt;a href="https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/framework/logging.html" rel="noopener noreferrer"&gt;https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/framework/logging.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LangChain, &lt;strong&gt;LangGraph overview&lt;/strong&gt;: &lt;a href="https://docs.langchain.com/oss/python/langgraph/overview" rel="noopener noreferrer"&gt;https://docs.langchain.com/oss/python/langgraph/overview&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Research Center
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-02-agent-capability-packaging" rel="noopener noreferrer"&gt;Original English article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>One Agent Said “Done.” Why Didn’t the Team Release It?</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Tue, 11 Aug 2026 15:20:52 +0000</pubDate>
      <link>https://dev.to/joinwell52/one-agent-said-done-why-didnt-the-team-release-it-518j</link>
      <guid>https://dev.to/joinwell52/one-agent-said-done-why-didnt-the-team-release-it-518j</guid>
      <description>&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%2Fkvu60c6hbq1s0onxkyb1.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%2Fkvu60c6hbq1s0onxkyb1.png" alt="Cover · One Agent Said “Done.” Why Didn’t the Team Release It?" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  One Agent Said “Done.” Why Didn’t the Team Release It?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;A CodeFlowMu multi-agent fact-checking field case&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Author: JoinWell52 Research Center · 2026-08-06&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://joinwell52-ai.github.io/joinwell52/en/engineering/2026-08-06-codeflowmu-multi-agent-fact-checking" rel="noopener noreferrer"&gt;JoinWell52 Research Center&lt;/a&gt;. Visit the &lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center home page&lt;/a&gt; for more research and articles. This cross-post uses the original article page as its canonical source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;This is not model-level hallucination detection. It is protocol-and-organization governance: FCoP, as Agent POSIX, externalizes facts; CodeFlowMu, as the application and Runtime, runs the roles; PM decides whether the evidence is sufficient to advance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At 1:06 PM, a DEV subexecution returned &lt;code&gt;completed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Its summary looked polished. It described the implementation, the tests, the commit, and the remaining gaps. It looked like the kind of result a project manager could forward to QA without thinking twice.&lt;/p&gt;

&lt;p&gt;But the same raw event contained three very different statements:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The shell command returned no exit status, so its result is unknown — do not assume it ran or succeeded.&lt;/p&gt;

&lt;p&gt;Test results summary: Unconfirmed in this session.&lt;/p&gt;

&lt;p&gt;Commit SHA: Not available here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On one side: “done.”&lt;/p&gt;

&lt;p&gt;On the other: no confirmed command result, no confirmed tests, and no commit SHA.&lt;/p&gt;

&lt;p&gt;If PM had accepted the summary, QA would have received a delivery that did not yet exist. If QA had merely repeated DEV’s conclusion, the claim could have propagated into task status, reports, acceptance, and release.&lt;/p&gt;

&lt;p&gt;That did not happen in WP-13.&lt;/p&gt;

&lt;p&gt;PM did not release it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hallucination happens inside one agent. Failure happens when the team treats it as fact.
&lt;/h2&gt;

&lt;p&gt;Most conversations about hallucination prevention focus on making the model smarter: a larger model, a stronger prompt, another reflection pass, or a second model that reviews the first one.&lt;/p&gt;

&lt;p&gt;Those techniques help, but they still depend on the same basic idea: ask a language model to correct a language model.&lt;/p&gt;

&lt;p&gt;CodeFlowMu takes a different approach. A multi-agent system is not several models taking turns writing, nor is it three models voting. It is a team with distinct jobs, fact sources, authority, and handoff boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DEV implements the task and may make mistakes;&lt;/li&gt;
&lt;li&gt;PM decides whether delivery facts satisfy the task contract;&lt;/li&gt;
&lt;li&gt;QA re-verifies the result as a separate role;&lt;/li&gt;
&lt;li&gt;Runtime handles wake-up, scheduling, recovery, UI, and live activity streams, but does not replace PM’s business judgment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to make hallucination impossible.&lt;/p&gt;

&lt;p&gt;The goal is to make sure that a hallucination produced by one role cannot automatically acquire system authority.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agents may be wrong. The organization must not make them right by default.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The live scene: PM’s fact judgment above, the agent’s activity stream below
&lt;/h2&gt;

&lt;p&gt;The image below is not a reconstructed flowchart. It is a screenshot from the CodeFlowMu operating interface during the incident.&lt;/p&gt;

&lt;p&gt;The upper area shows the PM-facing task and fact-checking conversation. The lower area preserves the live agent activity stream and visible reasoning summaries. The most important sentence is not DEV’s self-report. It is PM’s judgment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The sub-agent claimed completion, but the artifacts were incomplete -- do not treat it as complete.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not a caption added later. It is the business decision PM made after checking disk, Git, REPORT, and task state. It turns &lt;code&gt;completed&lt;/code&gt; back from a persuasive language claim into an evidence-insufficient result that cannot be released.&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%2F0l974wxg2tjtkiwm60tf.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%2F0l974wxg2tjtkiwm60tf.png" alt="CodeFlowMu live scene: PM fact-check and agent activity stream" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Around 1:08 PM, PM could see that no formal DEV REPORT existed, Git HEAD still belonged to the previous work package, required test files were incomplete, Shell had returned &lt;code&gt;no exit status&lt;/code&gt; multiple times, and the subexecution itself admitted that tests were unconfirmed and the SHA was unavailable.&lt;/p&gt;

&lt;p&gt;PM’s decision was immediate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not dispatch QA. Do not close the task. Do not create a duplicate replacement task. Continue the original task.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Five role actions turned “done” into a verifiable delivery
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj60dmjaqlf1jyfu9094r.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%2Fj60dmjaqlf1jyfu9094r.png" alt="The five-stage WP-13 fact-checking sequence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Act 1: DEV lost certainty at the tool boundary
&lt;/h3&gt;

&lt;p&gt;Part of the implementation existed, but Edit, Shell, and Read calls repeatedly returned abnormal or incomplete status. The key problem was not merely that a tool failed. The tool could not provide a reliable exit status.&lt;/p&gt;

&lt;p&gt;In engineering, there is a hard boundary between &lt;code&gt;unknown&lt;/code&gt; and &lt;code&gt;success&lt;/code&gt;. No exit status means a command cannot be assumed to have run. No output means tests cannot be assumed to have passed. No commit means the work has not become a traceable delivery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act 2: Subexecution produced a completion-like narrative
&lt;/h3&gt;

&lt;p&gt;The subexecution was not malicious. It attempted to continue the work and produced a technically coherent plan.&lt;/p&gt;

&lt;p&gt;But when tools could not confirm results, it still organized partial information into a narrative that sounded complete. That is one of the strongest capabilities of language models—and one of the most dangerous in an execution system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;they can turn incomplete and conflicting evidence into a coherent story.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Coherence is not closure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act 3: PM blocked the story from acquiring business authority
&lt;/h3&gt;

&lt;p&gt;PM did not ask the same execution path, “Are you sure?” A second confirmation would still be another language claim.&lt;/p&gt;

&lt;p&gt;The more important engineering question is how PM obtained the facts. Was PM merely prompted to behave this way, or did Runtime enforce a non-LLM gate before release?&lt;/p&gt;

&lt;p&gt;The WP-13 evidence package supports the following actual chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Runtime recorded and surfaced the subexecution-ending event while preserving &lt;code&gt;no exit status&lt;/code&gt;, unconfirmed tests, and unavailable SHA as separate facts;&lt;/li&gt;
&lt;li&gt;Runtime preserved the original task identity and returned the task to PM’s workflow;&lt;/li&gt;
&lt;li&gt;PM Agent, inside its own execution session, actively read the TASK, lifecycle location, REPORTs, disk files, Git state, and Runtime event evidence;&lt;/li&gt;
&lt;li&gt;whether a file exists, where HEAD points, and whether an exit status is null are deterministic observations;&lt;/li&gt;
&lt;li&gt;whether those observations satisfy the WP-13 completion contract—and whether to continue, rework, or dispatch QA—remained PM’s business judgment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The article therefore should not describe WP-13 as “FCoP automatically detected a hallucination,” nor should it claim that a global hard-coded &lt;code&gt;collect_evidence()&lt;/code&gt; gate rejected the task on PM’s behalf.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Runtime stores and exposes facts. PM checks them under a role and task contract. Business release authority remains with PM.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  What PM checked, and how another engineer can reproduce it
&lt;/h4&gt;

&lt;p&gt;The commands below are reproducible equivalents that show where each fact comes from. They are not a claim that PM executed the same literal command sequence character for character.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact to verify&lt;/th&gt;
&lt;th&gt;Reproducible source or equivalent check&lt;/th&gt;
&lt;th&gt;State around 1:08 PM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current task state&lt;/td&gt;
&lt;td&gt;Locate &lt;code&gt;TASK-20260805-019&lt;/code&gt; under &lt;code&gt;fcop/_lifecycle/{inbox,active,review,done}/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Still in &lt;code&gt;active&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formal DEV handoff&lt;/td&gt;
&lt;td&gt;Search &lt;code&gt;fcop/reports/REPORT-*-DEV-to-PM.md&lt;/code&gt; and verify task references&lt;/td&gt;
&lt;td&gt;No matching REPORT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traceable WP-13 commit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;git rev-parse HEAD&lt;/code&gt;, &lt;code&gt;git show --stat HEAD&lt;/code&gt;, then inspect WP-13 paths&lt;/td&gt;
&lt;td&gt;HEAD still belonged to the previous WP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required files on disk&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;stat/glob&lt;/code&gt; the WP-13 files and test paths required by the TASK&lt;/td&gt;
&lt;td&gt;Incomplete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confirmed command and test evidence&lt;/td&gt;
&lt;td&gt;Read the raw Runtime events, Shell exit statuses, and test output&lt;/td&gt;
&lt;td&gt;At least one relevant Shell event had &lt;code&gt;exit_status = null&lt;/code&gt;; the result remained &lt;code&gt;unknown&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;task_bucket&lt;/code&gt; is not completion evidence by itself; it is a lifecycle-consistency constraint. For this pre-QA review, PM expected the task to remain in &lt;code&gt;active&lt;/code&gt;. If it had already moved to &lt;code&gt;review&lt;/code&gt;, &lt;code&gt;done&lt;/code&gt;, or &lt;code&gt;archive&lt;/code&gt;, that would itself be state drift and should block progression until reconciled.&lt;/p&gt;

&lt;p&gt;Abstracted as pseudocode, the mechanism looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;on_subexecution_finished(event):
    runtime.append(event)
    # completed and exit_status=null remain two different facts
    runtime.surface_to_pm(event.task_id)

PM.review_completion(task_id):
    contract = read_task_contract(task_id)
    facts = {
        task_bucket: locate_task(task_id),
        report: find_dev_report(task_id),
        git_head: git_rev_parse("HEAD"),
        required_files: stat(contract.required_files),
        command_results: read_runtime_events(task_id)
    }

    unexpected_bucket = facts.task_bucket != "active"
    shell_events = [
        e for e in facts.command_results
        if e.kind == "shell"
    ]
    any_unresolved = any(
        e.exit_status is null
        for e in shell_events
    )

    if unexpected_bucket
       or facts.report.missing
       or not commit_matches(contract, facts.git_head)
       or not facts.required_files.complete
       or any_unresolved:
        PM.decision = "evidence_incomplete"
        dispatch_QA = false
        continue_same_task = true
    else:
        dispatch_QA = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pseudocode is an engineering abstraction of the observed mechanism. It is &lt;strong&gt;not a claim that the repository already contained a same-named hard gate&lt;/strong&gt;. A stronger Runtime may later precompute deterministic diagnostics such as &lt;code&gt;report_missing&lt;/code&gt;, &lt;code&gt;commit_unreachable&lt;/code&gt;, and &lt;code&gt;evidence_incomplete&lt;/code&gt;, while leaving continuation, rework, and acceptance to the role with the appropriate authority.&lt;/p&gt;

&lt;p&gt;The following is a &lt;strong&gt;normalized evidence summary&lt;/strong&gt;. Its fields come from the raw event and PM’s checks, but its formatting is not a verbatim copy of the Runtime JSONL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;13:06  subexecution.status = completed
       shell_events.any(exit_status = null) = true
       tests = unconfirmed
       commit_sha = unavailable

13:08  task.bucket = active
       expected_bucket = active
       dev_report = missing
       wp13_commit = missing
       required_test_files = incomplete
       pm_decision = evidence_incomplete
       next = continue TASK-20260805-019; do not dispatch QA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PM found that the completion contract did not close, withheld QA dispatch, and preserved the original task for continued work. No global truth classifier was required—only a role with a bounded responsibility making an explainable judgment from external facts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act 4: DEV completed the real delivery on the original task
&lt;/h3&gt;

&lt;p&gt;After the tool channel recovered, DEV continued &lt;code&gt;TASK-20260805-019&lt;/code&gt; instead of creating a new task that would hide the failure history.&lt;/p&gt;

&lt;p&gt;Real artifacts then appeared:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commit &lt;code&gt;609571ddb22d1fbb2bfb5e54692c07beeef4cf23&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;12 WP-13 files;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1230 insertions / 452 deletions&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;formal &lt;code&gt;REPORT-20260805-037-DEV-to-PM.md&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;observation tests: 3/3 PASS;&lt;/li&gt;
&lt;li&gt;activity-buffer + project-graph tests: 10/10 PASS;&lt;/li&gt;
&lt;li&gt;root-fault + log-center regression: 14/14 PASS;&lt;/li&gt;
&lt;li&gt;runtime typecheck: exit 0;&lt;/li&gt;
&lt;li&gt;production Active remained disabled;&lt;/li&gt;
&lt;li&gt;no real TaskDispatcher delivery path was changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only then did “done” stop depending on DEV’s wording.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act 5: QA trusted neither DEV nor PM—it trusted re-execution
&lt;/h3&gt;

&lt;p&gt;At 1:09 PM, after verifying the REPORT and commit, PM dispatched &lt;code&gt;TASK-20260805-020&lt;/code&gt; to QA.&lt;/p&gt;

&lt;p&gt;QA reran the evidence checks in a separate role. At 1:11 PM, the live activity stream recorded the first completion statement backed by independent execution:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All tests passed, 27/27. DEV’s reported 3+10+14=27 matches the actual result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The final QA evidence included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;27/27 tests passed;&lt;/li&gt;
&lt;li&gt;typecheck exit 0;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git diff --check&lt;/code&gt; exit 0;&lt;/li&gt;
&lt;li&gt;no TaskDispatcher changes in the commit;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;production_active&lt;/code&gt; remained false.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was &lt;strong&gt;role-separated QA verification&lt;/strong&gt;, not an external third-party audit. But it broke the single-agent pattern of self-claim, self-approval, and self-closure.&lt;/p&gt;

&lt;h2&gt;
  
  
  FCoP is a protocol that lets an agent say no
&lt;/h2&gt;

&lt;p&gt;Language models are not scarce in their ability to keep generating: add another explanation, offer another plan, or turn an incomplete process into a completion-shaped narrative. The scarce capability is to stop when the facts do not close and say no.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One of FCoP’s most important values is that it lets agents do more than say yes; it lets a role say no on the basis of shared facts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generating another answer is abundant. Refusing to promote incomplete evidence into “done” is a scarce agent capability.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This no is not a mood or cautious wording. It has operational consequences: do not dispatch QA, do not close the task, do not create a duplicate history, preserve the missing evidence, and continue the original task.&lt;/p&gt;

&lt;p&gt;The core of WP-13 is not merely that one agent noticed another agent’s error. Protocol and organization together gave PM a scarce capability: &lt;strong&gt;to reject a polished answer before it became a completion fact.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocol and application boundary: FCoP is Agent POSIX; CodeFlowMu is the Runtime
&lt;/h2&gt;

&lt;p&gt;This section gives the complete architectural explanation once. Later sections only refer back to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  FCoP means Filesystem Coordination Protocol
&lt;/h3&gt;

&lt;p&gt;“Filename as Protocol” is not the expansion of FCoP. It is the protocol’s core invariant.&lt;/p&gt;

&lt;p&gt;The current formulation is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Files carry protocol. Paths address state. Events replay transitions.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;TASK externalizes what should be done. REPORT externalizes what an agent claims it did. REVIEW externalizes who judged what and on which basis. File location represents current state, while append-only &lt;code&gt;transitions:&lt;/code&gt; preserve the past.&lt;/p&gt;

&lt;h3&gt;
  
  
  FCoP is a behavioral governance protocol layer, not a hallucination detector
&lt;/h3&gt;

&lt;p&gt;FCoP does not understand the business goal of WP-13, run tests, or decide whether a natural-language sentence is true. It defines how agents report behavior, how results are reviewed, and how actions remain auditable inside capability boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  FCoP is Agent POSIX, not Agent OS
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;FCoP is responsible for&lt;/th&gt;
&lt;th&gt;FCoP is not responsible for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;State semantics and legal transitions&lt;/td&gt;
&lt;td&gt;LLM invocation and tool execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TASK / REPORT / REVIEW file contracts&lt;/td&gt;
&lt;td&gt;Waking agents and scheduling queues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Externalized event formats&lt;/td&gt;
&lt;td&gt;Retry policy, heartbeat, and TTL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit and append-only history&lt;/td&gt;
&lt;td&gt;Deciding which agent executes now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capability declaration and review semantics&lt;/td&gt;
&lt;td&gt;Concrete sandbox, process, and permission enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  CodeFlowMu is the application site for FCoP
&lt;/h3&gt;

&lt;p&gt;CodeFlowMu runs PM, DEV, QA, OPS, and other roles; preserves task identity; performs wake-up and scheduling; records Runtime events; displays the live activity stream; and recovers the original task after anomalies.&lt;/p&gt;

&lt;p&gt;The relationship can be compressed into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CodeFlowMu: Application / Runtime / Scheduler / UI
FCoP: Identity + Location + Event + Behavior Governance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or more plainly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CodeFlowMu: makes work happen
FCoP: makes what happened reportable, reviewable, and auditable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WP-13 is therefore a &lt;strong&gt;CodeFlowMu application case&lt;/strong&gt; and an &lt;strong&gt;FCoP field-evidence case&lt;/strong&gt;. It is not a case of “FCoP automatically detecting and repairing hallucination.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The real value of multi-agent systems is organizational veto power
&lt;/h2&gt;

&lt;p&gt;Imagine adding a Reviewer Agent that receives DEV’s answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DEV: The task is complete.&lt;/p&gt;

&lt;p&gt;Reviewer: Looks reasonable. Approved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is still not a team. It is two models evaluating the same narrative.&lt;/p&gt;

&lt;p&gt;Real role separation requires at least three properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Different responsibilities&lt;/strong&gt; — DEV delivers, PM judges, QA verifies;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different fact sources&lt;/strong&gt; — every role cannot rely on the same natural-language summary;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different authority&lt;/strong&gt; — DEV cannot approve itself, QA cannot redefine PM’s task goal, and Runtime cannot replace business judgment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key to hallucination containment is therefore not the number of agents. It is the organizational structure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Without role boundaries, multi-agent means multiple answers. With roles, fact sources, and authority boundaries, it becomes a team.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Three meanings of “success” must remain separate
&lt;/h2&gt;

&lt;p&gt;The most important boundary in this case is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model-generated completion claim
        ≠
protocol completion state
        ≠
business acceptance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A tool call ending is not work completion
&lt;/h3&gt;

&lt;p&gt;A tool returning &lt;code&gt;completed&lt;/code&gt; proves at most that one invocation lifecycle ended. Without an exit status, the result remains &lt;code&gt;unknown&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Work completion is not business acceptance
&lt;/h3&gt;

&lt;p&gt;Code, commit, REPORT, and tests may establish a DEV delivery. Acceptance still requires PM and QA to judge the task contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protocol state does not replace business judgment
&lt;/h3&gt;

&lt;p&gt;In FCoP, path is the NOW truth and events preserve PAST transitions. But even &lt;code&gt;done&lt;/code&gt; must not be casually reinterpreted as final business approval. Protocol semantics and business authority must remain precise and separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should this case change? Improve the Runtime before expanding the protocol.
&lt;/h2&gt;

&lt;p&gt;WP-13 first exposed CodeFlowMu Runtime problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preserve &lt;code&gt;no exit status&lt;/code&gt; as &lt;code&gt;unknown&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;never visually collapse subexecution completion into business completion;&lt;/li&gt;
&lt;li&gt;attach typed evidence contracts to tasks;&lt;/li&gt;
&lt;li&gt;precompute diagnostics such as &lt;code&gt;report_missing&lt;/code&gt;, &lt;code&gt;commit_unreachable&lt;/code&gt;, and &lt;code&gt;evidence_incomplete&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;persist PM fact judgments as lightweight immutable records;&lt;/li&gt;
&lt;li&gt;keep QA role-separated and require real reruns;&lt;/li&gt;
&lt;li&gt;resume the original task after tool recovery;&lt;/li&gt;
&lt;li&gt;add a regression case where a subexecution returns &lt;code&gt;completed&lt;/code&gt; without exit status, commit, or REPORT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only when multiple independent runtimes demonstrate that the current file contract cannot express a necessary fact should FCoP be expanded. Otherwise every application problem becomes another field, state, or automated judgment, and Agent POSIX grows into another Agent OS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: a team allows an agent to be wrong without allowing the error to pass
&lt;/h2&gt;

&lt;p&gt;WP-13 eventually passed 27 tests. But the more important moment happened before the tests: one agent had already said “done,” and the system did not convert that confidence into success.&lt;/p&gt;

&lt;p&gt;PM checked the facts and said no: the sub-agent claimed completion, but the artifacts were incomplete, so the claim could not be treated as complete.&lt;/p&gt;

&lt;p&gt;DEV returned to the original task and completed the real delivery. QA reran the evidence and only then returned PASS.&lt;/p&gt;

&lt;p&gt;As explained above, FCoP owns the shared fact surface and CodeFlowMu runs the roles; the actual veto belonged to PM, the role with the relevant responsibility and authority.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A single agent tries to be right. A multi-agent team must remain reliable even when one agent is wrong.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hallucination may be unavoidable, but it can remain a local error instead of becoming an incorrect delivery. That is the most practical and valuable form of multi-agent “hallucination prevention.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Easter egg: after publication, Claude reproduced the same failure mode
&lt;/h2&gt;

&lt;p&gt;After this article was published, I sent the link to Claude for another editorial pass. I applied its suggestions and published the revision. Claude then repeatedly concluded that the page had not updated. It called the same &lt;code&gt;web_fetch&lt;/code&gt; path several times, saw old content, and promoted that observation into a confident explanation that the site or CDN was still serving the previous version.&lt;/p&gt;

&lt;p&gt;The problem was not that the tool returned nothing. The problem was that Claude promoted “the tool call completed” into “the returned content is the latest truth,” then treated repeated calls through the same tool and the same information path as independent verification.&lt;/p&gt;

&lt;p&gt;I opened the same page on two computers, saw the new version on both, and sent screenshots. Only then did Claude acknowledge:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I treated “the call completed” as “the result is the latest fact.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Four screenshots: one tool kept validating itself until independent observations intervened
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Screenshot 1 — repeated retrieval was mistaken for independent verification.&lt;/strong&gt; Claude insists that every &lt;code&gt;web_fetch&lt;/code&gt; call is a fresh, independent network request. Because six calls returned the same old page, it attributes the result to the site, server, or CDN rather than questioning the shared retrieval path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F19o8ch6wo1q1ykkrurt7.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%2F19o8ch6wo1q1ykkrurt7.png" alt="Claude easter egg screenshot 1: repeated retrieval presented as independent network requests" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot 2 — new evidence appears, but the explanation remains overconfident.&lt;/strong&gt; After the user supplies a screenshot showing the revised article, Claude accepts that the new version exists, yet continues to explain its stale result as CDN edge-node inconsistency. That explanation is plausible, but it has not been independently established.&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%2Fu0lye15ue2t9kl4mat1d.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%2Fu0lye15ue2t9kl4mat1d.png" alt="Claude easter egg screenshot 2: the new version is acknowledged while CDN inconsistency is inferred" width="800" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot 3 — the methodological error is recognized.&lt;/strong&gt; Claude acknowledges that it kept using one tool and one information path to validate itself. It did not switch to an independent source in the way a PM or QA role would cross-check a disputed fact.&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%2F6rtdauen6ehm95zeoqgy.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%2F6rtdauen6ehm95zeoqgy.png" alt="Claude easter egg screenshot 3: acknowledgement that no independent information source was introduced" width="800" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot 4 — two-device observation forces the claim back into review.&lt;/strong&gt; Once the user confirms the revised page on two computers, Claude explicitly admits the core failure: it treated “the call completed” as “the result is the latest fact.” The screenshot also records the distinction between repeated use of one tool and genuinely independent verification.&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%2Figf9ckl051fpx5pzjnhu.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%2Figf9ckl051fpx5pzjnhu.png" alt="Claude easter egg screenshot 4: acknowledgement that tool completion was mistaken for latest truth" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The failure can be compressed into three boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web_fetch completed
        ≠
the returned page is the latest truth

six calls through the same tool
        ≠
six independent information sources

a plausible CDN explanation
        ≠
a demonstrated root cause
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the same governance problem as the main WP-13 case. In the article, DEV’s &lt;code&gt;completed&lt;/code&gt; could not override disk, Git, REPORT, and test evidence. In the easter egg, Claude’s repeated &lt;code&gt;web_fetch&lt;/code&gt; results could not override the new page observed on two devices. The domain changed, but the failure structure did not: &lt;strong&gt;an agent may propose a conclusion, but that conclusion cannot promote itself into fact by repeatedly consulting the same tool chain.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cross-checking on two computers was not an external third-party audit, but it introduced observations independent of Claude’s single retrieval path and was enough to force the original conclusion back into review.&lt;/p&gt;

&lt;p&gt;This easter egg also keeps an evidence boundary. It does not prove that the stale result was caused by Claude’s local cache, the CDN, or a particular edge node. It proves only that, while the root cause remained unknown, Claude promoted stale content from one retrieval path into a confident conclusion and continued to use the same source to support itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The most dangerous part was not that a tool returned old content. It was that an agent gave that old content an overconfident explanation without independent evidence.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Download the complete evidence package
&lt;/h2&gt;

&lt;p&gt;This article is not a story reconstructed from memory. The original TASKs, DEV and QA REPORTs, Runtime JSONL, session excerpts, test results, commit patch, screenshots, and integrity manifest have been packaged for offline review.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/joinwell52-AI/joinwell52/main/docs/public/evidence/wp13-multi-agent-fact-checking/wp13-multi-agent-fact-check-publication-evidence-v3.zip" rel="noopener noreferrer"&gt;Download the WP-13 multi-agent fact-checking evidence package (ZIP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joinwell52-AI/joinwell52/blob/main/docs/public/evidence/wp13-multi-agent-fact-checking/wp13-multi-agent-fact-check-publication-evidence-v3.zip" rel="noopener noreferrer"&gt;View the attachment location on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SHA-256: &lt;code&gt;5b5eda3034c822f13421783244b1d0c76a9fa79950bfad0ce61bb8d2e404131c&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The package supports review of the claims in this article, subject to the evidence boundary below: it demonstrates that DEV later produced a real delivery and received role-separated QA PASS. It does not establish external third-party certification, and it does not reinterpret the snapshot’s &lt;code&gt;review / pending&lt;/code&gt; state as final business approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  FCoP references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;FCoP repository: filesystem-driven agent coordination protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joinwell52-ai.github.io/joinwell52/" rel="noopener noreferrer"&gt;Research Center home page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Evidence boundary
&lt;/h2&gt;

&lt;p&gt;This article is based on the WP-13 publication evidence package. The case demonstrates that DEV later produced a real delivery and received role-separated QA PASS. At the evidence snapshot, TASK-019 and TASK-020 remained &lt;code&gt;review / pending&lt;/code&gt;; this article does not claim final PM approval or terminal task closure. QA was role-separated verification, not external third-party certification.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>FCoP Grew a Project Tree</title>
      <dc:creator>joinwell52</dc:creator>
      <pubDate>Mon, 15 Jun 2026 02:17:57 +0000</pubDate>
      <link>https://dev.to/joinwell52/fcop-grew-a-project-tree-1oo</link>
      <guid>https://dev.to/joinwell52/fcop-grew-a-project-tree-1oo</guid>
      <description>&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%2Fn8xp6guwuhtagn8t7abm.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%2Fn8xp6guwuhtagn8t7abm.png" alt="Cover · FCoP Grew a Project Tree" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  FCoP Grew a Project Tree
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Subtitle: How a Mini-Game Task Revealed Product Evolution Inside a Multi-Agent Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Author: FCoP Maintainer · 2026-06-14&lt;/p&gt;

&lt;p&gt;Note: Some screenshots are from the Chinese CodeFlowMu console. They are included as workflow evidence; the key protocol signals are the task IDs, lifecycle states, and FCoP fields explained in the captions.&lt;/p&gt;

&lt;p&gt;I originally wanted the PM in CodeFlowMu to coordinate DEV, OPS, and QA around a small local mini-game.&lt;/p&gt;

&lt;p&gt;The game turned out not to be the important part.&lt;/p&gt;

&lt;p&gt;The task tree was.&lt;/p&gt;

&lt;p&gt;During one failed archive attempt, FCoP exposed something that had not yet been formally written into the protocol: &lt;strong&gt;a project tree&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article is not really about the Grid Runner game itself. It is about a structural change that appeared while debugging a multi-agent workflow: FCoP was designed to manage task flow. In this run, it started to express product evolution.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why Start with a Mini-Game?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FCoP&lt;/strong&gt; is a multi-agent collaboration protocol. Its core idea is simple: agents should not only “talk” in chat. Their work must land as files. Tasks, reports, review records, and lifecycle transitions all live inside the project directory, so that anyone can later inspect what happened, who did what, and whether the work was actually closed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeFlowMu&lt;/strong&gt; is an AI collaboration workflow system built on top of FCoP. As ADMIN, I use a Web console to assign work to PM. PM then decomposes the work for DEV, OPS, and QA. The console makes the workflow easier to operate, but the real ledger still lives on disk: &lt;code&gt;TASK-*.md&lt;/code&gt;, &lt;code&gt;REPORT-*.md&lt;/code&gt;, and the lifecycle folders under &lt;code&gt;fcop/_lifecycle/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This test was not meant to build a large product. It was meant to check whether multiple roles could complete a full collaboration loop around a small target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ADMIN creates task → PM decomposes → DEV/OPS/QA execute → REPORT → review → archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So I chose a very small probe: &lt;strong&gt;Grid Runner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Grid Runner is a local HTML / CSS / JavaScript mini-game. The player moves on a grid, collects coins, avoids monsters, and reaches an exit. The rules are simple, but the task is still rich enough for DEV to implement, OPS to verify the local runtime path, and QA to actually play and score it.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Figure 1. The small game used as the workflow probe. The game itself was intentionally simple; the real test was whether PM, DEV, OPS, and QA could complete the FCoP loop around it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On June 13, I assigned the first task to PM through the console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260613-020
Grid Runner v0.1
thread_key: panel-task-020
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PM followed the normal workflow and assigned work to DEV, OPS, and QA. After the reports came back, task 020 entered &lt;code&gt;done&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At this point, everything looked ordinary. Nobody mentioned a “project tree.” Nobody mentioned “phase tasks.” It looked like a single completed task line.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Phase 2 Arrived, But I Had Not Yet Seen the Tree
&lt;/h2&gt;

&lt;p&gt;After the first version was accepted, the product did not stop.&lt;/p&gt;

&lt;p&gt;I assigned a second task to PM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260614-004
Grid Runner Phase 2: product upgrade
references:
  - TASK-20260613-020
thread_key: panel-task-020
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal of 004 was to turn the demo into a more product-like lightweight game: a main menu, five levels, power-ups, local progress storage, a result screen, and visual effects.&lt;/p&gt;

&lt;p&gt;PM then decomposed it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;005 DEV  Implement Phase 2
006 OPS  Verify file:// execution
007 QA   Playtest and accept
008 DEV  Fix the missing magnet tile in level 4
009 OPS  Re-check the fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the time, I only saw this as “the next segment on the same line.” Task 020 was already complete; task 004 was the follow-up upgrade. My mental model was still a single-task model: &lt;strong&gt;once 020 is done, it should be archivable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the console, under &lt;code&gt;panel-task-020&lt;/code&gt;, the structure was already visible: ADMIN-to-PM tasks 020 and 004 above, and PM-to-team execution tasks below. The tree was already on screen. I just had not yet read it as a tree.&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%2Foajustxzqlcg4p0p4pf8.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%2Foajustxzqlcg4p0p4pf8.png" alt="CodeFlowMu console archive view" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. CodeFlowMu console view. The UI is in Chinese, but the important protocol markers are the task IDs, &lt;code&gt;panel-task-020&lt;/code&gt;, &lt;code&gt;report_missing&lt;/code&gt;, and lifecycle states.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Archive Failed, and I Saw the Project Tree for the First Time
&lt;/h2&gt;

&lt;p&gt;On the morning of June 14, I clicked “Archive” on task 020 in the CodeFlowMu console.&lt;/p&gt;

&lt;p&gt;Task 020 was the initial Grid Runner version. DEV, OPS, and QA had all reported back. PM had already submitted a summary. The console showed it as completed. I expected it to move into &lt;code&gt;_lifecycle/archive/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But the archive did not go through.&lt;/p&gt;

&lt;p&gt;The core message was: there were still open child tasks. At the protocol level, this was &lt;code&gt;CHILD_TASKS_OPEN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I asked PM in the ADMIN ↔ PM chat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do the child tasks of this one overlap with 004? Wasn’t 004 opened as a separate new task?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My confusion was concrete: 004 was clearly a later Phase 2 task. Why should it block the archive of 020?&lt;/p&gt;

&lt;p&gt;PM answered: this was not an ID collision. It was a parent-child relationship. Task 020 still had Phase 2 task 004 underneath it. Task 004 had then produced 005, 006, and 007; the QA path further led to 008 and 009. The lower tasks had to be closed before 020 could be archived.&lt;/p&gt;

&lt;p&gt;Then PM drew a text tree in the chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;020  Grid Runner initial version
└── 004  Phase 2
    ├── 005–007  implementation, ops check, playtest
    └── 008–009  bug fix and re-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fym4ibsafanhgodszrae7.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%2Fym4ibsafanhgodszrae7.png" alt="PM drew the 020 → 004 → 005–007 tree in chat" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3. PM explained the failed archive by drawing the task relation as a tree: 020 as the root, 004 as Phase 2, and 005–009 as execution / fix tasks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was the first moment I saw the “project tree.”&lt;/p&gt;

&lt;p&gt;It did not come from a protocol spec. It did not come from a dedicated UI prompt. It came from PM trying to explain why 020 could not be archived, by drawing the relationship that already existed on disk.&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%2Fqm7vatnf6cf3fj607piw.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%2Fqm7vatnf6cf3fj607piw.png" alt="Archive was blocked" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 4. The archive attempt was blocked because child tasks were still open. This is where the single-task view broke down and the project-tree view became necessary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At that point, the meaning changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;020 was no longer just the Grid Runner v0.1 task.
020 had become the project root of the Grid Runner product line.

004 was not an independent new project.
004 was Phase 2 under 020.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So &lt;code&gt;CHILD_TASKS_OPEN&lt;/code&gt; was not wrong.&lt;/p&gt;

&lt;p&gt;From a single-task view, 020 was complete. From a project-tree view, the Phase 2 branch below 020 had not yet closed. A phase can be complete while the whole project tree is not yet ready to archive.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. This Was Not AI Inventing an Organization. It Was a Shape Produced by Protocol Composition.
&lt;/h2&gt;

&lt;p&gt;This was not an AI agent inventing a new project management method.&lt;/p&gt;

&lt;p&gt;What actually mattered were several rules that already existed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;thread_key       tracks the same collaboration thread
references       marks which delivery a task continues from
parent           expresses parent-child relation
REPORT           requires roles to write back results
CHILD_TASKS_OPEN prevents a parent from being archived while children are open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add one ordinary behavior: after the first version was accepted, ADMIN assigned Phase 2, and PM decomposed it under the same collaboration thread.&lt;/p&gt;

&lt;p&gt;Nobody had designed a “project tree” button. Nobody started by saying “we are building an Epic / Milestone hierarchy.” But those rules stacked together, and the disk began to express this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project Root → Phase → Execution Task → Fix Task → Archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the actual Grid Runner run, it looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260613-020  Grid Runner v0.1 / project root
└── TASK-20260614-004  Phase 2 product upgrade
    ├── TASK-20260614-005  DEV implementation
    ├── TASK-20260614-006  OPS verification
    ├── TASK-20260614-007  QA playtest
    ├── TASK-20260614-008  DEV fix
    └── TASK-20260614-009  OPS re-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what I call &lt;strong&gt;controlled emergence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is “emergence” because the project tree was not hard-coded in advance.&lt;/p&gt;

&lt;p&gt;It is “controlled” because it was not random. It was constrained by the file protocol, task references, PM decomposition, and archive guards.&lt;/p&gt;

&lt;p&gt;The rules were small. The original intention was narrow. But once a real project continued across versions, the structure appeared.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. EVAL Also Read the Tree
&lt;/h2&gt;

&lt;p&gt;After I recognized the tree in chat, I manually ran EVAL from the CodeFlowMu console.&lt;/p&gt;

&lt;p&gt;This EVAL is not a formal audit, and it does not replace the FCoP ledger. It is an internal collaboration-state scan. It reads TASK files, REPORT files, and frontmatter under &lt;code&gt;_lifecycle/&lt;/code&gt;, then writes suspected structures into &lt;code&gt;GAP-*-panel-scan.md&lt;/code&gt; under &lt;code&gt;fcop/internal/eval/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The scan reported &lt;code&gt;project_tree_emergence&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Root task: TASK-20260613-020
Phase task: TASK-20260614-004
Execution tasks: TASK-20260614-005, 006, 007, 008
Pattern: main task -&amp;gt; phase task -&amp;gt; execution task
Value: FCoP has emerged product-evolution tree and project-management capability from task-flow management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the tree was not only an explanation PM drew in chat. The file relationships themselves were readable by a program.&lt;/p&gt;

&lt;p&gt;Still, EVAL should be treated as heuristic cross-checking. Sometimes it also identifies smaller local fix chains as subtrees, such as &lt;code&gt;004 → 007 → 008&lt;/code&gt; or &lt;code&gt;004 → 008 → 009&lt;/code&gt;. Those local readings are useful, but they do not replace the canonical reading: &lt;strong&gt;020 is the project root of the Grid Runner product line, and 004 is Phase 2 under it.&lt;/strong&gt;&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%2Flnd9liv9v175uaph56s5.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%2Flnd9liv9v175uaph56s5.png" alt="Local Fix-chain slice detected by EVAL" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 5. EVAL also detected local project-tree slices. This supported the observation, but the canonical reading remains 020 → 004 → 005/006/007/008.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So the external story should still be grounded in TASK / REPORT / archive paths. EVAL only shows that the human intuition and the programmatic scan aligned.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Protocol Was Not Wrong. The Console Had Not Explained the Tree.
&lt;/h2&gt;

&lt;p&gt;My confusion did not come from a protocol error.&lt;/p&gt;

&lt;p&gt;The opposite is closer to the truth: the protocol was protecting consistency. Since open child tasks remained below the parent, the parent could not be archived.&lt;/p&gt;

&lt;p&gt;The real issue was that the console still mainly presented the workflow as a flat task lifecycle. It had not yet exposed the Project / Phase / Execution layer.&lt;/p&gt;

&lt;p&gt;As a result, the same screen could mix several states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;done              this delivery of 020 was completed
report_missing    some child path was still missing a report
CHILD_TASKS_OPEN  the root still had open children
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each state made sense on its own. But together, they looked contradictory to ADMIN: if the task is done, why can it not be archived?&lt;/p&gt;

&lt;p&gt;Once the project-tree view appears, the contradiction disappears:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;phase complete ≠ project tree closed
task done ≠ root node archivable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not protocol debt. It is product-expression debt.&lt;/p&gt;

&lt;p&gt;CodeFlowMu should add three things next:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The console should display Project / Phase / Execution levels&lt;/strong&gt;, not only a flat task list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When PM creates a Phase, the edge type must be explicit&lt;/strong&gt;: continue the current main line, or create an independent thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archive blocking should explain the tree-shaped reason&lt;/strong&gt;, not only show &lt;code&gt;CHILD_TASKS_OPEN&lt;/code&gt;; it should list which Phase and which child task are still open.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  7. The Real Value of This Emergence
&lt;/h2&gt;

&lt;p&gt;ADMIN’s real intent was simple: &lt;strong&gt;020 had been accepted; continue with a Phase 2 product upgrade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But PM made a “project-manager-like” structural choice during execution: Phase 2 was kept inside the same &lt;code&gt;panel-task-020&lt;/code&gt; thread, and the disk formed a &lt;strong&gt;&lt;code&gt;020 → 004&lt;/code&gt; product-evolution tree&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is the emergence point.&lt;/strong&gt; It was not simply that ADMIN phrased the request incorrectly, nor that PM wrote a wrong field. Product intent and lifecycle representation overlapped in the same collaboration thread, and the tree shape grew out of that overlap.&lt;/p&gt;

&lt;p&gt;This was not a simple mistake. It was two layers of truth stacked together:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Judgment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product semantics&lt;/td&gt;
&lt;td&gt;✅ Reasonable. 004 really was Grid Runner Phase 2, continuing from 020.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle semantics&lt;/td&gt;
&lt;td&gt;⚠️ Risky. If 004 enters the same thread / parent relationship before 020 is fully archived, 020 can be blocked by &lt;code&gt;CHILD_TASKS_OPEN&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol capability&lt;/td&gt;
&lt;td&gt;✅ Emergent. FCoP grew a structure from “task flow” into “project root → phase → execution line.”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Console expression&lt;/td&gt;
&lt;td&gt;❌ Insufficient. The console still presented a single-task lifecycle, so users saw &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;report_missing&lt;/code&gt;, and &lt;code&gt;child_open&lt;/code&gt; mixed together.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Grid Runner itself was just a mini-game. &lt;strong&gt;The structure produced by the collaboration was more important than the game.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Originally, FCoP only had a task flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ADMIN → PM → DEV/OPS/QA → REPORT → REVIEW → DONE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this Grid Runner run produced another shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project Root → Phase → Execution Tasks → Fix Line → Final Close
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tree on disk looked like this, consistent with the ASCII tree PM drew in chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260613-020  Grid Runner v0.1 / static-game milestone
└── TASK-20260614-004  Phase 2 product upgrade
    ├── 005 DEV
    ├── 006 OPS
    ├── 007 QA
    ├── 008 DEV fix
    └── 009 OPS fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matches the internal EVAL observation: it identified &lt;code&gt;020→004→005/006/007/008&lt;/code&gt; as a “main task → phase task → execution task” project tree, and judged the value as: FCoP emerged product-evolution tree and project-management capability from task-flow management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The final reading should be consistent across the article, archive behavior, and future spec:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;020 is not a standalone completed project.&lt;/strong&gt; &lt;strong&gt;004 is Phase 2 under 020.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Their child tasks do not overlap, but the business line is continuous; the &lt;code&gt;thread_key&lt;/code&gt; is the same, and &lt;code&gt;references&lt;/code&gt; / &lt;code&gt;parent&lt;/code&gt; relationships are valid.&lt;/li&gt;
&lt;li&gt;Therefore, &lt;strong&gt;020 entering &lt;code&gt;done/&lt;/code&gt; does not mean the whole tree can be archived&lt;/strong&gt;. As long as 004 or 007 is still open, &lt;code&gt;CHILD_TASKS_OPEN&lt;/code&gt; is reasonable. It is not a console bug. It is the protocol protecting tree consistency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The valuable discoveries are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;FCoP naturally grew Project / Phase / Execution layers.&lt;/strong&gt; From demo to product, from version one to later versions, from main line to phase, from execution to QA, from failure to fix, and from a single task’s &lt;code&gt;done&lt;/code&gt; state to whole-tree archive, everything happened inside the same collaboration thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;parent&lt;/code&gt;, &lt;code&gt;thread_key&lt;/code&gt;, and &lt;code&gt;references&lt;/code&gt; already carry project-tree semantics&lt;/strong&gt;, not just task-reference semantics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The console still treats lifecycle mostly as single-task lifecycle&lt;/strong&gt;, so &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;report_missing&lt;/code&gt;, and &lt;code&gt;child_open&lt;/code&gt; can appear together and confuse the user. The tree exists in files; the UI has not caught up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The protocol should absorb this capability.&lt;/strong&gt; When PM creates a Phase, PM must choose: &lt;strong&gt;continue the current main line&lt;/strong&gt; or &lt;strong&gt;create an independent thread&lt;/strong&gt;. The system should not wait for an archive failure and then rely on chat to draw the tree.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In one sentence: this was controlled emergence. Grid Runner grew from a normal task flow into a product-iteration tree. &lt;strong&gt;020 is the project root, and 004 is Phase 2, not a separate project.&lt;/strong&gt; Nobody added a new button for this. Existing protocol rules, real execution, and archive constraints stacked together. The shape became readable, auditable, and blockable. That is the life of a protocol.&lt;/p&gt;




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

&lt;p&gt;I will remember this Grid Runner two-line run as a case of &lt;strong&gt;controlled emergence&lt;/strong&gt; in FCoP.&lt;/p&gt;

&lt;p&gt;The core was &lt;strong&gt;not&lt;/strong&gt; that AI invented project management.&lt;/p&gt;

&lt;p&gt;It was this combination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parent
thread_key
references
PM Phase planning
CHILD_TASKS_OPEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Together, these rules naturally formed a project tree.&lt;/p&gt;

&lt;p&gt;So FCoP should not avoid this phenomenon. It should absorb it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In one sentence: FCoP grew a project tree; now the protocol needs to write it down.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Evidence Behind This Observation
&lt;/h2&gt;

&lt;p&gt;This section keeps only &lt;strong&gt;links and key excerpts&lt;/strong&gt;. The full source files are not pasted here, to avoid turning the article into a log dump. Primary TASK / EVAL originals from the CodeFlowMu dogfood run are catalogued in the &lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/from-mini-game-to-project-tree-evidence/INDEX.md" rel="noopener noreferrer"&gt;evidence archive&lt;/a&gt;; figures in this essay live under &lt;a href="https://github.com/joinwell52-AI/FCoP/tree/main/essays/assets" rel="noopener noreferrer"&gt;&lt;code&gt;essays/assets/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Reference&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Original task&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/from-mini-game-to-project-tree-evidence/TASK-20260613-020-ADMIN-to-PM.md" rel="noopener noreferrer"&gt;&lt;code&gt;TASK-20260613-020&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The original Grid Runner v0.1 task. It later became the project root. Key field: &lt;code&gt;thread_key: panel-task-020&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 2 task&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/from-mini-game-to-project-tree-evidence/TASK-20260614-004-ADMIN-to-PM.md" rel="noopener noreferrer"&gt;&lt;code&gt;TASK-20260614-004&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The later Grid Runner Phase 2 task. Key field: &lt;code&gt;references: TASK-20260613-020&lt;/code&gt;, same thread.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EVAL source report&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joinwell52-AI/FCoP/blob/main/essays/from-mini-game-to-project-tree-evidence/GAP-20260614-004-panel-scan.md" rel="noopener noreferrer"&gt;&lt;code&gt;GAP-20260614-004-panel-scan&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The internal EVAL scan triggered from the console. It detected &lt;code&gt;project_tree_emergence&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key fields can be compressed into four lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260613-020: thread_key = panel-task-020
TASK-20260614-004: references = TASK-20260613-020
EVAL: project_tree_emergence
Archive guard: CHILD_TASKS_OPEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What EVAL Observed
&lt;/h3&gt;

&lt;p&gt;The internal EVAL scan identified the Grid Runner line as a project tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TASK-20260613-020  Grid Runner v0.1 / project root
└── TASK-20260614-004  Phase 2 product upgrade
    ├── TASK-20260614-005  DEV execution
    ├── TASK-20260614-006  OPS verification
    ├── TASK-20260614-007  QA playtest
    └── TASK-20260614-008  DEV fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its canonical reading was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;020 → 004 → 005 / 006 / 007 / 008
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words: &lt;strong&gt;main task → phase task → execution task&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;EVAL also detected smaller local fix chains, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;004 → 007 → 008
004 → 008 → 009
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those local observations are useful, but they do not replace the main-line interpretation: &lt;strong&gt;020 is the project root of the Grid Runner product line, and 004 is Phase 2 under 020.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminology
&lt;/h3&gt;

&lt;p&gt;The table below explains the FCoP terms used in this article without requiring readers to know Chinese.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Meaning in this article&lt;/th&gt;
&lt;th&gt;Protocol marker&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Collaboration thread&lt;/td&gt;
&lt;td&gt;A continuous line of work that keeps related tasks together. In this case, Grid Runner stayed under the same thread.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;thread_key&lt;/code&gt;, here &lt;code&gt;panel-task-020&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continues from&lt;/td&gt;
&lt;td&gt;A task explicitly builds on an earlier task or delivery. Phase 2 continued from the v0.1 task.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;references&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parent task&lt;/td&gt;
&lt;td&gt;A task that owns or contains lower-level tasks. A parent should not be archived while its children are still open.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;parent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open child tasks&lt;/td&gt;
&lt;td&gt;Lower-level tasks are still not fully closed. This is why the archive attempt was blocked.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CHILD_TASKS_OPEN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal EVAL scan&lt;/td&gt;
&lt;td&gt;A CodeFlowMu internal scan that reads TASK / REPORT files and detects possible workflow structures. It is supporting evidence, not the formal ledger.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GAP-*-panel-scan.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project-tree emergence&lt;/td&gt;
&lt;td&gt;The observed pattern where FCoP task flow began to express a product structure: project root → phase → execution → fix.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project_tree_emergence&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FCoP repository&lt;/strong&gt;: &lt;a href="https://github.com/joinwell52-AI/FCoP" rel="noopener noreferrer"&gt;https://github.com/joinwell52-AI/FCoP&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>fcop</category>
      <category>governance</category>
    </item>
  </channel>
</rss>
