<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://academy-agents.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://academy-agents.org/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-08-14T22:11:19+00:00</updated><id>https://academy-agents.org/feed.xml</id><title type="html">Academy</title><subtitle>Modular and extensible middleware for building and deploying stateful, autonomous agents across distributed systems and federated research infrastructure.</subtitle><entry><title type="html">APeX Summit (Academy, Parsl, Globus Compute) annual community meeting</title><link href="https://academy-agents.org/blog/2026/07/apex-summit/" rel="alternate" type="text/html" title="APeX Summit (Academy, Parsl, Globus Compute) annual community meeting" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://academy-agents.org/blog/2026/07/apex-summit</id><content type="html" xml:base="https://academy-agents.org/blog/2026/07/apex-summit/"><![CDATA[]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Academy Tutorial: ISC 2026</title><link href="https://academy-agents.org/blog/2026-06-22-isc-tutorial.html" rel="alternate" type="text/html" title="Academy Tutorial: ISC 2026" /><published>2026-06-22T00:00:00+00:00</published><updated>2026-06-22T00:00:00+00:00</updated><id>https://academy-agents.org/blog/isc-tutorial</id><content type="html" xml:base="https://academy-agents.org/blog/2026-06-22-isc-tutorial.html"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>Agentic systems, in which autonomous agents collaborate to solve complex
problems, are emerging as a transformative methodology in AI. However, adapting
agentic architectures to scientific cyberinfrastructure — spanning HPC systems,
experimental facilities, and federated data repositories — introduces new
technical challenges. Join us at <a href="https://isc-hpc.com">ISC 2026</a> for a half-day
tutorial, where we will introduce participants to the design, deployment, and
management of scalable agentic systems for scientific discovery. We will present
Academy, a Python-based middleware platform built to support agentic workflows
across heterogeneous research environments. Participants will learn core agentic
system concepts, including asynchronous execution models, stateful agent
orchestration, and dynamic resource management. A guided hands-on session will
help attendees build and launch their own agentic workflows. We will present
case studies in materials discovery, biology, and chemistry. This tutorial is
designed for researchers, developers, and cyberinfrastructure professionals
interested in advancing AI-driven science with next-generation autonomous
systems. To attend the tutorial, you need to
<a href="https://isc-hpc.com">register</a> to attend ISC.</p>

<h2 id="tutorial-materials">Tutorial materials</h2>

<h3 id="code">Code</h3>

<p>The code for the tutorial is available in the
<a href="https://github.com/academy-agents/academy-tutorial">GitHub repository</a>. Clone the repository and
check out the <code class="language-plaintext highlighter-rouge">isc-26</code> branch for the environment specific to this tutorial.
(Note: the branch will be available closer to the tutorial date.)</p>

<h3 id="slides">Slides</h3>

<p><a href="/files/isc2026-tutorial.pdf">Slides for the Academy Tutorial ISC 2026</a></p>

<h2 id="participant-requirements">Participant requirements</h2>

<p>Participants need intermediate knowledge of coding in Python, and a laptop where
they can write and run Python code. A test Linux environment for remote
computing and access to an inference service will be provided to attendees of
the tutorial. (If completing the tutorial independently, instructions for
setting up the test environment will be provided, and a different inference
service can be used.)</p>

<h2 id="schedule-tentative">Schedule (tentative)</h2>

<div class="table-wrap">
<table class="schedule-table">
  <thead>
    <tr>
      <th>Time</th>
      <th>Topic</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>8:30 &ndash; 9:00</td>
      <td>Introduction</td>
    </tr>
    <tr>
      <td>9:00 &ndash; 9:30</td>
      <td>Academy Overview</td>
    </tr>
    <tr class="hands-on">
      <td>9:30 &ndash; 10:00</td>
      <td>Hands-on: Getting Started</td>
    </tr>
    <tr class="break">
      <td>10:00 &ndash; 10:30</td>
      <td>Break</td>
    </tr>
    <tr class="hands-on">
      <td>10:30 &ndash; 11:00</td>
      <td>Hands-on: Remote Agents</td>
    </tr>
    <tr class="hands-on">
      <td>11:00 &ndash; 11:30</td>
      <td>Hands-on: Battleship</td>
    </tr>
    <tr>
      <td>11:30 &ndash; 11:45</td>
      <td>Demo: What&rsquo;s Next</td>
    </tr>
    <tr>
      <td>11:45 &ndash; 12:00</td>
      <td>Wrap Up</td>
    </tr>
  </tbody>
</table>
</div>]]></content><author><name>Alok Kamatar and Kyle Chard</name></author><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">Student presentation: Academy + Diaspora integration</title><link href="https://academy-agents.org/blog/2026/06/diaspora-integration/" rel="alternate" type="text/html" title="Student presentation: Academy + Diaspora integration" /><published>2026-06-17T00:00:00+00:00</published><updated>2026-06-17T00:00:00+00:00</updated><id>https://academy-agents.org/blog/2026/06/diaspora-integration</id><content type="html" xml:base="https://academy-agents.org/blog/2026/06/diaspora-integration/"><![CDATA[]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Academy Tutorial: IPDPS 2026</title><link href="https://academy-agents.org/blog/2026-05-26-ipdps-tutorial.html" rel="alternate" type="text/html" title="Academy Tutorial: IPDPS 2026" /><published>2026-05-26T00:00:00+00:00</published><updated>2026-05-26T00:00:00+00:00</updated><id>https://academy-agents.org/blog/ipdps-tutorial</id><content type="html" xml:base="https://academy-agents.org/blog/2026-05-26-ipdps-tutorial.html"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>Agentic systems, in which autonomous agents collaborate to solve complex
problems, are emerging as a transformative methodology in AI. However, adapting
agentic architectures to scientific cyberinfrastructure — spanning HPC systems,
experimental facilities, and federated data repositories — introduces new
technical challenges. Join us at <a href="https://www.ipdps.org">IPDPS 2026</a> for a
half-day tutorial, where we will introduce participants to the design,
deployment, and management of scalable agentic systems for scientific discovery.
We will present Academy, a Python-based middleware platform built to support
agentic workflows across heterogeneous research environments. Participants will
learn core agentic system concepts, including asynchronous execution models,
stateful agent orchestration, and dynamic resource management. A guided hands-on
session will help attendees build and launch their own agentic workflows. We
will present case studies in materials discovery, biology, and chemistry. This
tutorial is designed for researchers, developers, and cyberinfrastructure
professionals interested in advancing AI-driven science with next-generation
autonomous systems. To attend the tutorial, you need to
<a href="https://cvent.me/NaZnE8">register</a> to attend IPDPS.</p>

<h2 id="tutorial-materials">Tutorial materials</h2>

<h3 id="code">Code</h3>

<p>The code for the tutorial is available in the
<a href="https://github.com/academy-agents/academy-tutorial">GitHub repository</a>. Clone the repository and
check out the <code class="language-plaintext highlighter-rouge">ipdps-26</code> branch for material specific to this tutorial.
(Note: the branch will be available closer to the tutorial date.)</p>

<h3 id="slides">Slides</h3>

<p><a href="/files/ipdps2026-tutorial.pdf">Slides for the Academy Tutorial IPDPS 2026</a></p>

<h2 id="participant-requirements">Participant requirements</h2>

<p>Participants need intermediate knowledge of coding in Python, and a laptop where
they can write and run Python code. A test Linux environment for remote
computing and access to an inference service will be provided to attendees of
the tutorial. (If completing the tutorial independently, instructions for
setting up the test environment will be provided, and a different inference
service can be used.)</p>

<h2 id="schedule-tentative">Schedule (tentative)</h2>

<div class="table-wrap">
<table class="schedule-table">
  <thead>
    <tr>
      <th>Time</th>
      <th>Topic</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>8:30 &ndash; 9:00</td>
      <td>Introduction</td>
    </tr>
    <tr>
      <td>9:00 &ndash; 9:30</td>
      <td>Academy Overview</td>
    </tr>
    <tr class="hands-on">
      <td>9:30 &ndash; 10:00</td>
      <td>Hands-on: Getting Started</td>
    </tr>
    <tr class="break">
      <td>10:00 &ndash; 10:30</td>
      <td>Break</td>
    </tr>
    <tr class="hands-on">
      <td>10:30 &ndash; 11:00</td>
      <td>Hands-on: Remote Agents</td>
    </tr>
    <tr class="hands-on">
      <td>11:00 &ndash; 11:30</td>
      <td>Hands-on: Battleship</td>
    </tr>
    <tr>
      <td>11:30 &ndash; 11:45</td>
      <td>Demo: What&rsquo;s Next</td>
    </tr>
    <tr>
      <td>11:45 &ndash; 12:00</td>
      <td>Wrap Up</td>
    </tr>
  </tbody>
</table>
</div>]]></content><author><name>Alok Kamatar and Kyle Chard</name></author><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">AI+ Expo</title><link href="https://academy-agents.org/blog/2026/05/ai-expo/" rel="alternate" type="text/html" title="AI+ Expo" /><published>2026-05-20T00:00:00+00:00</published><updated>2026-05-20T00:00:00+00:00</updated><id>https://academy-agents.org/blog/2026/05/ai-expo</id><content type="html" xml:base="https://academy-agents.org/blog/2026/05/ai-expo/"><![CDATA[]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Keynote at the Midwest RCD Consortium</title><link href="https://academy-agents.org/blog/2026/05/midwest-rcd-keynote/" rel="alternate" type="text/html" title="Keynote at the Midwest RCD Consortium" /><published>2026-05-15T00:00:00+00:00</published><updated>2026-05-15T00:00:00+00:00</updated><id>https://academy-agents.org/blog/2026/05/midwest-rcd-keynote</id><content type="html" xml:base="https://academy-agents.org/blog/2026/05/midwest-rcd-keynote/"><![CDATA[]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Academy’s road map for observability</title><link href="https://academy-agents.org/blog/2026-05-logging.html" rel="alternate" type="text/html" title="Academy’s road map for observability" /><published>2026-05-11T00:00:00+00:00</published><updated>2026-05-11T00:00:00+00:00</updated><id>https://academy-agents.org/blog/logging</id><content type="html" xml:base="https://academy-agents.org/blog/2026-05-logging.html"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>This post carries on from a presentation I gave at Academy’s fortnightly
community call in February 2026.
<a href="/blog/academy-observability-2026-02.pdf">I put the slides for that presentation online</a>.</p>

<p>We’ve learned a few hard lessons about observability over the years working on
execution systems including <a href="https://parsl-project.org/">Parsl</a> and
<a href="https://www.globus.org/compute">Globus Compute</a>.</p>

<p>One is that developers of task execution systems try to hide the guts of their
system from users, because the task execution should be doing all the hard work.
That leads to trouble when those users graduate from “hello world” users to
power users who are both capable of understanding complex systems, and who
actively want to understand those systems as they debug what they have built.</p>

<p>I’ve encountered that in source code (this source code isn’t for you to read)
and in observability: by which I mean a broad space of wanting to know what is
happening inside a running system, and which overlaps other keywords such as:
monitoring, provenance, log files, distributed tracing, performance metrics, and
outage detection.</p>

<p>I’ve recently merged some pull requests in this area, and I want to describe my
approach here.</p>

<h2 id="other-observability-projects">Other observability projects</h2>

<p>There are many projects that want to do observability-related stuff. I don’t
want to trivialize that work or claim to be able to easily reinvent the work of
an entire research project/product. Instead I want Academy users to be able to
make use of both the good stuff Academy brings and the good stuff other projects
bring.</p>

<p>A couple of interesting examples that I’ve personally engaged with:</p>

<p><a href="https://diaspora-project.github.io/">Diaspora</a> which looks like it could be
useful for gathering log-style information across a distributed “academy” of
agents and clients (providing a single place for further work on analysis of
that data)</p>

<p><a href="https://github.com/ORNL/flowcept">Flowcept</a> - a distributed workflow provenance
system, which we have already prototyped an integration with here:
<a href="https://github.com/academy-agents/academy-flowcept">https://github.com/academy-agents/academy-flowcept</a></p>

<p>As well as these, I expect other observability related projects and ideas to ebb
and flow, and I expect some projects which don’t regard themselves as
observability projects to also want to engage - for example, in the Parsl world
I have occasionally encountered wrapping workflow managers which were interested
in fine grained information.</p>

<p>I’m also very aware of competing and differing priorities: someone might want to
be building something very research-oriented for a PhD, while someone else might
be building a more boring but more stable system. Both ends of this spectrum are
legitimate and I don’t want to exclude either. But they are different, and
there’s no universal winner here.</p>

<h2 id="changes-to-academy-core">Changes to Academy core</h2>

<p>I wanted to implement a fairly minimal set of hooks, based around the ideas
that:</p>

<ul>
  <li>the core Academy code knows what it has done/is about to do (think: where we
put log statements in the source code)</li>
  <li>the core Academy code does not (and should not) know who/what will do
something with that information</li>
</ul>

<p>I specifically did not want to implement an overall user-facing observability
system.</p>

<p>This led me to think about a fairly conventional plugin hook system, and then
the realisation that Python already has such a system: the <code class="language-plaintext highlighter-rouge">logging</code> framework!</p>

<p>You can read the Python side of the story in
<a href="https://docs.python.org/3/library/logging.html">Logging Facility for Python</a> in
the Python Standard Library documentation.</p>

<p>From the Academy side of things I care about two pieces of <code class="language-plaintext highlighter-rouge">logging</code>, mirroring
the bullet points above: creating log events with structured information, and
plugging in handlers to do interesting stuff with those log events.</p>

<h2 id="creating-machine-readable-log-events">Creating machine readable log events</h2>

<p>Lots of people have encountered Python logging before, and it usually looks
something like this:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">logging</span>

<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="p">.</span><span class="nf">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>

<span class="n">logger</span><span class="p">.</span><span class="nf">info</span><span class="p">(</span><span class="sh">"</span><span class="s">Starting</span><span class="sh">"</span><span class="p">)</span>
<span class="n">logger</span><span class="p">.</span><span class="nf">debug</span><span class="p">(</span><span class="sh">"</span><span class="s">x = %s</span><span class="sh">"</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
</code></pre></div></div>

<p>Get a logger object, which knows how to inject log events into the logging
system, and which has a hierarchical name usually based on the Python module
structure.</p>

<p>Then make two log entries, at different levels: one at INFO level and one at
DEBUG.</p>

<p>The debug entry happens to include a variable value - this is incorporated into
the human readable log string, which is great if your log entries are for a
human to look at manually. But that leads inevitably to users performing
furtive, guilty regular expressions on log files to extract variables like this.
This is an incredibly fragile way of doing things, and kinda sad - you can see
that the variable x already exists as a separate value</p>

<p>It turns out Python already has a mechanism for attaching key/value pairs to log
events. You can write something like:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">logger</span><span class="p">.</span><span class="nf">debug</span><span class="p">(</span><span class="sh">"</span><span class="s">x = %s</span><span class="sh">"</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">:</span> <span class="n">x</span><span class="p">})</span>
</code></pre></div></div>

<p>and that <code class="language-plaintext highlighter-rouge">extra</code> dictionary will flow into the logging system, although in many
cases then be ignored.</p>

<h2 id="interesting-log-handlers">Interesting log handlers</h2>

<p>Sending a log event into the logging system doesn’t write it out or store it
anywhere. That’s the job of an orthogonal piece of the logger library: log
handlers.</p>

<p>A handler is an object that gets to know whenever a log event is logged by one
of those <code class="language-plaintext highlighter-rouge">logger.info</code> or <code class="language-plaintext highlighter-rouge">logger.debug</code> calls I mentioned above.</p>

<p>It is deliberately undefined what it should do with that event: more traditional
handlers do things like write to the console or to a log file (and Academy has
supported those output modes for a long time), but I also added another handler
which writes out each event as a JSON object including the <code class="language-plaintext highlighter-rouge">extra</code> keys - which
makes things much easier for machine processing. And the Flowcept plugin also
interfaces as a log handler, looking for events with relevant <code class="language-plaintext highlighter-rouge">extra</code> info.</p>

<h2 id="configuring-log-handlers">Configuring log handlers</h2>

<p>In plain Python, log handlers are configured per-process. It’s very easy to
configure them for your submit side process, where you are providing the main
module and can initialize anything you want. But in Academy, some of your code
might be running elsewhere and inside some other framework: for example an
Academy agent might be running via Globus Compute inside a Parsl worker process
running on an HPC node, and that Parsl worker process might also have run things
before and will run even more things after.</p>

<p>So the next piece I implemented was a configuration mechanism to help users
configure the same log handler across multiple Python processes, and for a
relevant time period: for example, the lifetime of an agent inside a worker.</p>

<p>This is driven through an Academy-specific <code class="language-plaintext highlighter-rouge">LogConfig</code> abstract class, which is
designed to carry the configuration for a particular kind of Python log handler
around between different processes.</p>

<h2 id="adding-interesting-extra-info">Adding interesting <code class="language-plaintext highlighter-rouge">extra</code> info</h2>

<p>Everywhere something interesting happens in the Academy core code, something
that might be interesting to an observability handler, the codebase needs to
have a log call, ideally with lots of juicy information in the <code class="language-plaintext highlighter-rouge">extra</code>
dictionary. We’ve already added some of these: for example, agent identities,
and when actions are invoked, a identifier to help tie together information
about the action on the submit side, in the exchange and on the agent side. I
expect that information to get richer as we discover more things we want to know
(and you should open an issue or a pull request if you see something interesting
to record).</p>

<h2 id="a-json-based-example">A JSON based example</h2>

<p>Here’s something that is easier to do now that was hard to do before: look at
the timings and message flows of agent interactions on both the submit side and
agent side.</p>

<p>I’ll only sketch new features in the code here, not give full executable
examples.</p>

<p>First run an agentic workflow (a submit side and some agents) with logs flowing
into files in JSON format:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">with</span> <span class="k">await</span> <span class="n">Manager</span><span class="p">.</span><span class="nf">from_exchange_factory</span><span class="p">(...,</span>
    <span class="n">log_config</span><span class="o">=</span><span class="nc">JSONPoolLogging</span><span class="p">(),</span>
    <span class="p">)</span> <span class="k">as</span> <span class="n">manager</span><span class="p">:</span>
        <span class="c1"># run your agents and talk to them
</span></code></pre></div></div>

<p>This workflow will run with the JSON pool handler configured both in the submit
process and also wherever your agents run. JSON pool logging will put all of
your log files into a directory under <code class="language-plaintext highlighter-rouge">~/local/share/academy/logs</code>. Each
separate process will get its own file. If your agent ran somewhere with a
different home file system, you can copy the JSON log files into one place using
your favourite file transfer tool.</p>

<p>With all the events in JSON format, you can process them in different ways: I
often load them into a Python process, I’ve also tried putting them into an
SQLite database, but here I’ll use <code class="language-plaintext highlighter-rouge">jq</code> from the command line:</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">cd</span> ~/local/share/academy/logs/da7d98d6-5196-4aec-adf1-91d4c1878393/
<span class="gp">$</span><span class="w"> </span><span class="nb">ls</span>
<span class="go">2a158e17-b35f-49ec-9b30-5101924390a4.jsonlog
44d9d9da-0f64-4b92-946b-9258f80f3f8d.jsonlog
</span></code></pre></div></div>

<p>Here’s an example of querying which Python modules have anything: there are
academy modules, but also other modules that also use Python’s logging system -
support libraries such as <code class="language-plaintext highlighter-rouge">asyncio</code> and agent code which in my test case lives
in a module called <code class="language-plaintext highlighter-rouge">fibiterate7</code>.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>jq <span class="nt">-s</span> <span class="s1">'[.[].name] | unique'</span> <span class="k">*</span>.jsonlog
<span class="go">[
  "__main__",
  "academy.exchange.client",
  "academy.exchange.cloud.client",
  "academy.handle",
  "academy.logging.configs.jsonpool",
  "academy.manager",
  "academy.runtime",
  "asyncio",
  "fibiterate7lib",
  "parsl.dataflow.dflow",
  "parsl.dataflow.memoization",
  "parsl.executors.base",
  "parsl.executors.high_throughput.executor",
  "parsl.executors.high_throughput.zmq_pipes",
  "parsl.executors.status_handling",
  "parsl.executors.threads",
  "parsl.jobs.job_status_poller",
  "parsl.jobs.strategy",
  "parsl.monitoring.monitoring",
  "parsl.multiprocessing",
  "parsl.process_loggers",
  "parsl.providers.local.local",
  "parsl.usage_tracking.usage",
  "parsl.utils"
]
</span></code></pre></div></div>

<p>Here’s an example tracking one particular message flow across both log files
using a message ID that I extracted by hand, sorted by log timestamp (which
Python calls <code class="language-plaintext highlighter-rouge">created</code>), showing the process (4472 is my submit side, 4521 is
where the agent was running) and the human readable message.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>jq <span class="nt">-s</span> <span class="s1">'sort_by(.created) |
</span><span class="go">  .[] |
  select(."academy.action_tag"=="8e28bb12-e5cc-46c7-8298-7d466eff4098") |
  {process,created,message}'
  *.jsonlog
{
  "process": "4472",
  "created": "1778498011.6303687",
  "message": "Invoking action __anext__ with tag
             id 8e28bb12-e5cc-46c7-8298-7d466eff4098"
}
{
  "process": "4472",
  "created": "1778498011.6309419",
</span><span class="gp">  "message": "Sending action request from UserId&lt;a8c24f7c&gt;</span><span class="w">
</span><span class="gp">             to AgentId&lt;7cc2f0a6&gt;</span><span class="w"> </span><span class="o">(</span><span class="nv">action</span><span class="o">=</span><span class="s1">'__anext__'</span><span class="o">)</span><span class="s2">"
</span><span class="go">}
{
  "process": "4472",
  "created": "1778498011.635122",
  "message": "Waiting for result of action __anext__ with
             tag id 8e28bb12-e5cc-46c7-8298-7d466eff4098"
}
{
  "process": "4521",
  "created": "1778498011.6369267",
  "message": "Invoking action __anext__ with invocation id
             8e28bb12-e5cc-46c7-8298-7d466eff4098"
}
{
  "process": "4521",
  "created": "1778498012.1386456",
  "message": "Completed action __anext__ with invocation id
             8e28bb12-e5cc-46c7-8298-7d466eff4098"
}
{
  "process": "4472",
  "created": "1778498012.1435366",
  "message": "Successfully completed action __anext__ with
             tag id 8e28bb12-e5cc-46c7-8298-7d466eff4098"
}
</span></code></pre></div></div>

<h2 id="what-you-can-do">What you can do</h2>

<p>Right now you can choose how your logs are delivered: to the console, to
traditional log files, or in JSON format. I hope the latter encourages you away
from the path of regexping-your-logs.</p>

<p>If you’re interested in building and experimenting, a couple of interesting
paths forward for me are: more interesting ways to move and store logging events
(for example, Diaspora and Flowcept), and more interesting ways to present that
information (are you interesting in performance visualization? in analysing how
results came to be?).</p>]]></content><author><name>Ben Clifford</name></author><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">Slides for the Academy Tutorial (APS, February 2026)</title><link href="https://academy-agents.org/blog/2026/02/aps-tutorial-slides/" rel="alternate" type="text/html" title="Slides for the Academy Tutorial (APS, February 2026)" /><published>2026-02-15T00:00:00+00:00</published><updated>2026-02-15T00:00:00+00:00</updated><id>https://academy-agents.org/blog/2026/02/aps-tutorial-slides</id><content type="html" xml:base="https://academy-agents.org/blog/2026/02/aps-tutorial-slides/"><![CDATA[]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry></feed>