<?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: Fujo</title>
    <description>The latest articles on DEV Community by Fujo (@fujo_for_text).</description>
    <link>https://dev.to/fujo_for_text</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%2F3980176%2F52a6baf5-8c13-4fd9-92c3-90464a04d16c.png</url>
      <title>DEV Community: Fujo</title>
      <link>https://dev.to/fujo_for_text</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fujo_for_text"/>
    <language>en</language>
    <item>
      <title>We're fed up with Rust's borrow checker. It's time to break free.</title>
      <dc:creator>Fujo</dc:creator>
      <pubDate>Tue, 20 Oct 2026 20:13:43 +0000</pubDate>
      <link>https://dev.to/fujo_for_text/were-fed-up-with-rusts-borrow-checker-its-time-to-break-free-3ien</link>
      <guid>https://dev.to/fujo_for_text/were-fed-up-with-rusts-borrow-checker-its-time-to-break-free-3ien</guid>
      <description>&lt;p&gt;I like Rust. I also dread the moment the borrow checker says no and the compiler refuses to&lt;br&gt;
explain what it assumed.&lt;/p&gt;

&lt;p&gt;That is not a complaint about competence. Rust's borrow checker is one of the most valuable&lt;br&gt;
things to happen to systems programming. It is a complaint about &lt;strong&gt;posture&lt;/strong&gt;: the compiler stands&lt;br&gt;
outside your program, announces a verdict, and the burden of proof lands on you. When the verdict&lt;br&gt;
is wrong, there is often no receipt to inspect.&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://github.com/Loment-Lang/Loment" rel="noopener noreferrer"&gt;Loment&lt;/a&gt; around a different posture. It keeps the&lt;br&gt;
checks; it moves the burden. This post is about what that means precisely, because "we removed the&lt;br&gt;
borrow checker" would be a lie, and the interesting part is not the removal.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Loment keeps
&lt;/h2&gt;

&lt;p&gt;Loment is a systems language with a Rust-flavoured surface. It still checks the ownership&lt;br&gt;
mistakes that matter most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use after move (E006),&lt;/li&gt;
&lt;li&gt;a mutable borrow alongside another borrow (E007),&lt;/li&gt;
&lt;li&gt;a dangling reference (E012).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also adds capability domains (&lt;code&gt;capability disk[0..4]&lt;/code&gt; plus &lt;code&gt;guard&lt;/code&gt;), compiles to a native&lt;br&gt;
ELF/PE artifact with no runtime by default, and has two implementations — a Python reference and&lt;br&gt;
a self-hosted one — that must emit &lt;strong&gt;byte-identical IR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What it does &lt;strong&gt;not&lt;/strong&gt; do is pretend to be Rust's borrow checker. The boundary is written down in&lt;br&gt;
the repository: it proves three things and explicitly does not prove four others (no lifetimes, no&lt;br&gt;
cross-function reasoning, no field-level moves, no branch-sensitive move sets). Keep that in mind&lt;br&gt;
for the rest of this post.&lt;/p&gt;
&lt;h2&gt;
  
  
  From verdict to receipt
&lt;/h2&gt;

&lt;p&gt;The change is a seventh &lt;code&gt;choose&lt;/code&gt; dimension called &lt;strong&gt;LSPE&lt;/strong&gt; — Loment Safety Police Espace. It does&lt;br&gt;
not change any verdict. It changes what a verdict leaves behind.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;lspe_open_admin&lt;/code&gt; (the default), every allowance is recorded in the artifact's Potato v16&lt;br&gt;
ledger: the site, the obligation, the evidence, and what is still unproved. With&lt;br&gt;
&lt;code&gt;lspe_close_admin&lt;/code&gt;, the &lt;strong&gt;recording&lt;/strong&gt; is turned off; the LMS, runtime and capability decisions are&lt;br&gt;
unchanged. The audit is not a second checker bolted on top — it is a ledger of the compiler's own&lt;br&gt;
decisions, answerable offline.&lt;/p&gt;

&lt;p&gt;The design document puts it more bluntly than I can:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rust's borrow checker is a god. LSPE is a shop assistant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A god stands outside the transaction and says "no". An assistant stands inside it, has to name the&lt;br&gt;
price, and gives you a receipt. Concretely, LSPE has three outcomes instead of two:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PROVED&lt;/code&gt; — here is the evidence;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UNDECIDED&lt;/code&gt; — here is the site where my proof has a hole;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REFUTED&lt;/code&gt; — here is a counterexample, so this is a hard no.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"Undecided" is a first-class result. In strict mode it becomes E034; the ledger's own consistency&lt;br&gt;
failures are E035–E037. The point is not that the compiler is always right. The point is that when&lt;br&gt;
it is wrong, you can point at the site and the obligation instead of arguing with a verdict.&lt;/p&gt;
&lt;h2&gt;
  
  
  "Gentle" is a measurable claim
&lt;/h2&gt;

&lt;p&gt;It is easy to say a checker is friendlier. We tried to make it falsifiable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Same verdicts.&lt;/strong&gt; Compile the same corpus with the audit open and closed: the set of
decisions is identical. The audit changes the ledger, not the language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No silent permit.&lt;/strong&gt; Every allow has a source, or an explicitly recorded assumption. An allow
with neither is an error in the ledger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No overclaiming.&lt;/strong&gt; LSPE does &lt;strong&gt;not&lt;/strong&gt; claim to prove more than Rust. What it adds is
accountability, not completeness. The remaining cases are &lt;code&gt;UNDECIDED&lt;/code&gt; and labeled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the sense in which it is "gentler with nearly the same safety": not that it catches&lt;br&gt;
everything Rust catches, but that the same checks no longer arrive as an unaccountable verdict.&lt;/p&gt;

&lt;p&gt;Loment also has a memory-safety ladder, &lt;code&gt;lms&lt;/code&gt;, with seven levels and four tiers&lt;br&gt;
(&lt;code&gt;lms_full&lt;/code&gt;, &lt;code&gt;lms_forensic_admin&lt;/code&gt;, &lt;code&gt;lms_daily_admin&lt;/code&gt;, &lt;code&gt;lms_manage_only_admin&lt;/code&gt;). The default is&lt;br&gt;
full; writing a lower tier is a downgrade and carries &lt;code&gt;_admin&lt;/code&gt;. The literal-out-of-range check is&lt;br&gt;
E028; use-after-free is E029.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it looks like
&lt;/h2&gt;

&lt;p&gt;The defaults, written out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;demo&lt;/span&gt;
&lt;span class="n"&gt;choose&lt;/span&gt; &lt;span class="n"&gt;runtime&lt;/span&gt;
&lt;span class="n"&gt;choose&lt;/span&gt; &lt;span class="n"&gt;lms_full&lt;/span&gt;
&lt;span class="n"&gt;choose&lt;/span&gt; &lt;span class="n"&gt;lspe_open_admin&lt;/span&gt;

&lt;span class="n"&gt;capability&lt;/span&gt; &lt;span class="n"&gt;disk_slots&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;revocable&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;write_slot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;guard&lt;/span&gt; &lt;span class="nf"&gt;disk_slots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;// a runtime index: you guard it, the language does not guess&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;syscall4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details matter here. &lt;code&gt;guard&lt;/code&gt; bounds the index, not the subject — it is not authorization.&lt;br&gt;
And the array write is still your responsibility: Loment refuses a &lt;em&gt;literal&lt;/em&gt; out-of-range index&lt;br&gt;
at compile time (E028), but a runtime index is not silently checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not mean
&lt;/h2&gt;

&lt;p&gt;I would rather say this before the comments do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Loment is early.&lt;/strong&gt; 0.1.5 is the release where LSPE lands; the packaged front end is still
being finished. Do not rewrite your service in it this weekend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is not Rust.&lt;/strong&gt; The borrow checking is a subset. No lifetimes, no cross-function
reasoning, no field-level moves, no branch-sensitive move sets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"No receipt" is not the same as "no bug".&lt;/strong&gt; LSPE records the compiler's decisions; it does
not make the compiler omniscient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defaults are not free.&lt;/strong&gt; &lt;code&gt;lms_full&lt;/code&gt; is the default and it changes the emitted artifact
(inline bounds checks on &lt;code&gt;alloc(&amp;lt;const&amp;gt;)&lt;/code&gt;-derived accesses). That exception is documented, not
hidden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The benchmark is a pilot.&lt;/strong&gt; We measured an LLM agent writing Loment from the guide alone:
three tasks, one attempt each, Rust and Python as controls. It is a direction, not a
confidence interval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason I care about the receipt is not abstract. Rust's own tracker has a soundness bug&lt;br&gt;
(#164250) where an obligation was not rechecked after substitution, and it stayed invisible for&lt;br&gt;
years — not because Rust's team is careless, but because a verdict-only compiler leaves nothing&lt;br&gt;
to audit when the verdict is wrong. LSPE's answer to that shape is a record with a site id&lt;br&gt;
(&lt;code&gt;Q004 stale_wf&lt;/code&gt;), readable offline. That is the part I want other language designers to steal,&lt;br&gt;
whether or not they like Loment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it, then tell us where the receipt is wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/Loment-Lang/Loment" rel="noopener noreferrer"&gt;https://github.com/Loment-Lang/Loment&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are not asking you to believe the slogan. We are asking you to compile something, read the&lt;br&gt;
ledger, and tell us which line is wrong. That is the whole point of moving the burden.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I'm one of Loment's authors. This draft was prepared with an AI assistant and&lt;br&gt;
reviewed before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>programming</category>
      <category>compilers</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Give Your Agent a Mistake Once — ORP Turns AI Agent Failures into Tested Lessons</title>
      <dc:creator>Fujo</dc:creator>
      <pubDate>Thu, 11 Jun 2026 21:29:34 +0000</pubDate>
      <link>https://dev.to/fujo_for_text/give-your-agent-a-mistake-once-orp-turns-ai-agent-failures-into-tested-lessons-llh</link>
      <guid>https://dev.to/fujo_for_text/give-your-agent-a-mistake-once-orp-turns-ai-agent-failures-into-tested-lessons-llh</guid>
      <description>&lt;p&gt;Originally published on GitHub: &lt;a href="https://github.com/Fujo930/ORP" rel="noopener noreferrer"&gt;https://github.com/Fujo930/ORP&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tracing tells you what your AI agent &lt;em&gt;did&lt;/em&gt;. But it doesn't tell you what it &lt;em&gt;learned&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;After building and debugging coding agents for months, I noticed a pattern: the same failure modes recur across runs, across tasks, and sometimes across agents. A coding agent misses the anonymous-user test path. Another agent modifies the wrong file. A third keeps running the same failing command expecting different results.&lt;/p&gt;

&lt;p&gt;Each failure leaves a trace. But traces don't become experience. Until now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing ORP
&lt;/h2&gt;

&lt;p&gt;ORP (Open Reflection Protocol) is an &lt;strong&gt;open experience layer for AI agents&lt;/strong&gt;, built on OpenTelemetry. It converts agent traces into three executable artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt; — retrievable, scope-scoped advice ("Test anonymous, authenticated, and forbidden paths")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eval&lt;/strong&gt; — regression test that reproduces the failure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrail&lt;/strong&gt; — preventative rule&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each Lesson goes through a lifecycle: &lt;code&gt;candidate → active → under_review → deprecated → rejected&lt;/code&gt;. Only active lessons are retrievable, and every lesson's effect is measured before it stays active.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evidence-first design
&lt;/h3&gt;

&lt;p&gt;ORP doesn't claim to capture an agent's "real thinking." It distinguishes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observations&lt;/strong&gt; — tool output, test results, exit codes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claims&lt;/strong&gt; — what the agent says (diagnoses, confidence, "the fix is complete")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claims are never automatically treated as ground truth. They get challenged.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Wrap any agent&lt;/span&gt;
orp wrap &lt;span class="nt"&gt;--&lt;/span&gt; python my_agent.py

&lt;span class="c"&gt;# 2. ORP captures the run, challenges unproven claims,&lt;/span&gt;
&lt;span class="c"&gt;#    compiles a Lesson + regression Eval&lt;/span&gt;
orp learn latest

&lt;span class="c"&gt;# 3. Deliver lessons to future runs via MCP&lt;/span&gt;
orp mcp-server &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio

&lt;span class="c"&gt;# 4. Before/after comparison&lt;/span&gt;
orp diff exp_before exp_after
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP server exposes three tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;When to call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orp_retrieve_lessons(task, limit)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start of a new task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orp_acknowledge_lesson(lesson_id)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After receiving a lesson&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orp_report_outcome(lesson_id, outcome)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After applying the lesson&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Experimental results
&lt;/h2&gt;

&lt;p&gt;We ran &lt;strong&gt;10 common coding-agent failure patterns&lt;/strong&gt;, 5 trials each (100 total runs):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Without ORP&lt;/th&gt;
&lt;th&gt;With ORP&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task success rate&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+86%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeat failure rate&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% reduction&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lesson application&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eval validity&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Go/No-Go assessment: &lt;strong&gt;4/4 checks passed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Design principles
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Evidence first&lt;/strong&gt; — conclusions must cite evidence; unsubstantiated claims are flagged&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executable reflection&lt;/strong&gt; — lessons compile to evals and guardrails, not just text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outcome-based&lt;/strong&gt; — lesson value is determined by whether it actually improves results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenTelemetry-native&lt;/strong&gt; — extends existing trace infrastructure instead of replacing it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default private&lt;/strong&gt; — all data stays local, de-identified, no prompt/tool output uploaded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lesson lifecycle&lt;/strong&gt; — candidate → active (verified) → under_review (conflict) → deprecated → rejected&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real LLM experiments&lt;/strong&gt; — running the 10-task suite with actual LLM agents via API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework integrations&lt;/strong&gt; — native hooks for AG2, LangGraph, OpenAI Agents SDK&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP ecosystem&lt;/strong&gt; — ORP as a standard MCP server for any MCP-compatible agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;open-reflection-protocol

&lt;span class="c"&gt;# Run the complete demo&lt;/span&gt;
uv run python demo/orp_demo.py

&lt;span class="c"&gt;# Run the experiment suite&lt;/span&gt;
uv run python exps/runner.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/Fujo930/ORP" rel="noopener noreferrer"&gt;Fujo930/ORP&lt;/a&gt;&lt;br&gt;
License: MIT&lt;br&gt;
Dependencies: pydantic (only)&lt;/p&gt;




&lt;p&gt;&lt;em&gt;ORP is built on the insight that agent failures don't have to repeat. Give your agent a mistake once. ORP helps it prove that it learned.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
