<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Architecture Decision Records on Doby Baxter Computing</title>
    <link>https://dobybaxter127.gitlab.io/adr/</link>
    <description>Recent content in Architecture Decision Records on Doby Baxter Computing</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 13 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://dobybaxter127.gitlab.io/adr/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ADR-012: Check Generated Code Against Its Cited Rules, Not Just Its Citations</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-012-check-generated-code-against-its-cited-rules-not-just-its-citations/</link>
      <pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-012-check-generated-code-against-its-cited-rules-not-just-its-citations/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;A system that answers from a rule corpus can cite the rules it used, and citation is commonly treated as sufficient evidence that an answer is grounded. It is not. A citation proves a rule was retrieved and named. It proves nothing about whether the code beneath it obeys that rule.&lt;/p&gt;&#xA;&lt;p&gt;Nexa is a local, offline assistant that answers Odoo, TypeScript and JavaScript validation questions from a schema-validated rule corpus, running entirely on the user&#39;s own hardware. The first version is finished, and this record captures the verification decision that gives it its shape.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-010: Enforcing Data Invariants at the Persistence Boundary for Consistent Data Integrity</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-010-enforcing-data-invariants-at-the-persistence-boundary-for-consistent-data-integrity/</link>
      <pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-010-enforcing-data-invariants-at-the-persistence-boundary-for-consistent-data-integrity/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;A framework like Odoo exposes one stored model through many write paths: the form UI, ORM &lt;code&gt;create()&lt;/code&gt; and &lt;code&gt;write()&lt;/code&gt;, CSV and Excel import, and remote calls over XML-RPC, the API, and DCI. Each of these paths reaches the same database rows, but they do not share the same guards.&lt;/p&gt;&#xA;&lt;p&gt;A validation hook attached to the form (&lt;code&gt;@api.onchange&lt;/code&gt;) runs only while a user edits in the UI. Every other path (import, RPC, direct ORM) sails past it. This means a rule that feels enforced, because it works when you click through the form, can be silently absent everywhere else.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-011: Fitness for Purpose: Essential Properties for System Evaluation and User Outcomes</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-011-fitness-for-purpose-essential-properties-for-system-evaluation-and-user-outcomes/</link>
      <pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-011-fitness-for-purpose-essential-properties-for-system-evaluation-and-user-outcomes/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;The earlier decisions in this series each answer a narrow question: where a validation belongs, which layer owns an invariant, what a component is allowed to assume about the data reaching it. Each one is a local judgment about correctness at a boundary.&lt;/p&gt;&#xA;&lt;p&gt;Sitting above them is a question those decisions do not answer on their own. A system can satisfy every local rule, run every component as designed, and still fail the person it exists for. A service can have a portal, a workflow, a set of criteria, a budget, and staff, and process a high volume of cases through all of it. None of that establishes that it is doing what it was built to do. A system existing is not the same thing as a system working.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-001: Validate Configuration Before Execution</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-001-validate-configuration-before-execution/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-001-validate-configuration-before-execution/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;Configuration is an input to software systems, but configuration errors are often discovered only after execution has already begun. This can lead to confusing failures, partial execution, difficult-to-diagnose behavior, or invalid system state.&lt;/p&gt;&#xA;&lt;p&gt;For systems where configuration controls execution behavior, configuration should therefore be treated as an input that requires explicit validation rather than something that can be assumed to be correct.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;&#xA;&lt;p&gt;If invalid configuration is allowed to reach the execution layer, the resulting failure may occur far away from the original mistake.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-002: Validate LLM Workflow Topology Before Execution</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-002-validate-llm-workflow-topology-before-execution/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-002-validate-llm-workflow-topology-before-execution/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;An LLM workflow is a directed graph: steps are nodes, and the transitions each step permits are edges. Structural mistakes in that graph, such as a transition to a step that no longer exists, a step with no way out, or a cycle that can never terminate, are present the moment the workflow is written. They do not depend on model output or user content.&lt;/p&gt;&#xA;&lt;p&gt;Despite that, these errors usually surface only at runtime, in production, minutes into a real conversation, when a step hands off to a target that was renamed or loops until something times out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-003: Gate Irreversible Actions on Provable Eligibility, Not Navigation</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-003-gate-irreversible-actions-on-provable-eligibility-not-navigation/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-003-gate-irreversible-actions-on-provable-eligibility-not-navigation/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;Many workflows collect answers across many steps and end in an action that cannot be undone: a non-refundable payment, a submission, a provisioning call. A real-world post-mortem motivates this record. A &lt;a href=&#34;http://GOV.UK&#34; class=&#34;adr-evidence-link&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://GOV.UK&lt;/a&gt;  passport application asked, early on, whether the applicant held a required certificate. The applicant answered &amp;quot;No&amp;quot;, which quietly made the whole application invalid, yet the form behaved exactly as it did for every other question and walked the applicant all the way to a non-refundable payment, without ever acting on the answer it had held since near the start.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-004: Test External Source-of-Truth Invariants at the Seam</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-004-test-external-source-of-truth-invariants-at-the-seam/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-004-test-external-source-of-truth-invariants-at-the-seam/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;Most testing advice quietly assumes you own the definition of correct: your code, your tests, your rules, and a failing test means something in your repository changed. Configuration tooling breaks that assumption. Pyxel Config Lab exists to help scientists write YAML that ESA Pyxel, a large and actively-developed framework on its own release cadence, will accept. Pyxel is the source of truth for what a valid config is. The tool only holds a copy of that truth: a bundled JSON schema, a set of tutorial examples, and a mapping of detector types to parameter bounds.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-005: Treat Error Messages as First-Class Outputs</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-005-treat-error-messages-as-first-class-outputs/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-005-treat-error-messages-as-first-class-outputs/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;A safety net has two jobs: it has to catch the user, and it has to talk to them when it does. The validation boundaries established in ADR-001, ADR-002, and ADR-004 handle the catching. This ADR concerns the speaking half, which is the part that usually goes unbudgeted.&lt;/p&gt;&#xA;&lt;p&gt;The speaking half turns out to be the better-researched of the two, and the research is firm. People do read error messages: an eye-tracking study of developers (Barik et al.) found they allocate roughly a quarter of their visual attention to error text, and that reading a message is comparable in difficulty to reading source code. The message is not a footnote to the work, it is work imposed on the reader. Rewriting cryptic errors into enhanced ones (Becker et al.) reduced errors overall and, notably, reduced repeated errors, the signature of someone stuck in a loop, though the literature also shows that prettier wording alone is not the mechanism. Traver&#39;s HCI analysis frames the message as the primary interface between the system&#39;s internal state and the user&#39;s mental model. Later work shows readability is relative to the reader&#39;s experience. Nielsen&#39;s ninth heuristic (help users recognize, diagnose, and recover) and fifth heuristic (prevent the error in the first place) have held since the 1990s.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-006: Own the Telemetry Namespace for Non-Model GenAI Systems</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-006-own-the-telemetry-namespace-for-non-model-genai-systems/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-006-own-the-telemetry-namespace-for-non-model-genai-systems/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;The LLM Workflow Router is a topology-enforcement layer, not a model-selection router. Given structured metadata about an interaction, it answers one question, &amp;quot;is this workflow transition permitted&amp;quot;, independently of model choice or content. It validates workflow topology at load time, enforces invocation limits, and returns one of three terminal decisions: PROCEED, REFUSE, or PAUSE. Its defining property for instrumentation is that it is content-blind: it never sees a prompt, never calls a provider, and never generates a token.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-007: Reconstruct Ranked Attack Paths With Explicit Confidence, Not Binary Detection</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-007-reconstruct-ranked-attack-paths-with-explicit-confidence-not-binary-detection/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-007-reconstruct-ranked-attack-paths-with-explicit-confidence-not-binary-detection/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;In modern cloud incident response there is often nothing to detect in the old sense. Attackers increasingly log in rather than break in: a large share of recent detections are malware-free, with valid-account abuse behind a significant fraction of cloud incidents. Detection tells you that something happened, but rarely how: which account was really patient zero, which token was replayed, which consent grant opened the door, and in what order.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-008: Design API Endpoints That Degrade Without Breaking the Frontend</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-008-design-api-endpoints-that-degrade-without-breaking-the-frontend/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-008-design-api-endpoints-that-degrade-without-breaking-the-frontend/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;A full-stack app shows one place, the Sheffield Cholera Monument, at two scales at once: a satellite vegetation view from orbit and a centimeter-scale ground model. The backend is a FastAPI service that authenticates against the Copernicus Sentinel Hub, pulls the newest real Sentinel-2 scene over a bounding box, computes NDVI, and pins a satellite marker to the point in orbit where the satellite passed closest to the monument for that scene. It depends on external systems it does not control: the Copernicus APIs and a live Celestrak orbital-elements feed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ADR-009: Social Resource Floor as a Contracts-First Coordination Layer Owned by No One</title>
      <link>https://dobybaxter127.gitlab.io/adr/adr-009-social-resource-floor-as-a-contracts-first-coordination-layer-owned-by-no-one/</link>
      <pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://dobybaxter127.gitlab.io/adr/adr-009-social-resource-floor-as-a-contracts-first-coordination-layer-owned-by-no-one/</guid>
      <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;&#xA;&lt;p&gt;Delivery systems for social protection already exist and are strong: OpenSPP orchestrates programs and registries, OpenG2P provides delivery rails, and OpenCRVS handles civil registration. What is missing is an open, shared layer above them that coordinates one person&#39;s whole survival floor across many providers and many resource types at once, so help can find a person regardless of which organizations happen to serve them.&lt;/p&gt;&#xA;&lt;p&gt;The Social Resource Floor is a blueprint for that missing layer. The first version is finished, and this record captures the architectural decisions that give it its shape.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
