<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Feedback Loops on FrenchForet</title><link>https://learn.frenchforet.com/feedback-loops/</link><description>Recent content in Feedback Loops on FrenchForet</description><generator>Hugo</generator><language>en</language><atom:link href="https://learn.frenchforet.com/feedback-loops/index.xml" rel="self" type="application/rss+xml"/><item><title>The Loop You Can't See</title><link>https://learn.frenchforet.com/feedback-loops/00-the-loop-you-cant-see/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/00-the-loop-you-cant-see/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand the problem this course solves, and why it is harder than &amp;ldquo;add some
logging.&amp;rdquo; A modern agent decides and acts on its own — it picks tools, spends money, retries,
and sometimes changes its own behavior. Each of those is a &lt;em&gt;feedback loop&lt;/em&gt;: it senses something,
decides, and acts. This course is about building those loops so you can trust them — and the
thing that makes a loop trustworthy is &lt;strong&gt;observability&lt;/strong&gt;. A loop you cannot see is a loop you
cannot debug, cannot improve, and should not let run on its own. The course argues that autonomy
is &lt;em&gt;earned&lt;/em&gt;, and what earns it is the telemetry that makes every decision visible.&lt;/p&gt;</description></item><item><title>Joinable Signal: Trace &amp; Session IDs by Hand</title><link>https://learn.frenchforet.com/feedback-loops/01-joinable-signal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/01-joinable-signal/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build the smallest piece of observability that everything else depends on — a
&lt;strong&gt;joinable signal&lt;/strong&gt;. Before a feedback loop can act, it needs to read a signal it can trust, and
&amp;ldquo;trust&amp;rdquo; starts with being able to tie records together: this log line, that cost, this tool call
all belong to &lt;em&gt;the same run&lt;/em&gt;. You will build a tiny correlation primitive by hand — a
&lt;code&gt;session_id&lt;/code&gt;, a &lt;code&gt;trace_id&lt;/code&gt;, and a &lt;code&gt;step&lt;/code&gt; — and emit one joinable JSONL record per operation. It
is an OpenTelemetry-shaped context, built without the SDK; Unit 11 meets the standard.&lt;/p&gt;</description></item><item><title>An Event Vocabulary, Not Log Lines</title><link>https://learn.frenchforet.com/feedback-loops/02-event-vocabulary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/02-event-vocabulary/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; make the joinable signal from Unit 1 &lt;em&gt;queryable&lt;/em&gt;. A log full of free-text strings —
&lt;code&gt;&amp;quot;calling search tool&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;search done&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;search failed!&amp;quot;&lt;/code&gt; — cannot be counted, aggregated, or
alerted on, because nothing ties the three together. You will replace ad-hoc strings with a small
&lt;strong&gt;vocabulary of semantic events&lt;/strong&gt;: named constants, each with one fixed shape. Then you will
separate the agent&amp;rsquo;s own background traffic from real user activity, so a feedback loop&amp;rsquo;s
self-monitoring never looks like a user.&lt;/p&gt;</description></item><item><title>Spans &amp; the Latency Breakdown</title><link>https://learn.frenchforet.com/feedback-loops/03-spans-and-latency/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/03-spans-and-latency/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; measure &lt;em&gt;where&lt;/em&gt; a turn spends its time, not just that it was slow. &amp;ldquo;The turn took 4
seconds&amp;rdquo; is not an actionable signal — a latency or cost loop needs to know &lt;em&gt;which phase&lt;/em&gt; burned
the time. You will build a small &lt;strong&gt;span timer&lt;/strong&gt; that records each phase of a turn on a monotonic
clock, classifies spans into phases (setup, context, routing, inference, tools, synthesis), and
emits a latency &lt;strong&gt;breakdown&lt;/strong&gt; as one joinable record.&lt;/p&gt;</description></item><item><title>The First Closed Loop: a Runtime Gate</title><link>https://learn.frenchforet.com/feedback-loops/04-runtime-gate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/04-runtime-gate/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build the first loop that actually &lt;em&gt;acts&lt;/em&gt;. Units 1–3 made the agent observable; now you
use that signal to change what the agent does next, inside a single turn. You will build a small
finite-state &lt;strong&gt;gate&lt;/strong&gt; that watches an agent&amp;rsquo;s tool calls and &lt;strong&gt;blocks&lt;/strong&gt; a runaway — the
reflex-tier loop that, in Unit 0&amp;rsquo;s war story, was the one thing that worked. Sense → decide → act
→ emit a verdict, in milliseconds, with no human and no model in the loop.&lt;/p&gt;</description></item><item><title>Budget as Feedforward Control</title><link>https://learn.frenchforet.com/feedback-loops/05-budget-feedforward/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/05-budget-feedforward/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build a loop that acts on what is &lt;em&gt;about&lt;/em&gt; to happen, not what already did. The loop gate
(Unit 4) reacts to a call after it runs — fine when the cost is a wasted iteration, wrong when the
cost is real money you cannot take back. You will build a &lt;strong&gt;budget gate&lt;/strong&gt; that reserves against a
&lt;em&gt;projected&lt;/em&gt; cost &lt;strong&gt;before&lt;/strong&gt; the call and refuses it if it would breach the cap. This is
&lt;strong&gt;feedforward control&lt;/strong&gt;, and it is the right shape for any action you cannot undo.&lt;/p&gt;</description></item><item><title>Reflection: Self-Critique from Traces</title><link>https://learn.frenchforet.com/feedback-loops/06-reflection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/06-reflection/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; climb from the reflex tier to the &lt;strong&gt;reflective&lt;/strong&gt; tier. The gates in Units 4–5 act in the
moment on simple rules. Now the agent does something slower and harder: after a turn finishes, it
reads its &lt;em&gt;own&lt;/em&gt; trace and critiques it — producing a written, structured judgment about what went
well and what to change. You will build both halves: a deterministic pass that mines the failure
path from a trace, and a model pass that turns it into a structured &lt;strong&gt;proposed change&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Closing the Reflective Loop</title><link>https://learn.frenchforet.com/feedback-loops/07-closing-the-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/07-closing-the-loop/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; close the loop you opened in Unit 6. A reflection that is only saved to disk, or only
shown to a human, is an &lt;strong&gt;open loop&lt;/strong&gt; — the agent critiqued itself and nothing changed. You close it
by feeding a small, relevant slice of past reflections back into the next turn&amp;rsquo;s context, so the
agent re-reads its own observations. This is the clearest example in the course of an agent&amp;rsquo;s
&lt;strong&gt;output becoming its future behavior&lt;/strong&gt; — and it is mostly about deciding &lt;em&gt;which&lt;/em&gt; reflections to
trust enough to surface.&lt;/p&gt;</description></item><item><title>Hysteresis: Dedup &amp; Promotion</title><link>https://learn.frenchforet.com/feedback-loops/08-hysteresis-dedup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/08-hysteresis-dedup/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build the mechanism Unit 7 leaned on. There you surfaced only reflections with
&lt;code&gt;seen_count &amp;gt;= 2&lt;/code&gt;, on the principle that &lt;em&gt;&amp;ldquo;single-instance reflections are noise; recurring
patterns are signal.&amp;rdquo;&lt;/em&gt; Now you build the part that produces that count — &lt;strong&gt;deduplicating&lt;/strong&gt;
equivalent proposals into one, &lt;strong&gt;counting&lt;/strong&gt; recurrences, and &lt;strong&gt;promoting&lt;/strong&gt; only the patterns that
both recur and persist. This is &lt;strong&gt;hysteresis&lt;/strong&gt;: a deadband that stops the slow outer loop from
acting on a single, fresh observation.&lt;/p&gt;</description></item><item><title>Human in the Loop, Async</title><link>https://learn.frenchforet.com/feedback-loops/09-human-in-the-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/09-human-in-the-loop/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; close a loop you should &lt;em&gt;not&lt;/em&gt; close automatically. A promoted proposal (Unit 8) is a
candidate change to the agent itself — its prompt, its config, its behaviour. That is the most
irreversible, highest-stakes action in the course, so the loop stays &lt;strong&gt;open until a human closes
it.&lt;/strong&gt; You will build the async approval channel: a promoted proposal becomes a ticket, a human
gives a verdict from wherever they are, a poller reads it back, and the verdict flows into the
system — approve, reject, or re-evaluate. The human&amp;rsquo;s judgment is the loop&amp;rsquo;s closing signal.&lt;/p&gt;</description></item><item><title>Watching the Apparatus</title><link>https://learn.frenchforet.com/feedback-loops/10-watching-the-apparatus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/10-watching-the-apparatus/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build the loop that watches the other loops. You have feedback loops at every tier now —
but each one trusts the signal beneath it, and that signal can become invalid without any alert
(Unit 1&amp;rsquo;s cost ledger with 4,077 NULL &lt;code&gt;trace_id&lt;/code&gt;s did exactly that). The &lt;strong&gt;meta&lt;/strong&gt; tier closes a loop
around the apparatus itself: a monitor that periodically checks the observability is still intact —
that a run is still joinable across every store — and that the gates and background loops still run.
The monitor is itself monitored.&lt;/p&gt;</description></item><item><title>Meeting the Standard: OpenTelemetry at the Boundary</title><link>https://learn.frenchforet.com/feedback-loops/11-opentelemetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/11-opentelemetry/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; meet the standard you have been hand-building all along — and decide whether to adopt it.
Across Units 1–3 you built a &lt;code&gt;trace_id&lt;/code&gt;, an event vocabulary, and spans. In Unit 10 you walked one
run across four different stores and felt the hand-rolled approach strain. That strain is the
&lt;strong&gt;need&lt;/strong&gt;: a bespoke format is fine inside one process, but the moment signal must cross
processes, services, and substrates, you need a shared contract. &lt;strong&gt;OpenTelemetry&lt;/strong&gt; is that contract
— and it is, almost exactly, the thing you already built.&lt;/p&gt;</description></item><item><title>The Measured Default</title><link>https://learn.frenchforet.com/feedback-loops/12-the-measured-default/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/feedback-loops/12-the-measured-default/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; gather the whole course into one decision and one discipline. The decision is the
&lt;strong&gt;autonomy gradient&lt;/strong&gt; as a tree: which loops you close automatically, and which you keep
human-closed. The discipline is how you know — &lt;strong&gt;evals run as a hypothesis, not a gate.&lt;/strong&gt; This is
the measured default the instrumentation earned, not the author: don&amp;rsquo;t ship a black box, and earn
autonomy by being observable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; the final unit. It does not add a tier; it ties the five together (sense →
reflex → reflective → deliberative → meta) and adds the outermost loop — evaluation — that tells
you whether any of it is working.&lt;/p&gt;</description></item></channel></rss>