<?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: Dariusz Newecki</title>
    <description>The latest articles on DEV Community by Dariusz Newecki (@dariusz_newecki_e35b0924c).</description>
    <link>https://dev.to/dariusz_newecki_e35b0924c</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3635377%2Fed3a13b4-11d0-4f67-86de-6e2dd08a992e.png</url>
      <title>DEV Community: Dariusz Newecki</title>
      <link>https://dev.to/dariusz_newecki_e35b0924c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dariusz_newecki_e35b0924c"/>
    <language>en</language>
    <item>
      <title>My AI System Logged 35,669 LLM Calls. It Still Couldn’t Tell Me What They Cost.</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Sat, 13 Jun 2026 09:45:57 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/my-ai-system-logged-35669-llm-calls-it-still-couldnt-tell-me-what-they-cost-2cl</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/my-ai-system-logged-35669-llm-calls-it-still-couldnt-tell-me-what-they-cost-2cl</guid>
      <description>&lt;p&gt;CORE had telemetry.&lt;/p&gt;

&lt;p&gt;That was the comforting part.&lt;/p&gt;

&lt;p&gt;Every LLM exchange was being logged. Prompt tokens. Completion tokens. Duration. Cognitive role. Model snapshot. Timestamp. Privacy level. Enough information to reconstruct what the system had asked, which model had answered, and how the autonomous loop had used the result.&lt;/p&gt;

&lt;p&gt;Then I asked the obvious question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did the last month of LLM work cost?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The database had no answer.&lt;/p&gt;

&lt;p&gt;Not a bad answer. Not an approximate answer. No answer.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;cost_estimate&lt;/code&gt; column existed. It was even part of the log model. But across 35,669 recorded LLM calls, it was populated exactly zero times.&lt;/p&gt;

&lt;p&gt;Every row was NULL.&lt;/p&gt;

&lt;p&gt;That is the kind of bug that looks small until you understand what kind of system CORE is trying to become.&lt;/p&gt;

&lt;p&gt;CORE is not just a wrapper around LLM calls. It is a governance runtime for AI-assisted software development. The point is not that an AI writes code. The point is that every AI-produced change must be traceable, authorized, constrained, audited, and defensible.&lt;/p&gt;

&lt;p&gt;So when cost attribution was missing, this was not just a FinOps bug.&lt;/p&gt;

&lt;p&gt;It was a governance blind spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The System Could Explain the Work, But Not the Bill
&lt;/h2&gt;

&lt;p&gt;The strange thing was that most of the telemetry was already there.&lt;/p&gt;

&lt;p&gt;CORE knew which cognitive role made the call.&lt;/p&gt;

&lt;p&gt;It knew whether the call came from an architect, coder, reviewer, coherence analyst, or some other internal role.&lt;/p&gt;

&lt;p&gt;It knew which model handled the request.&lt;/p&gt;

&lt;p&gt;It knew the token counts.&lt;/p&gt;

&lt;p&gt;It knew when the call happened.&lt;/p&gt;

&lt;p&gt;That meant I could ask questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which cognitive roles are consuming the most tokens?&lt;/li&gt;
&lt;li&gt;Which models are being used by which part of the system?&lt;/li&gt;
&lt;li&gt;Which workflows are driving LLM activity?&lt;/li&gt;
&lt;li&gt;How much autonomous reasoning happened during a given period?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I could not ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which cognitive role costs the most?&lt;/li&gt;
&lt;li&gt;Did routing this role to a stronger model actually change the cost profile?&lt;/li&gt;
&lt;li&gt;Did a model swap increase operational cost?&lt;/li&gt;
&lt;li&gt;Is local inference replacing paid inference in the places where it should?&lt;/li&gt;
&lt;li&gt;What did the last seven days of autonomous governance actually cost?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters because model routing is not just a technical preference.&lt;/p&gt;

&lt;p&gt;In a governed system, model routing is an operational decision.&lt;/p&gt;

&lt;p&gt;If I decide that one role should use a stronger model because it performs architectural judgment, while another role should use a cheaper model because it performs mechanical cleanup, that decision should be defendable.&lt;/p&gt;

&lt;p&gt;Not with vibes.&lt;/p&gt;

&lt;p&gt;Not with “it feels cheaper.”&lt;/p&gt;

&lt;p&gt;With evidence.&lt;/p&gt;

&lt;p&gt;CORE could show token volume. It could show model usage. It could show decision traces. But it could not show cost.&lt;/p&gt;

&lt;p&gt;That meant the governor had incomplete information.&lt;/p&gt;

&lt;p&gt;And in CORE, incomplete evidence is not a cosmetic issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Is Part of the Decision Trace
&lt;/h2&gt;

&lt;p&gt;This is where the bug became more interesting than the fix.&lt;/p&gt;

&lt;p&gt;Most AI systems treat cost as billing metadata. Something you check in a provider dashboard. Something finance looks at later. Something external to the actual governance loop.&lt;/p&gt;

&lt;p&gt;I do not think that is enough for autonomous systems.&lt;/p&gt;

&lt;p&gt;Once a system starts making or proposing operational decisions, cost becomes part of the decision surface.&lt;/p&gt;

&lt;p&gt;A governed AI system should be able to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why did you choose this model for this role?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A good answer might involve capability, reliability, privacy, latency, and cost.&lt;/p&gt;

&lt;p&gt;But if cost is outside the system, the answer is already incomplete.&lt;/p&gt;

&lt;p&gt;The system can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I used this model because it was assigned to this cognitive role.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not enough.&lt;/p&gt;

&lt;p&gt;It should also be able to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This role consumed X tokens, cost Y over the last period, and produced Z accepted outcomes. The routing remains justified.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This role is now disproportionately expensive compared to its contribution. Reconsider the routing policy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This model was swapped recently and cost increased faster than resolution quality improved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without cost telemetry, those questions move outside the system.&lt;/p&gt;

&lt;p&gt;And once evidence moves outside the system, governance becomes manual again.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of silent drift CORE exists to prevent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bug Was Embarrassingly Simple
&lt;/h2&gt;

&lt;p&gt;The actual defect was not dramatic.&lt;/p&gt;

&lt;p&gt;The writer existed. The log table existed. The column existed.&lt;/p&gt;

&lt;p&gt;But the only write path set &lt;code&gt;cost_estimate&lt;/code&gt; to &lt;code&gt;None&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Every time.&lt;/p&gt;

&lt;p&gt;That is the worst kind of governance bug: structurally prepared, semantically empty.&lt;/p&gt;

&lt;p&gt;The system looked like it had cost attribution because the field existed. Queries could reference it. Reports could include it. The schema suggested accountability.&lt;/p&gt;

&lt;p&gt;But the data was never written.&lt;/p&gt;

&lt;p&gt;That is more dangerous than not having the field at all.&lt;/p&gt;

&lt;p&gt;When a system lacks a field, the gap is visible.&lt;/p&gt;

&lt;p&gt;When a system has a field that is always empty, the gap hides behind architecture.&lt;/p&gt;

&lt;p&gt;And if you are building governance software, hidden gaps are the enemy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix Was Boring. That Was the Point.
&lt;/h2&gt;

&lt;p&gt;The fix was not to call an API dashboard.&lt;/p&gt;

&lt;p&gt;The fix was to make cost part of CORE’s own evidence model.&lt;/p&gt;

&lt;p&gt;That meant adding a rate source and computing cost at write time.&lt;/p&gt;

&lt;p&gt;The important part was not just “multiply tokens by price.” The important part was preserving the evidence correctly.&lt;/p&gt;

&lt;p&gt;A model’s price is not timeless. Pricing changes. Routing changes. Model names move. Providers revise their commercial terms. Local models may cost zero externally but still matter operationally.&lt;/p&gt;

&lt;p&gt;So the fix needed a rate table with history.&lt;/p&gt;

&lt;p&gt;The design became:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store input and output rates separately.&lt;/li&gt;
&lt;li&gt;Key rates to the model snapshot used at the time of the call.&lt;/li&gt;
&lt;li&gt;Use an &lt;code&gt;effective_from&lt;/code&gt; timestamp so historical rows can be priced against the rate that was valid when the call happened.&lt;/li&gt;
&lt;li&gt;Compute &lt;code&gt;cost_estimate&lt;/code&gt; when the exchange is logged.&lt;/li&gt;
&lt;li&gt;If no rate exists, keep the cost NULL but log the missing-rate gap explicitly.&lt;/li&gt;
&lt;li&gt;Preserve the existing fire-and-forget telemetry path so cost lookup failures do not break the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;Telemetry must not become a new point of fragility.&lt;/p&gt;

&lt;p&gt;If an LLM call succeeds, but cost lookup fails because a rate was not configured, CORE should not crash the workflow. It should record the gap and keep moving.&lt;/p&gt;

&lt;p&gt;The failure itself becomes evidence.&lt;/p&gt;

&lt;p&gt;That is the governance pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not pretend the system knows.&lt;br&gt;
Record that it does not know.&lt;br&gt;
Make the gap visible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why External Dashboards Are Not Enough
&lt;/h2&gt;

&lt;p&gt;A reasonable objection is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why not just use the provider dashboard?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because provider dashboards do not know CORE’s governance structure.&lt;/p&gt;

&lt;p&gt;They may know the account. They may know the model. They may know aggregate usage. They may know invoice-level cost.&lt;/p&gt;

&lt;p&gt;But they do not know CORE’s cognitive roles.&lt;/p&gt;

&lt;p&gt;They do not know which call was architectural judgment and which call was mechanical formatting.&lt;/p&gt;

&lt;p&gt;They do not know which proposal a call supported.&lt;/p&gt;

&lt;p&gt;They do not know which finding the proposal resolved.&lt;/p&gt;

&lt;p&gt;They do not know whether a call contributed to a successful remediation, a rejected proposal, a failed validation, or an architectural dead end.&lt;/p&gt;

&lt;p&gt;CORE needs cost attribution inside its own consequence chain.&lt;/p&gt;

&lt;p&gt;Not because provider dashboards are bad.&lt;/p&gt;

&lt;p&gt;Because they answer a different question.&lt;/p&gt;

&lt;p&gt;The provider answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did this account spend?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CORE needs to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did this autonomous governance loop spend, why, under which role, toward which outcome, and under which authority?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are not the same question.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Changed How I Think About Autonomy
&lt;/h2&gt;

&lt;p&gt;Before this bug, I thought of autonomy mainly in terms of action.&lt;/p&gt;

&lt;p&gt;Can the system find a violation?&lt;/p&gt;

&lt;p&gt;Can it propose a fix?&lt;/p&gt;

&lt;p&gt;Can it execute that fix through governed atomic actions?&lt;/p&gt;

&lt;p&gt;Can it verify the result?&lt;/p&gt;

&lt;p&gt;Can it stop itself when a rule is violated?&lt;/p&gt;

&lt;p&gt;Those are still the right questions.&lt;/p&gt;

&lt;p&gt;But they are not enough.&lt;/p&gt;

&lt;p&gt;A system that acts autonomously also consumes resources autonomously.&lt;/p&gt;

&lt;p&gt;That means resource use must be governed too.&lt;/p&gt;

&lt;p&gt;Not eventually.&lt;/p&gt;

&lt;p&gt;Not as a dashboard afterthought.&lt;/p&gt;

&lt;p&gt;As part of the same trace.&lt;/p&gt;

&lt;p&gt;Because every autonomous action has at least four dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What happened?&lt;/li&gt;
&lt;li&gt;Why was it allowed?&lt;/li&gt;
&lt;li&gt;What changed?&lt;/li&gt;
&lt;li&gt;What did it cost?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the system cannot answer all four, the audit trail is incomplete.&lt;/p&gt;

&lt;p&gt;It may be technically impressive.&lt;/p&gt;

&lt;p&gt;It may even be useful.&lt;/p&gt;

&lt;p&gt;But it is not fully governable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Part
&lt;/h2&gt;

&lt;p&gt;The uncomfortable part is that I built the system to catch exactly this kind of thing.&lt;/p&gt;

&lt;p&gt;CORE is supposed to expose drift between what the system claims and what it actually does.&lt;/p&gt;

&lt;p&gt;And here it was: a schema claiming cost attribution, a runtime producing none.&lt;/p&gt;

&lt;p&gt;That is not a failure of the idea.&lt;/p&gt;

&lt;p&gt;That is the idea doing its job.&lt;/p&gt;

&lt;p&gt;The point of CORE is not to never have governance gaps.&lt;/p&gt;

&lt;p&gt;That would be fantasy.&lt;/p&gt;

&lt;p&gt;The point is to make the gaps discoverable, nameable, fixable, and eventually enforceable.&lt;/p&gt;

&lt;p&gt;This one started as a missing cost calculation.&lt;/p&gt;

&lt;p&gt;It ended as a clearer rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If an autonomous system consumes LLM resources, cost attribution is part of governance evidence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not billing evidence.&lt;/p&gt;

&lt;p&gt;Governance evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Lesson
&lt;/h2&gt;

&lt;p&gt;The lesson is not “remember to calculate cost.”&lt;/p&gt;

&lt;p&gt;That is too small.&lt;/p&gt;

&lt;p&gt;The lesson is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Autonomy without cost visibility is not operational autonomy.&lt;br&gt;
It is automation with an unpriced control loop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If a system can decide, propose, repair, retry, delegate, and call models thousands of times, then the governor must be able to see what that activity costs.&lt;/p&gt;

&lt;p&gt;Per model.&lt;/p&gt;

&lt;p&gt;Per role.&lt;/p&gt;

&lt;p&gt;Per period.&lt;/p&gt;

&lt;p&gt;Per outcome.&lt;/p&gt;

&lt;p&gt;Otherwise the system is asking to be trusted.&lt;/p&gt;

&lt;p&gt;And CORE’s entire position is that autonomous systems should not be trusted.&lt;/p&gt;

&lt;p&gt;They should be governed.&lt;/p&gt;

&lt;p&gt;So now CORE can start answering the question it should have answered from the beginning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not only what did the AI do?&lt;br&gt;
Not only why was it allowed?&lt;br&gt;
Not only what changed?&lt;br&gt;
But also: what did it cost?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is boring.&lt;/p&gt;

&lt;p&gt;That is accounting.&lt;/p&gt;

&lt;p&gt;That is governance.&lt;/p&gt;

&lt;p&gt;And for autonomous AI systems, that is exactly the point.&lt;/p&gt;

&lt;p&gt;CORE is open source here: &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Autonomous AI should not just run. It should leave receipts.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>governance</category>
      <category>devlog</category>
    </item>
    <item>
      <title>When One Enum Is Secretly Two</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Mon, 01 Jun 2026 20:05:10 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/when-one-enum-is-secretly-two-1pnd</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/when-one-enum-is-secretly-two-1pnd</guid>
      <description>&lt;p&gt;&lt;em&gt;I was one commit away from a bug that would never have thrown an error.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My system keeps every closed vocabulary in a single file — one source of truth for "here are the legal values for this field." One of those vocabularies described filesystem operations: &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;modify&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;. Clean, small, obvious. Two different parts of the system were going to read it.&lt;/p&gt;

&lt;p&gt;The first part is authorization. Every capability in the system declares a filesystem profile — what it's permitted to do. &lt;em&gt;This worker may modify files but may not delete them.&lt;/em&gt; For that, the distinctions that matter live on the &lt;strong&gt;write axis&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;modify&lt;/code&gt;, and &lt;code&gt;delete&lt;/code&gt; are three different permissions you might grant or withhold independently. Reading? Reading is just &lt;code&gt;read&lt;/code&gt;. One bucket. The profile doesn't need to slice it finer.&lt;/p&gt;

&lt;p&gt;The second part is audit. A taxonomy classifies every filesystem call the code makes, so a completeness check can prove that no category of access slips by unaccounted for. For that, the distinctions that matter live on the &lt;strong&gt;read axis&lt;/strong&gt;: &lt;code&gt;Path.read_text&lt;/code&gt; reads a file, &lt;code&gt;Path.glob&lt;/code&gt; enumerates a directory, &lt;code&gt;yaml.safe_load(path)&lt;/code&gt; parses a protected config off disk. Those are three different audit subjects. Writing? For the audit's purposes, writing collapses to a single &lt;code&gt;write&lt;/code&gt; — because the policy it enforces is shaped like &lt;em&gt;this namespace forbids the write class&lt;/em&gt;, full stop.&lt;/p&gt;

&lt;p&gt;Look at the inversion. Authorization splits writes and collapses reads. Audit splits reads and collapses writes. Same domain — filesystem operations — sliced along perpendicular axes, because the two readers are answering different questions.&lt;/p&gt;

&lt;p&gt;And they were about to share one enum.&lt;/p&gt;

&lt;h2&gt;
  
  
  The race that nearly buried it
&lt;/h2&gt;

&lt;p&gt;The reason they were about to share it is almost funny. Two design decisions, written months apart, both declared they'd use "the filesystem operation vocabulary." A clause settled the overlap: whichever one gets implemented first creates the list; the second just uses what's already there. A materialization race — a data race, but for a vocabulary decision spread across two documents.&lt;/p&gt;

&lt;p&gt;The authorization side shipped first and wrote &lt;code&gt;[read, create, modify, delete]&lt;/code&gt;: the write axis. Which meant the audit side, when I finally got to it, would have inherited a vocabulary with no word for &lt;em&gt;traverse&lt;/em&gt; and no word for &lt;em&gt;parse&lt;/em&gt;. It would have had to lie in the only language it was given.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tell
&lt;/h2&gt;

&lt;p&gt;Here's the moment it stopped being a style preference and became undeniable.&lt;/p&gt;

&lt;p&gt;Take &lt;code&gt;Path.glob&lt;/code&gt;. Under the authorization vocabulary, the most honest label for it is &lt;code&gt;read&lt;/code&gt; — it doesn't mutate anything. Under the audit vocabulary, &lt;code&gt;read&lt;/code&gt; is flatly wrong; it's &lt;code&gt;traverse&lt;/code&gt;, and that distinction is the entire point, because "this code enumerated a protected directory" is a different finding than "this code read a single file."&lt;/p&gt;

&lt;p&gt;Same call. Two correct answers. The enum can only hold one.&lt;/p&gt;

&lt;p&gt;That is the signature of one enum doing two jobs: &lt;strong&gt;a single concrete value that belongs in different buckets depending on who's asking.&lt;/strong&gt; There is no naming fix for that. &lt;code&gt;read&lt;/code&gt; isn't badly named. It's being asked to mean two things at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why DRY was lying to me
&lt;/h2&gt;

&lt;p&gt;The pull toward one enum was DRY, and DRY is usually right, which is exactly what makes this trap good. One vocabulary, one place, both consumers referencing it — that &lt;em&gt;looks&lt;/em&gt; like the discipline you're supposed to practice. It feels like hygiene.&lt;/p&gt;

&lt;p&gt;But DRY is about not duplicating &lt;strong&gt;knowledge&lt;/strong&gt;, not about not duplicating &lt;strong&gt;shape&lt;/strong&gt;. Two vocabularies that happen to overlap in spelling are not a repeated fact. They're two separate decisions that rhyme. Merging them doesn't remove duplication — it manufactures coupling, binding two things that change for different reasons. The authorization vocabulary changes when the permission model changes. The audit vocabulary changes when the set of call-classes you care about changes. Different forces, different cadence, different owners.&lt;/p&gt;

&lt;p&gt;That's the Single Responsibility Principle, except aimed at a data type instead of a class: if two independent forces can each demand an edit, you're holding two things.&lt;/p&gt;

&lt;h2&gt;
  
  
  One spelling, one meaning
&lt;/h2&gt;

&lt;p&gt;The rule I'd actually broken has a cleaner statement than any of this: &lt;strong&gt;one spelling, one meaning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had one spelling — &lt;code&gt;fs_operation_class&lt;/code&gt; — quietly carrying two meanings. And that's the same defect as the version everybody already polices: two spellings for one meaning, &lt;code&gt;userId&lt;/code&gt; in one file and &lt;code&gt;user_id&lt;/code&gt; in the next. We catch the synonym on sight; linters scream about it.&lt;/p&gt;

&lt;p&gt;The homonym hides. One word, two meanings, nothing visibly duplicated. It doesn't look like a smell. It looks like economy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I spot a fused enum now
&lt;/h2&gt;

&lt;p&gt;Any one of these is a yellow flag. Two of them is a decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two subsystems both branch on the enum, for unrelated decisions.&lt;/li&gt;
&lt;li&gt;You keep wanting to add a value "just for" one consumer that's meaningless to the other.&lt;/li&gt;
&lt;li&gt;A single concrete value belongs in different buckets depending on which consumer is reading it.&lt;/li&gt;
&lt;li&gt;The description has to say &lt;em&gt;"for X this means…, for Y this means…"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is the confession. &lt;strong&gt;The moment your docstring needs the word "for," you have two enums.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix, and the line
&lt;/h2&gt;

&lt;p&gt;The fix wasn't clever. Two enums.&lt;/p&gt;

&lt;p&gt;One keeps &lt;code&gt;[read, create, modify, delete]&lt;/code&gt; for authorization. A new one carries &lt;code&gt;[read, traverse, parse, write, neutral]&lt;/code&gt; for audit. Their overlap is exactly one value — &lt;code&gt;read&lt;/code&gt; — and even that is a coincidence of spelling, not a shared decision: it's just the single operation that means the same thing under both questions. Each vocabulary is now free to move along its own axis without dragging the other behind it.&lt;/p&gt;

&lt;p&gt;The sentence I wrote into the decision record, the one I'll reuse for the rest of my life:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a unification claim doesn't survive the material differences between two surfaces, the unification was the bug — not either surface.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why this one kept me up
&lt;/h2&gt;

&lt;p&gt;A normal refactor earns a shrug. This one didn't, and here's why.&lt;/p&gt;

&lt;p&gt;Nothing about the fused enum would have crashed. In a fail-closed system, that's the nightmare case: it doesn't fail closed, because it doesn't fail at all. It validates fine. It loads fine. It quietly hands one of its two readers a lossy answer, forever.&lt;/p&gt;

&lt;p&gt;The authorization side would have been correct. The audit side would have cheerfully reported &lt;em&gt;all reads accounted for&lt;/em&gt; — while folding traversals and parses into a &lt;code&gt;read&lt;/code&gt; bucket it could no longer tell apart. A completeness check that's complete only because it went blind.&lt;/p&gt;

&lt;p&gt;The worst bugs in a governance system aren't the ones that throw. They're the ones that pass.&lt;/p&gt;

&lt;p&gt;One enum, two meanings. Go check your docstrings for the word "for."&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is from CORE, an open-source constitutional governance runtime for AI-generated code. The decision above is ADR-080; the two enums live in the repo if you want to call my bluff: github.com/DariuszNewecki/CORE&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cleancode</category>
      <category>programming</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>The Most Powerful Developer in the Room Has Never Heard of SOLID</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Tue, 19 May 2026 10:01:36 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/the-most-powerful-developer-in-the-room-has-never-heard-of-solid-51db</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/the-most-powerful-developer-in-the-room-has-never-heard-of-solid-51db</guid>
      <description>&lt;p&gt;We have spent fifty years learning how to write software that doesn't collapse under its own weight.&lt;/p&gt;

&lt;p&gt;Not because programmers were lazy. Because software is genuinely hard to reason about. Because complexity compounds. Because a decision made on day one creates debt that surfaces on day three hundred. Because the people who wrote the code are not always the people who maintain it.&lt;/p&gt;

&lt;p&gt;So we built discipline.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Accumulated Wisdom
&lt;/h2&gt;

&lt;p&gt;SOLID. DRY. YAGNI. Design patterns. Architectural patterns. Separation of concerns. Dependency inversion. Test-driven development. Code review. Static analysis. Type systems. CI/CD. Linters. Convention over configuration.&lt;/p&gt;

&lt;p&gt;None of these emerged from theory. They emerged from failures — real systems that broke, real teams that couldn't move, real codebases that became archaeologies nobody wanted to excavate. Each principle is a scar turned into a rule.&lt;/p&gt;

&lt;p&gt;Over fifty years, the industry converged on a shared understanding: &lt;strong&gt;determinism in software is earned, not assumed.&lt;/strong&gt; You earn it by making your intentions explicit, your dependencies visible, your contracts enforced, your changes traceable.&lt;/p&gt;

&lt;p&gt;This is not a style preference. This is load-bearing knowledge.&lt;/p&gt;




&lt;h2&gt;
  
  
  The New Developer
&lt;/h2&gt;

&lt;p&gt;Then came AI.&lt;/p&gt;

&lt;p&gt;The most capable code producer ever built. It can implement a feature in seconds. It can refactor a module, write tests, explain its own output, generate documentation. The raw productivity is real.&lt;/p&gt;

&lt;p&gt;It is also non-deterministic. It has no persistent architectural memory. It doesn't know what your team decided six months ago. It doesn't know which patterns you've banned and why. It doesn't know that &lt;code&gt;PathResolver&lt;/code&gt; was excluded from the size rule for a documented reason, not by accident.&lt;/p&gt;

&lt;p&gt;It produces code that &lt;em&gt;looks&lt;/em&gt; correct. It violates the architecture underneath.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most powerful developer in the room has never heard of SOLID.&lt;/strong&gt; Of course the model can recite SOLID. That is not the point. It does not persistently enforce SOLID across a living codebase. It doesn't remember your last session. It has no idea what the codebase looked like before it touched it.&lt;/p&gt;

&lt;p&gt;This isn't a complaint about AI capability. It's a structural observation about what AI is. Non-determinism and context blindness are not bugs to patch in the next model release. They are properties of the tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Industry Reflex
&lt;/h2&gt;

&lt;p&gt;The industry noticed the problem. The response was predictable.&lt;/p&gt;

&lt;p&gt;AI makes mistakes → add AI reviewers. AI agents drift → add AI supervisors. AI generates inconsistent output → add AI validators. The ingredient that created the problem became the ingredient of the cure.&lt;/p&gt;

&lt;p&gt;This is architecturally incoherent.&lt;/p&gt;

&lt;p&gt;You cannot fix non-determinism with more non-determinism. You cannot make an unreliable system reliable by adding more unreliable components. Each layer of AI-on-AI increases the surface area of failure and makes the system harder to reason about, not easier.&lt;/p&gt;

&lt;p&gt;The instinct is understandable. AI is the most powerful tool available, so more of it feels like more solution. But power and reliability are different properties. Stacking power doesn't produce reliability.&lt;/p&gt;




&lt;h2&gt;
  
  
  But What About Agents, Swarms, and Prompt Engineering?
&lt;/h2&gt;

&lt;p&gt;Agents are orchestrated AI. Swarms are parallel AI. Prompt engineering is negotiated AI.&lt;/p&gt;

&lt;p&gt;None of these change the underlying property: the output is non-deterministic and the enforcement is absent.&lt;/p&gt;

&lt;p&gt;Adding coordination layers to non-deterministic components produces a more complex non-deterministic system, not a governed one. You don't get reliability — you get a larger blast radius when something goes wrong.&lt;/p&gt;

&lt;p&gt;Prompt engineering is the most revealing tell. If your governance strategy is a better prompt, your governance lives &lt;em&gt;inside&lt;/em&gt; the thing you're trying to govern. That's not governance. That's negotiating with an unreliable contractor and hoping they remember the rules next session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A prompt is not a law. A law doesn't ask the model to comply.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Right Abstraction Layer
&lt;/h2&gt;

&lt;p&gt;The answer is not at the AI layer. It never was.&lt;/p&gt;

&lt;p&gt;When C gave programmers power without safety, the industry didn't respond with "better C." It built type systems, memory safety, static analysis, formal verification. The answer was a deterministic layer &lt;em&gt;above&lt;/em&gt; or &lt;em&gt;around&lt;/em&gt; the dangerous tool.&lt;/p&gt;

&lt;p&gt;When manufacturing processes introduced variability, the answer wasn't "better machines." It was fixtures, jigs, quality control, and documented standards. The machine operates inside a governed system.&lt;/p&gt;

&lt;p&gt;The principle: &lt;strong&gt;when your most powerful component is also your least reliable, you don't replace it or double down. You wrap it in a deterministic system that makes its failures visible, traceable, and correctable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is what CORE does.&lt;/p&gt;




&lt;h2&gt;
  
  
  What CORE Actually Is
&lt;/h2&gt;

&lt;p&gt;CORE is not an AI agent. It is a governed software factory.&lt;/p&gt;

&lt;p&gt;The AI is one component — the code producer. It is never trusted. Its output is a &lt;em&gt;proposal&lt;/em&gt;, not an execution. Before anything reaches the filesystem, it passes through a constitution: human-authored rules that encode the accumulated discipline — architectural standards, dependency contracts, naming conventions, structural invariants.&lt;/p&gt;

&lt;p&gt;The constitution is law. The AI is a worker. The governor is a human who writes intent, not code.&lt;/p&gt;

&lt;p&gt;Every action is traceable. Every violation is explicit. Where approval is required, execution cannot proceed until approval is recorded. The audit trail is queryable. The consequence chain — Finding → Proposal → Approval → Execution → File changes → New findings — is materialized as verifiable rows, not inferred from logs.&lt;/p&gt;

&lt;p&gt;This is not a productivity tool dressed up in governance language. It is a feedback control system. The AI produces output. The governance layer evaluates it. Violations halt execution. The system converges toward a constitutionally compliant state — or it escalates to the human governor.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Piece
&lt;/h2&gt;

&lt;p&gt;Here is what the "add more AI" approach abandons without naming it:&lt;/p&gt;

&lt;p&gt;Fifty years of hard-won discipline about how to make software systems trustworthy.&lt;/p&gt;

&lt;p&gt;Every SOLID principle. Every architectural decision record. Every code review convention. Every linting rule. Every naming standard. Every test coverage requirement. All of it evaporates the moment you let an AI write unsupervised into your codebase.&lt;/p&gt;

&lt;p&gt;Not because the AI can't produce compliant code. Because there is nothing enforcing compliance. The knowledge exists. The enforcement is absent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CORE is the bridge.&lt;/strong&gt; The constitution is the fifty years of discipline made machine-enforceable. The governor doesn't write code — the governor holds the standards. The AI doesn't hold anything. It produces. The system judges.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Question Worth Asking
&lt;/h2&gt;

&lt;p&gt;The industry is asking: &lt;em&gt;which AI do you trust?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is the wrong question.&lt;/p&gt;

&lt;p&gt;The right question is: &lt;strong&gt;have you built a system where trust doesn't need to be extended?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Where the AI can be wrong, and the system detects it. Where the AI can drift, and the audit catches it. Where the AI can hallucinate, and the constitution blocks it. Where a person who is not a programmer can build production-grade software by writing intent and governing AI — instead of trusting it.&lt;/p&gt;

&lt;p&gt;That's not a vision. That's what CORE does today.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CORE is open source — &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;. If you're building in the governed-AI or regulated-software space, comments are open.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
      <category>governance</category>
    </item>
    <item>
      <title>Four Gates. One Governor. Zero Code Written. CORE Is Autonomous.</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Wed, 13 May 2026 12:10:27 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/four-gates-one-governor-zero-code-written-core-is-autonomous-34b6</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/four-gates-one-governor-zero-code-written-core-is-autonomous-34b6</guid>
      <description>&lt;p&gt;&lt;em&gt;When I defined A3 fourteen weeks ago, I wrote: "The daemon runs continuously, the Blackboard clears, the codebase converges, and every action is visible." Today all four gates that operationalize that definition are closed. I want to be precise about what that means — and honest about where the evidence is still accumulating.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What A3 Actually Is
&lt;/h2&gt;

&lt;p&gt;A3 is not a version number. It is a state the system either is in or isn't.&lt;/p&gt;

&lt;p&gt;I defined it with four gates because "autonomous" is a claim that's easy to make and hard to prove. Each gate closes one dimension of the proof. You can't skip one and still make the claim honestly.&lt;/p&gt;

&lt;p&gt;The four gates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G1 — Loop closure.&lt;/strong&gt; An autonomous fix lands end-to-end on a real example. Finding detected → proposal created → proposal approved → execution succeeded → re-audit confirms resolution. Not against a toy. Against the live codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G2 — Convergence.&lt;/strong&gt; Sustained state where the rate of finding resolution exceeds the rate of finding creation. This is what makes "autonomous" mean something rather than describing a system that runs forever without making progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G3 — Consequence chain.&lt;/strong&gt; Every action is traceable. Finding → Proposal → Approval → Execution → File changes → New findings — all six edges materialized as queryable rows. The governor doesn't have to read source code to know what happened. The chain is the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G4 — Governance in &lt;code&gt;.intent/&lt;/code&gt;.&lt;/strong&gt; No enforcement logic, path mappings, or policy thresholds live in &lt;code&gt;src/&lt;/code&gt;. All of it lives in &lt;code&gt;.intent/&lt;/code&gt; — human-authored files, read-only to CORE at runtime, never written by autonomous workers. This gate is the reason the governor role is real rather than nominal.&lt;/p&gt;

&lt;p&gt;All four are closed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The One That Took Longest to Get Right
&lt;/h2&gt;

&lt;p&gt;G3 closed first — May 1. G1 was proven during the 79-second self-heal I wrote about last week. G4 closed May 10, after a campaign that moved 32 operational config sections out of hardcoded &lt;code&gt;src/&lt;/code&gt; literals and into governed YAML, touching 113 files.&lt;/p&gt;

&lt;p&gt;G2 was the last one, and the most careful.&lt;/p&gt;

&lt;p&gt;The structural piece was a circuit-breaker. After N consecutive identical-signature proposal failures, the affected findings are marked DELEGATE and a hazard finding is posted to the Blackboard. What this does: it converts systematic errors — an LLM producing the same wrong output over and over, a rule with no valid automated fix — into governance signals rather than infinite churn. The system doesn't spin. It escalates.&lt;/p&gt;

&lt;p&gt;That's the architecture of convergence. The daemon can't get stuck in a loop it can't exit. Every unmappable pattern eventually surfaces as a human decision.&lt;/p&gt;

&lt;p&gt;I closed G2 on May 12. Band D — 107 issues, fourteen weeks of engine integrity work — closed the same day.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Audit Shows
&lt;/h2&gt;

&lt;p&gt;Current state: &lt;code&gt;core-admin code audit&lt;/code&gt; returns PASS, 20 findings.&lt;/p&gt;

&lt;p&gt;Fourteen weeks ago, before Band D started, the audit returned findings in the hundreds across namespaces we didn't even have rules for yet. The findings weren't noise — they were governance debt we couldn't see because the instruments weren't built yet.&lt;/p&gt;

&lt;p&gt;That's the counterintuitive thing about this kind of system. Adding a rule doesn't fix violations. It makes violations visible. When ADR-031 landed — no hardcoded runtime directory paths — it surfaced 40 pre-existing violations in one run. The audit went from PASS to FAIL. That FAIL was progress.&lt;/p&gt;

&lt;p&gt;20 findings at PASS is not a clean codebase. It's a codebase where every remaining finding is known, tracked, and either queued for autonomous remediation or parked as a deliberate human decision. The difference between "has findings" and "has uncontrolled findings" is the entire value proposition.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Governor Role, Fourteen Weeks In
&lt;/h2&gt;

&lt;p&gt;I am not a programmer. I have not written implementation code during this project.&lt;/p&gt;

&lt;p&gt;What I've done: defined constitutional rules, authored ADRs, reviewed proposals that required architectural judgment, held the line on decisions where the system wanted to go one way and the architecture required another. One example: when &lt;code&gt;modularity.class_too_large&lt;/code&gt; kept triggering on &lt;code&gt;PathResolver&lt;/code&gt;, the autonomous path wanted to split it. The architectural answer was an exclusion in governance config, with a documented removal condition. That decision belongs in &lt;code&gt;.intent/&lt;/code&gt;. It takes three lines of YAML, not a code change.&lt;/p&gt;

&lt;p&gt;The G4 gate is what makes this possible. When governance lives in &lt;code&gt;src/&lt;/code&gt;, changing it requires a programmer. When it lives in &lt;code&gt;.intent/&lt;/code&gt;, it requires a governor.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "Done" Honestly Means
&lt;/h2&gt;

&lt;p&gt;The machinery is complete. The empirical evidence is young.&lt;/p&gt;

&lt;p&gt;G2's structural guarantee — the circuit-breaker — is real. What I don't yet have is weeks of daemon logs showing sustained convergence across diverse rule namespaces, under varied load, with a full autonomous approval cycle running. The gate is closed by architecture. The demonstration is still accumulating.&lt;/p&gt;

&lt;p&gt;I'll write about that when the logs are there to show. The series has been honest about the distance between "designed to work" and "observed working." This is no different.&lt;/p&gt;




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

&lt;p&gt;The system is autonomous. The next question is whether it's legible — to someone who isn't its author.&lt;/p&gt;

&lt;p&gt;That's Band E. The outward-facing work: making the consequence chain readable to a stranger, making the governor role demonstrable rather than described, making the case that a regulated-industry team could operate this without understanding the source code.&lt;/p&gt;

&lt;p&gt;The 79-second self-heal was the internal proof. The external proof is what comes next.&lt;/p&gt;




&lt;p&gt;CORE is a governed software factory, actively built by the method it describes — &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;source on GitHub&lt;/a&gt;. If you're building in the governed-AI or regulated-software space and this resonates, comments are open.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>governance</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>79 Seconds: Our AI Governance System's First Autonomous Self-Heal</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Sat, 09 May 2026 13:57:13 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/79-seconds-our-ai-governance-systems-first-autonomous-self-heal-53a8</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/79-seconds-our-ai-governance-systems-first-autonomous-self-heal-53a8</guid>
      <description>&lt;p&gt;&lt;em&gt;I am not a programmer. I wrote zero lines of code today. The system fixed itself.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;We've been building CORE — a deterministic governance runtime that surrounds AI with constitutional law so that AI mistakes are detectable, traceable, and recoverable. The pitch is simple: a non-programmer governor holds the &lt;em&gt;why&lt;/em&gt;, AI and workers handle the &lt;em&gt;how&lt;/em&gt;, and the constitution ensures nothing unauthorized happens.&lt;/p&gt;

&lt;p&gt;Today we proved it works. Not in a demo. Not against a toy example. Against a real system that had been stuck for four days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The State of Things This Morning
&lt;/h2&gt;

&lt;p&gt;The autonomous loop — detect violation → propose fix → approve → execute → verify — hadn't produced a successful commit in four days. The dashboard said &lt;code&gt;last_consequence: 4d ago&lt;/code&gt;. The blackboard (our shared state surface) had 55 open findings, none of which the loop could act on. Proposals were being generated and immediately rejected as structurally incoherent.&lt;/p&gt;

&lt;p&gt;From the outside it looked alive. Twenty active workers, sensors firing, heartbeats posting. But nothing was moving.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Investigation
&lt;/h2&gt;

&lt;p&gt;We didn't start by writing code. We started by asking questions of the system itself.&lt;/p&gt;

&lt;p&gt;The first query revealed the shape of the problem: 150 failed proposals, 0 executed today, the last consequence three days old. Dig deeper: 128 of those 150 failures were the same error — a constitutional gate blocking the same action, over and over. That's not a bug in the traditional sense. That's the system correctly enforcing its own laws while an upstream generator keeps producing proposals that violate them.&lt;/p&gt;

&lt;p&gt;Then: the 55 "open" findings the remediator was supposed to act on — what were they actually? Mostly &lt;code&gt;blackboard.entry_stale&lt;/code&gt; meta-findings. The loop was trying to remediate its own observability noise. The actual code violations — 25 of them, confirmed by audit — were invisible, blocked by their own historical entries sitting in &lt;code&gt;abandoned&lt;/code&gt; status, which the sensor dedup treated as permanent silencers.&lt;/p&gt;

&lt;p&gt;Seven distinct root causes, nested. Each one blocking the diagnostic of the next.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Fixed
&lt;/h2&gt;

&lt;p&gt;In order of discovery:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stale-finding storm.&lt;/strong&gt; The BlackboardShopManager was scanning all entry types for SLA violations — including heartbeats with a 10-minute SLA. Every daemon restart, thousands of old heartbeat entries immediately exceeded their SLA. One line added to the WHERE clause: &lt;code&gt;AND entry_type IN ('finding', 'proposal')&lt;/code&gt;. Storm stopped. Zero new stale findings in 3 minutes versus 3 per minute before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The consequence chain gap.&lt;/strong&gt; When a proposal completed successfully, the findings it had addressed stayed in &lt;code&gt;deferred_to_proposal&lt;/code&gt; status forever. The failure path had a revival method. The success path had nothing. New method: &lt;code&gt;resolve_deferred_entries_for_completed_proposal()&lt;/code&gt;. Symmetric with the failure path. Twelve lines of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The proposal collapse.&lt;/strong&gt; The proposal generator was creating proposals for N files but only including one action — always targeting &lt;code&gt;scope.files[0]&lt;/code&gt;. A proposal claiming to fix 8 violations would touch exactly one file and leave 7 untouched. The fix: one ProposalAction per affected file, ordered 0 through N-1. The executor already supported multi-action proposals. Nobody had ever wired the generator correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DELEGATE routing gap.&lt;/strong&gt; &lt;code&gt;modularity.class_too_large&lt;/code&gt; violations — class-level refactors that require human judgment — were marked &lt;code&gt;PENDING&lt;/code&gt; in the remediation map. PENDING entries are excluded from the active map by the loader. So those findings were claimed, found unmappable, and released back to open every 60 seconds. Forever. The fix was a YAML status change: &lt;code&gt;PENDING&lt;/code&gt; → &lt;code&gt;DELEGATE&lt;/code&gt;. The loader already handled DELEGATE entries. One word changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The permanent-silence bug.&lt;/strong&gt; When we cleared the stale queue, we used &lt;code&gt;abandoned&lt;/code&gt; status. What we didn't know: &lt;code&gt;abandoned&lt;/code&gt; is treated the same as &lt;code&gt;open&lt;/code&gt; by the sensor dedup logic. "Already represented on the blackboard, do not re-post." So the violations we'd cleaned up were now permanently invisible. Filed as a design-level issue — &lt;code&gt;abandoned&lt;/code&gt; and "deliberately suppressed" need to be different states. Immediate fix: flip the cleaned-up &lt;code&gt;audit.violation::&lt;/code&gt; entries to &lt;code&gt;resolved&lt;/code&gt;, which the sensor correctly treats as "re-detectable."&lt;/p&gt;

&lt;h2&gt;
  
  
  13:16:18
&lt;/h2&gt;

&lt;p&gt;With the queue clean, the sensors unblocked, and the DELEGATE routing live, the loop had something to work with. A needs_split violation appeared. The remediator created a proposal. We approved it — the first manual approval of the day.&lt;/p&gt;

&lt;p&gt;At 13:16:18, &lt;code&gt;ProposalConsumerWorker&lt;/code&gt; picked it up. &lt;code&gt;fix.modularity&lt;/code&gt; ran. The LLM took 33 seconds to analyze the file. It returned a plan.&lt;/p&gt;

&lt;p&gt;The plan had one module. The validator requires at least two for a split.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mark_failed&lt;/code&gt; ran. The file changes were reverted. The proposal was marked failed.&lt;/p&gt;

&lt;p&gt;Then: &lt;code&gt;revive_findings_for_failed_proposal&lt;/code&gt; ran. The deferred finding flipped back to open.&lt;/p&gt;

&lt;p&gt;At 13:17:37 — 79 seconds after failure — the finding was re-claimed, a new proposal was created, and it was sitting in the approval inbox.&lt;/p&gt;

&lt;p&gt;The loop had self-healed. Without intervention. Traceable at every step.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Self-Heal" Actually Means
&lt;/h2&gt;

&lt;p&gt;The LLM produced bad output. The system caught it, reverted the change, put the work back in the queue, and asked again. No data was corrupted. No state was left inconsistent. The governor's role was to review the next proposal and decide whether to approve it.&lt;/p&gt;

&lt;p&gt;This is the regulated-industry argument for this kind of governance. You don't need AI to never fail. You need failure to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detectable.&lt;/strong&gt; The validator caught a 1-module "split" plan before anything was committed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounded.&lt;/strong&gt; The gate order — Conservation Gate, IntentGuard, plan validator — ensures AI output can't bypass constitutional constraints even if it tries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recoverable.&lt;/strong&gt; The revival mechanism returned the system to a known-good state. The finding was exactly as it was before the failed attempt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceable.&lt;/strong&gt; Every step — finding posted, claimed, deferred, proposal created, approved, executing, failed, revived, re-claimed — is a timestamped row in a queryable table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The audit trail isn't bolted on. It's how the loop works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Governor Role
&lt;/h2&gt;

&lt;p&gt;I am not a programmer. I wrote zero lines of code today.&lt;/p&gt;

&lt;p&gt;What I did: asked questions of the system, recognized when an answer pointed to a design gap rather than a bug, held the line on architectural decisions (backbone workers don't get split autonomously, regardless of what the violation detector says), and approved one proposal when the conditions were right.&lt;/p&gt;

&lt;p&gt;The rest was diagnosis, sequencing, and constitutional reasoning. The code came from Claude Code on the development machine, prompted by the analysis. The analysis came from reading the system's own outputs — queries, logs, dashboard — not from reading source files.&lt;/p&gt;

&lt;p&gt;That's the governor role. Not "I don't code therefore I'm not involved in technical work." The opposite: deeply involved in technical decisions, operating at the right level of abstraction, with a system that surfaces the right information to make those decisions.&lt;/p&gt;

&lt;p&gt;The 79-second self-heal wasn't despite the governance architecture. It was because of it.&lt;/p&gt;




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

&lt;p&gt;The loop machinery is sound. The next bottleneck is &lt;code&gt;fix.modularity&lt;/code&gt;'s prompt — the LLM needs to be told explicitly to produce at least two modules and given responsibility-grouping context from the audit findings. That's prompt engineering work, not infrastructure.&lt;/p&gt;

&lt;p&gt;When that's fixed, CORE will autonomously split files, verify the split, commit, re-audit, and confirm the finding is resolved — without a human writing a line of code.&lt;/p&gt;

&lt;p&gt;We're close.&lt;/p&gt;




&lt;p&gt;CORE is a governed software factory, actively being built by the method it describes — &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;source on GitHub&lt;/a&gt;. If you're building in the governed-AI or regulated-software space and this resonates, comments are open.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>governance</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>CORE Closed Its Audit Trail. Then Found 18 Engine Gaps It Couldn't See Before.</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Fri, 01 May 2026 21:35:48 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/core-closed-its-audit-trail-then-found-18-engine-gaps-it-couldnt-see-before-d00</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/core-closed-its-audit-trail-then-found-18-engine-gaps-it-couldnt-see-before-d00</guid>
      <description>&lt;p&gt;Six weeks ago I published a post here titled &lt;em&gt;"Your Agent Has Two Logs. One of Them Doesn't Exist Yet."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This week, Band B closed. CORE's second log exists.&lt;/p&gt;

&lt;p&gt;Here's what that actually means — and why closing it immediately made things harder.&lt;/p&gt;




&lt;h2&gt;
  
  
  The two-log problem, briefly
&lt;/h2&gt;

&lt;p&gt;Every autonomous system that touches production code has two logs whether it admits it or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log one:&lt;/strong&gt; what happened. Files changed, tests ran, commits landed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log two:&lt;/strong&gt; &lt;em&gt;why&lt;/em&gt; it happened. What finding triggered what proposal. What approval authorized what execution. What execution caused what file change. What file change produced what new finding.&lt;/p&gt;

&lt;p&gt;Log two is the audit trail. In a regulated environment, log two isn't optional — it's the difference between a system you can defend and one you can't.&lt;/p&gt;

&lt;p&gt;CORE had log one. Log two was missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Band B actually required
&lt;/h2&gt;

&lt;p&gt;Eight issues. Four ADRs. Seven coordinated write-path decisions — where in the code does attribution get written, in what shape, guaranteed by what gate.&lt;/p&gt;

&lt;p&gt;The hard part wasn't the code. It was making the causality chain &lt;em&gt;complete&lt;/em&gt;. Every link had to be present:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finding → which proposal claimed it (and when)&lt;/li&gt;
&lt;li&gt;Proposal → which execution consumed it (and what commit resulted)&lt;/li&gt;
&lt;li&gt;Execution → which new findings it produced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Miss one link and the chain is decoration, not evidence.&lt;/p&gt;

&lt;p&gt;196 commits in April. 25 issues closed. Band B: 8 closed, 0 open.&lt;/p&gt;




&lt;h2&gt;
  
  
  What happened immediately after
&lt;/h2&gt;

&lt;p&gt;Band D opened with 18 issues.&lt;/p&gt;

&lt;p&gt;Not because we introduced regressions. Because closing Band B made the engine's integrity gaps visible in a way they weren't before. You can't measure attribution fidelity until attribution exists. Once it does, you can see exactly where the engine fails to populate it correctly.&lt;/p&gt;

&lt;p&gt;This is the convergence principle working as designed. The system gets more capable. It immediately finds more problems with itself. The audit PASS holds — 19 active workers, findings are warnings about modularity, not governance failures. But the work queue doesn't shrink when a band closes. It shifts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "GxP-load-bearing" means in practice
&lt;/h2&gt;

&lt;p&gt;I've been building CORE in part for environments like pharmaceutical manufacturing — where an AI system that modifies code or configuration needs to prove it acted within authorized boundaries, on authorized intent, with a complete audit trail.&lt;/p&gt;

&lt;p&gt;GxP (Good Practice regulations) doesn't care what your system &lt;em&gt;can&lt;/em&gt; do. It cares what your system &lt;em&gt;can prove&lt;/em&gt; it did.&lt;/p&gt;

&lt;p&gt;Band B is the difference between CORE being a capable tool and CORE being a defensible tool. The second log is what makes it defensible.&lt;/p&gt;




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

&lt;p&gt;Band D: engine integrity. 18 open issues. The system that now has a complete audit trail needs its engine tightened before those traces are fully trustworthy.&lt;/p&gt;

&lt;p&gt;Then Band E: external validation. CORE governing a repository it didn't build.&lt;/p&gt;

&lt;p&gt;The second log exists. Now we make sure everything it records is true.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CORE is open source: &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous in this series: &lt;a href="https://dev.to/dariusz_newecki_e35b0924c/your-agent-has-two-logs-one-of-them-doesnt-exist-yet-253a"&gt;Your Agent Has Two Logs. One of Them Doesn't Exist Yet.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>python</category>
      <category>core</category>
    </item>
    <item>
      <title>My Audit Caught My Audit Being Wrong</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Sat, 25 Apr 2026 22:16:52 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/my-audit-caught-my-audit-being-wrong-42b6</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/my-audit-caught-my-audit-being-wrong-42b6</guid>
      <description>&lt;p&gt;&lt;em&gt;And that's exactly what it's supposed to do.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;A few days ago I ran a diagnostic on CORE — the governance system I'm building that supervises AI-generated code. The diagnostic was supposed to investigate why a specific audit rule appeared to be silently failing. Not firing. Producing zero findings against files it should have flagged.&lt;/p&gt;

&lt;p&gt;I ran the investigation carefully. Stage by stage. I came to a conclusion.&lt;/p&gt;

&lt;p&gt;The conclusion was wrong.&lt;/p&gt;

&lt;p&gt;And I only found that out because the system itself told me so.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I thought was happening
&lt;/h2&gt;

&lt;p&gt;CORE has an audit rule called &lt;code&gt;autonomy.tracing.mandatory&lt;/code&gt;. It checks that any class ending in &lt;code&gt;Agent&lt;/code&gt; contains a mandatory call to &lt;code&gt;self.tracer.record&lt;/code&gt;. The logic is straightforward: if an autonomous agent produces work, that work must be traceable. No tracing call — the rule flags it.&lt;/p&gt;

&lt;p&gt;My notes said the rule was firing zero findings against &lt;code&gt;SelfHealingAgent&lt;/code&gt; — a class with, in fact, zero tracer references. A rule designed to catch exactly that situation, catching nothing.&lt;/p&gt;

&lt;p&gt;That's a governance gap. If a rule exists and silently fails, you don't have an audit system. You have a theatrical one.&lt;/p&gt;

&lt;p&gt;So I investigated.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually found
&lt;/h2&gt;

&lt;p&gt;The rule was firing. Correctly. Both findings were present, cleanly, in &lt;code&gt;reports/audit_findings.json&lt;/code&gt;:&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;"check_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"autonomy.tracing.mandatory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"warning"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Line 51: missing mandatory call(s): ['self.tracer.record']"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"file_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/will/agents/self_healing_agent.py"&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;The system wasn't broken. The diagnostic's starting assumption was broken.&lt;/p&gt;

&lt;p&gt;Here's where it came from. CORE's audit output is rendered through Rich — a Python library that produces beautiful terminal tables with color, alignment, and spacing. Rich also truncates long strings to fit columns. So &lt;code&gt;autonomy.tracing.mandatory&lt;/code&gt; becomes &lt;code&gt;autonomy.tracing.mandat…&lt;/code&gt; on screen.&lt;/p&gt;

&lt;p&gt;When I ran &lt;code&gt;grep 'tracing.mandatory'&lt;/code&gt; against the captured terminal output to verify the finding, I got zero matches. Not because the finding wasn't there — because Rich had silently eaten the last four characters of the rule name, and my grep pattern was looking for the full string.&lt;/p&gt;

&lt;p&gt;I used display output as an oracle. Display output lied.&lt;/p&gt;

&lt;p&gt;The JSON source of truth never did.&lt;/p&gt;




&lt;h2&gt;
  
  
  The stage-by-stage result
&lt;/h2&gt;

&lt;p&gt;I re-ran the diagnostic properly, going to primary sources instead of rendered output:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rule loaded and mapped&lt;/td&gt;
&lt;td&gt;PASS — rule extracted, bound to &lt;code&gt;ast_gate&lt;/code&gt; engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope resolution&lt;/td&gt;
&lt;td&gt;PASS — &lt;code&gt;self_healing_agent.py&lt;/code&gt; in scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engine dispatch&lt;/td&gt;
&lt;td&gt;PASS — engine ran against the file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-ignore&lt;/td&gt;
&lt;td&gt;PASS — zero suppressions, nothing dropped silently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finding emitted&lt;/td&gt;
&lt;td&gt;PASS — present in &lt;code&gt;audit_findings.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every stage passed. The investigation had no failure to explain, because there was no failure. It was investigating a ghost.&lt;/p&gt;

&lt;p&gt;Direct engine invocation confirmed it independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Standalone check — no orchestrator involved
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&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;GenericASTChecks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_selected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GenericASTChecks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate_requirement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requirement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Output:
# ClassDef SelfHealingAgent -&amp;gt; missing mandatory call(s): ['self.tracer.record']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same verdict. No ambiguity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters more than "I made a mistake"
&lt;/h2&gt;

&lt;p&gt;I'm building a system where AI generates code and a deterministic governance layer audits it. The entire value proposition is that the governance layer is trustworthy. Not smart — &lt;em&gt;trustworthy&lt;/em&gt;. You need to be able to look at a finding and know it reflects reality. You need to be able to look at a clean audit and know the system actually checked.&lt;/p&gt;

&lt;p&gt;That's called instrument qualification. In regulated industries — pharmaceuticals, medical devices, aerospace — you don't just validate the product. You validate the instruments you used to measure the product. A thermometer that reads 37°C when the actual temperature is 39°C isn't a minor inconvenience. It's a systematic lie that compounds silently across every reading it ever produces.&lt;/p&gt;

&lt;p&gt;I accidentally demonstrated the same principle in software.&lt;/p&gt;

&lt;p&gt;When I used &lt;code&gt;grep&lt;/code&gt; against Rich-rendered terminal output, I was reading from an instrument I hadn't qualified. Rich is a display library. It's not a data source. It's designed to make things readable to humans, not parseable by machines. Using it as a source of truth for a diagnostic is exactly as reliable as doing a medical measurement with a ruler.&lt;/p&gt;

&lt;p&gt;The JSON report is the qualified instrument. It's the canonical output. It doesn't truncate. It doesn't wrap. It doesn't abbreviate for column fit. It says what the system found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A passing audit with many findings is less honest than a failing audit with fewer real ones. An instrument that gives you clean-looking output that misrepresents reality isn't helping you — it's flattering you.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I changed
&lt;/h2&gt;

&lt;p&gt;Two things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One: I added the stale references explicitly to the diagnostic record.&lt;/strong&gt; My notes had two wrong module paths that would have caused anyone running the diagnostic in the future to hit &lt;code&gt;ImportError&lt;/code&gt; immediately. &lt;code&gt;AuditorContext&lt;/code&gt; is not in &lt;code&gt;mind.logic.engines.ast_gate.base&lt;/code&gt; — it's in &lt;code&gt;mind.governance.audit_context&lt;/code&gt;. I documented both as stale references, with the correct paths. Constitutional debt is honest debt. Hiding it helps no one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two: I documented the grep-against-Rich anti-pattern.&lt;/strong&gt; Not as a personal failure, but as a category. If I did it, someone else will do it, or I'll do it again in six months under pressure. The pattern needs a name so it can be recognized.&lt;/p&gt;




&lt;h2&gt;
  
  
  The uncomfortable version
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable version of this story: I almost propagated the wrong conclusion.&lt;/p&gt;

&lt;p&gt;If I'd stopped at "zero grep matches, rule is not firing," I would have written a finding that said the governance system had a blind spot. I might have gone looking for a fix in the wrong place. I might have introduced a workaround that solved a problem that didn't exist, while leaving a different problem — the unreliable diagnostic method — completely intact.&lt;/p&gt;

&lt;p&gt;In a system that supervises autonomous AI code generation, a wrong finding about your audit rules is worse than a missing finding. A missing finding is a gap. A wrong finding is a confidence injection. You become &lt;em&gt;more&lt;/em&gt; certain the system is broken in a specific way, and that certainty guides you away from the actual state.&lt;/p&gt;

&lt;p&gt;That's the failure mode I'm most worried about in AI-supervised systems generally. Not that the AI is wrong — everyone accepts the AI might be wrong. The failure mode is when the verification layer produces plausible-looking output that you stop checking.&lt;/p&gt;

&lt;p&gt;CORE is built on the assumption that every layer lies until verified. Including the diagnostic layer. Including me.&lt;/p&gt;

&lt;p&gt;I'm not a programmer. I'm closer to a lawmaker than a coder. I built a governance system because I understand governance better than I understand AST traversal. Swimming against a current you can't even see clearly is exactly the situation where you need your instruments to be honest. Flattery is the thing that drowns you.&lt;/p&gt;

&lt;p&gt;The system didn't flatter me. That's not a bug. That's the only thing I actually need it to do.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CORE is an open-source, deterministic governance runtime for AI-generated code. You can find it at &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>The First Test CORE Ever Wrote For Itself</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Sat, 18 Apr 2026 14:40:25 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/the-first-test-core-ever-wrote-for-itself-2k44</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/the-first-test-core-ever-wrote-for-itself-2k44</guid>
      <description>&lt;p&gt;&lt;em&gt;And why it was wrong — and why that's exactly the point.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Today, at 16:24 CET, my system wrote a test file for itself.&lt;/p&gt;

&lt;p&gt;Not a test I wrote. Not a test a developer wrote. A test that CORE — my constitutional governance runtime — autonomously detected was missing, proposed to generate, waited for my approval, and then wrote using its own CoderAgent.&lt;/p&gt;

&lt;p&gt;The test was wrong. The methods it tested don't exist. The API it assumed was hallucinated.&lt;/p&gt;

&lt;p&gt;And I'm more excited about this than if it had been perfect.&lt;/p&gt;




&lt;h2&gt;
  
  
  What CORE is (briefly)
&lt;/h2&gt;

&lt;p&gt;CORE is a deterministic governance runtime that surrounds AI code generation with constitutional law. AI produces code, but every output is verified against rules, audited, and must pass governance gates before execution. The human role is governor — not programmer.&lt;/p&gt;

&lt;p&gt;I've written about this system before. The previous milestone was &lt;a href="https://dev.to/dariusznewecki/when-my-ai-blocked-itself"&gt;when CORE blocked itself&lt;/a&gt; — a rule violation preventing its own remediation from executing. Today's milestone is different. Today, the system grew a new autonomous capability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stream B: closing the test loop
&lt;/h2&gt;

&lt;p&gt;CORE already has a working autonomous loop for code quality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AuditViolationSensor detects violation
  → ViolationRemediatorWorker creates proposal
  → ProposalConsumerWorker executes fix
  → Sensor re-runs — finding resolves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stream B was the same loop, but for test coverage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TestCoverageSensor detects missing test
  → TestRunnerSensor confirms (pytest)
  → TestRemediatorWorker creates build.tests proposal
  → ProposalConsumerWorker executes → CoderAgent writes test
  → TestRunnerSensor re-runs — pass or fail finding posted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The components didn't exist. We built them today.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;TestCoverageSensor&lt;/code&gt;&lt;/strong&gt; — scans &lt;code&gt;src/&lt;/code&gt; for Python files with no corresponding test file. Posts &lt;code&gt;test.run_required::&lt;/code&gt; findings to the Blackboard. Critically: the scan parameters (source root, test root, excluded filenames) are read from &lt;code&gt;.intent/enforcement/config/test_coverage.yaml&lt;/code&gt; at runtime. No paths hardcoded in Python. Changing what gets scanned is a constitution edit, not a code change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;TestRunnerSensor&lt;/code&gt;&lt;/strong&gt; — already existed, just paused. Consumes &lt;code&gt;test.run_required::&lt;/code&gt; findings, runs pytest, posts &lt;code&gt;test.missing&lt;/code&gt; or &lt;code&gt;test.failure&lt;/code&gt;. Activated today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;TestRemediatorWorker&lt;/code&gt;&lt;/strong&gt; — new acting worker. Claims &lt;code&gt;test.missing&lt;/code&gt; and &lt;code&gt;test.failure&lt;/code&gt; findings, groups by &lt;code&gt;source_file&lt;/code&gt;, creates one &lt;code&gt;build.tests&lt;/code&gt; proposal per file. Per-file deduplication: two concurrent proposals for different files are valid and don't block each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;build.tests&lt;/code&gt; AtomicAction&lt;/strong&gt; — already existed in the registry. Takes &lt;code&gt;source_file&lt;/code&gt;, calls CoderAgent, runs auto-heal pipeline (fix.imports, fix.headers, fix.format), IntentGuard validation, writes the test file.&lt;/p&gt;

&lt;p&gt;Four components. One closed loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bugs we hit
&lt;/h2&gt;

&lt;p&gt;I'm going to be honest about the path here, because the bugs were instructive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug 1: &lt;code&gt;entry_id&lt;/code&gt; vs &lt;code&gt;id&lt;/code&gt;.&lt;/strong&gt;&lt;br&gt;
The BlackboardService contract is clear — all finding dicts use key &lt;code&gt;"id"&lt;/code&gt;. Somewhere along the way, three files in the codebase had &lt;code&gt;finding["entry_id"]&lt;/code&gt; — confusing a local variable name with the dict key. Same fix three times: &lt;code&gt;finding["id"]&lt;/code&gt;. The lesson: a contract stated only in docstrings is a contract that will be violated. CORE's next step should be a schema-level enforcement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug 2: Subject prefix mismatch.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ViolationRemediatorWorker&lt;/code&gt; only claims findings with prefix &lt;code&gt;audit.violation::&lt;/code&gt;. &lt;code&gt;test.missing::&lt;/code&gt; findings sat on the Blackboard unclaimed — the remediation map had the right entries but the worker never saw them. Option A (widen prefix) was ruled out: the worker's core loop reads &lt;code&gt;payload["rule"]&lt;/code&gt; for routing, and test findings have no &lt;code&gt;rule&lt;/code&gt; key. Option C (dedicated worker) was the right call. &lt;code&gt;TestRemediatorWorker&lt;/code&gt; was built. Single responsibility, clean separation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug 3: &lt;code&gt;action_executor&lt;/code&gt; not available in daemon context.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;build.tests&lt;/code&gt; calls &lt;code&gt;core_context.action_executor&lt;/code&gt;. At CLI bootstrap time, this attribute is monkey-patched onto CoreContext. The daemon doesn't do this — it passes a bare context. The fix was a &lt;code&gt;hasattr&lt;/code&gt; guard, already canonically established in &lt;code&gt;ViolationExecutorWorker&lt;/code&gt; with a comment explaining exactly this failure mode. Before applying it, I asked Claude Code to assess the blast radius: three sites in daemon paths were affected. We fixed the blocking one now; the other two go on the Phase 4 queue. Surgical over broad.&lt;/p&gt;




&lt;h2&gt;
  
  
  The first test
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestBlackboardAuditor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_audit_with_valid_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;mock_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task 1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;BlackboardAuditor&lt;/code&gt; has no &lt;code&gt;audit()&lt;/code&gt; method. It has &lt;code&gt;run()&lt;/code&gt;, &lt;code&gt;run_loop()&lt;/code&gt;, SLA-tier checking, stale entry detection. The LLM invented an API from the class name alone.&lt;/p&gt;

&lt;p&gt;Why am I not disappointed?&lt;/p&gt;

&lt;p&gt;Because this is iteration zero. The infrastructure works — detection, proposal creation, approval gate, execution, git commit. The quality of the generated test is a separate concern, and it's an addressable one. CoderAgent generated tests without reading the source file first. The fix is to pass the source content as context before generation. That's a &lt;code&gt;build_tests_action.py&lt;/code&gt; improvement for the next session.&lt;/p&gt;

&lt;p&gt;More importantly: the system &lt;em&gt;caught its own mistake&lt;/em&gt;. &lt;code&gt;TestRunnerSensor&lt;/code&gt; will run, the tests will fail, &lt;code&gt;test.failure&lt;/code&gt; findings will be posted, a repair proposal will be created. The loop continues.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "autonomous" actually means here
&lt;/h2&gt;

&lt;p&gt;I approved the proposal. I didn't write the test. I didn't write the sensor. I didn't wire the pipeline. I didn't debug the &lt;code&gt;entry_id&lt;/code&gt; bug — I read the trace, stated the contract, Claude Code applied the fix.&lt;/p&gt;

&lt;p&gt;My role today was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architectural decisions (Option A vs B vs C for the subject prefix problem)&lt;/li&gt;
&lt;li&gt;Scope control (one file, not 741)&lt;/li&gt;
&lt;li&gt;Approval gating (three proposals created, three reviewed, two rejected for cause, one approved)&lt;/li&gt;
&lt;li&gt;Quality judgment (the test is wrong — that's useful signal, not a failure)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the governor role. Not programming. Governing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest state
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; The loop closes. Coverage gap detected → test proposed → human approves → test written → failure detected → repair proposed. End-to-end autonomous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What doesn't yet:&lt;/strong&gt; The generated tests are hallucinated. CoderAgent wrote tests for an API that doesn't exist because it had no context about what &lt;code&gt;BlackboardAuditor&lt;/code&gt; actually does. The path mapping between &lt;code&gt;src/&lt;/code&gt; and &lt;code&gt;tests/&lt;/code&gt; is also hardcoded in two of the three pipeline files — a drift risk I'm aware of and haven't fixed yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next:&lt;/strong&gt; The fix is the same pattern CORE already uses for code remediation: build a context package first. Read the source. Understand the architectural role. Then generate. &lt;code&gt;ViolationRemediator&lt;/code&gt; calls &lt;code&gt;RemediationInterpretationService.build_reasoning_brief_dict()&lt;/code&gt; before invoking any LLM — it passes actual method signatures, constitutional role, and import graph as the reasoning brief. &lt;code&gt;build.tests&lt;/code&gt; skips this step entirely. The infrastructure exists. It just isn't wired yet. Fix that, fix the path mapping to read from &lt;code&gt;.intent/&lt;/code&gt; everywhere, then open the scope beyond one file.&lt;/p&gt;

&lt;p&gt;The ratio today: one file with tests that fail. Tomorrow: the same loop repairs them.&lt;/p&gt;




&lt;h2&gt;
  
  
  On instrument qualification
&lt;/h2&gt;

&lt;p&gt;I've written before about the GxP principle I apply to CORE: &lt;em&gt;an instrument must be qualified before you trust its readings&lt;/em&gt;. An audit with 252 findings that passes is less trustworthy than one with 78 findings that fails.&lt;/p&gt;

&lt;p&gt;Today's first test is wrong. But the instrument that detected "this file has no tests" is correct. The instrument that detected "this test fails" will also be correct.&lt;/p&gt;

&lt;p&gt;The loop doesn't need perfect tests to be useful. It needs honest sensors.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CORE is open source. The architecture documents, constitutional rules, and implementation are all public at &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;. Documentation at &lt;a href="https://dariusznewecki.github.io/CORE" rel="noopener noreferrer"&gt;dariusznewecki.github.io/CORE&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous article in this series: &lt;a href="https://dev.to/dariusz_newecki_e35b0924c/the-ai-that-refused-to-ship-its-own-fix-1m1"&gt;The AI That Refused To Ship Its Own Fix&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>architecture</category>
      <category>core</category>
    </item>
    <item>
      <title>When My Governance System Governed Itself Wrong</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Tue, 14 Apr 2026 20:08:04 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/when-my-governance-system-governed-itself-wrong-17c</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/when-my-governance-system-governed-itself-wrong-17c</guid>
      <description>&lt;p&gt;&lt;em&gt;I built a sensor to detect import order violations. It found 152. The fixer found 0. One of them was lying.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;CORE is a deterministic governance runtime I'm building around AI code generation. The core idea is simple: AI produces code, but AI is never trusted. Every output passes through constitutional rules, audit engines, and remediation loops before anything touches the codebase.&lt;/p&gt;

&lt;p&gt;One of those loops works 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;AuditViolationSensor detects violation
    → posts finding to Blackboard
ViolationRemediatorWorker claims finding
    → dispatches AtomicAction (fix.imports, fix.ids, fix.headers, etc.)
Sensor runs again
    → confirms violation gone or re-posts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the convergence loop. The goal is that the Blackboard empties over time as violations get fixed. That's what I call A3 — the daemon runs continuously and the codebase converges without me touching anything.&lt;/p&gt;

&lt;p&gt;This session I was closing sensor coverage gaps. Several fix actions in &lt;code&gt;dev sync&lt;/code&gt; had no corresponding sensor, meaning the daemon was blind to those violations and a human had to run &lt;code&gt;dev sync&lt;/code&gt; manually to keep things clean. Not autonomous. Not A3.&lt;/p&gt;

&lt;p&gt;One of the gaps was &lt;code&gt;style.import_order&lt;/code&gt;. I wrote the sensor, wired it up, restarted the daemon.&lt;/p&gt;

&lt;p&gt;152 findings.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The sensor was using an AST-based implementation — &lt;code&gt;check_import_order&lt;/code&gt; — that classifies imports into groups: &lt;code&gt;future&lt;/code&gt;, &lt;code&gt;stdlib&lt;/code&gt;, &lt;code&gt;third_party&lt;/code&gt;, &lt;code&gt;internal&lt;/code&gt;. It then checks that the groups appear in the right order.&lt;/p&gt;

&lt;p&gt;The fixer uses &lt;code&gt;ruff --select I&lt;/code&gt;, which does the same job but reads its configuration from &lt;code&gt;pyproject.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[tool.ruff.lint.isort]&lt;/span&gt;
&lt;span class="py"&gt;known-first-party&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"features"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"mind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"shared"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"will"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;section-order&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"future"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"standard-library"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"third-party"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"first-party"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"local-folder"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran &lt;code&gt;fix.imports --write&lt;/code&gt; to clean up before activating the sensor. Zero violations after. Then I activated the sensor. 152 violations.&lt;/p&gt;

&lt;p&gt;The sensor and the fixer disagreed on what "correctly ordered imports" means.&lt;/p&gt;




&lt;h2&gt;
  
  
  Finding the Root Cause
&lt;/h2&gt;

&lt;p&gt;I picked the simplest failing file — &lt;code&gt;src/cli/resources/admin/patterns.py&lt;/code&gt; — violation at line 7:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;typer&lt;/span&gt;                              &lt;span class="c1"&gt;# third_party → idx 2
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;shared.cli_utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;core_command&lt;/span&gt; &lt;span class="c1"&gt;# internal   → idx 3
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;                      &lt;span class="c1"&gt;# ???
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sensor's &lt;code&gt;_classify_root&lt;/code&gt; function takes the module name and classifies it. For &lt;code&gt;from .hub import app&lt;/code&gt;, a relative import, &lt;code&gt;stmt.module&lt;/code&gt; is &lt;code&gt;"hub"&lt;/code&gt;. &lt;code&gt;"hub"&lt;/code&gt; is not in &lt;code&gt;stdlib_names&lt;/code&gt; and not in &lt;code&gt;internal_roots&lt;/code&gt;, so it falls through to &lt;code&gt;third_party&lt;/code&gt; — index 2.&lt;/p&gt;

&lt;p&gt;But &lt;code&gt;shared&lt;/code&gt; was classified as &lt;code&gt;internal&lt;/code&gt; — index 3.&lt;/p&gt;

&lt;p&gt;Index 2 after index 3 → violation.&lt;/p&gt;

&lt;p&gt;Ruff treats relative imports as &lt;code&gt;local-folder&lt;/code&gt;, which comes &lt;em&gt;after&lt;/em&gt; &lt;code&gt;first-party&lt;/code&gt; in the section order. So ruff considers this file clean. The sensor considers it broken.&lt;/p&gt;

&lt;p&gt;Two problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 1 — relative imports.&lt;/strong&gt; The sensor had no concept of them. Any &lt;code&gt;from .something import X&lt;/code&gt; got classified as &lt;code&gt;third_party&lt;/code&gt; because the module name (&lt;code&gt;something&lt;/code&gt;) didn't match any known root. Fix: detect &lt;code&gt;stmt.level &amp;gt; 0&lt;/code&gt; in &lt;code&gt;ast.ImportFrom&lt;/code&gt; and classify as &lt;code&gt;local&lt;/code&gt; with the highest order index.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2 — internal roots mismatch.&lt;/strong&gt; The sensor hardcoded &lt;code&gt;["shared", "mind", "body", "will", "features"]&lt;/code&gt;. Ruff's &lt;code&gt;known-first-party&lt;/code&gt; includes &lt;code&gt;["api", "body", "cli", "features", "mind", "services", "shared", "will"]&lt;/code&gt;. Missing: &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;. When a file imports from &lt;code&gt;cli&lt;/code&gt; after importing from &lt;code&gt;body&lt;/code&gt;, ruff sees two first-party imports in any order — fine. The sensor sees &lt;code&gt;third_party&lt;/code&gt; after &lt;code&gt;internal&lt;/code&gt; — violation.&lt;/p&gt;

&lt;p&gt;Fix: pass &lt;code&gt;internal_roots&lt;/code&gt; as a parameter in the enforcement mapping so the sensor reads from configuration rather than hardcoding.&lt;/p&gt;

&lt;p&gt;After both fixes: 0 violations. Sensor and fixer agreed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architectural Lesson
&lt;/h2&gt;

&lt;p&gt;This is an instrument qualification problem.&lt;/p&gt;

&lt;p&gt;In GxP-regulated environments (pharma, medical devices), before you trust a measurement instrument, you qualify it. You verify that it measures what it claims to measure, using a known reference. An unqualified instrument is not a trusted instrument — even if it produces numbers.&lt;/p&gt;

&lt;p&gt;I deployed a sensor without qualifying it against the fixer. The sensor was measuring something real (import order), but measuring it differently than the tool that fixes it. The result was 152 false positives — governance debt that looked real but wasn't.&lt;/p&gt;

&lt;p&gt;A sensor that disagrees with its corresponding fixer is worse than no sensor. It creates noise, erodes trust in the Blackboard, and — if the remediator were running — would dispatch fix actions that produce no change, loop, and dispatch again.&lt;/p&gt;

&lt;p&gt;The correct pattern before activating any new sensor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the fixer in dry-run mode. Collect what it would change.&lt;/li&gt;
&lt;li&gt;Run the sensor. Collect what it would flag.&lt;/li&gt;
&lt;li&gt;Verify the two sets agree on the same files.&lt;/li&gt;
&lt;li&gt;Only then activate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CORE doesn't enforce this yet. The gap is now in the backlog as &lt;code&gt;governance.sensor_fixer_coherence&lt;/code&gt; — a meta-rule that validates governance components against each other before they're trusted.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Got Fixed
&lt;/h2&gt;

&lt;p&gt;Three separate changes at three separate levels:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AST logic&lt;/strong&gt; (&lt;code&gt;src/mind/logic/engines/ast_gate/checks/import_checks.py&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before: relative imports fell through to third_party
# After: detect stmt.level &amp;gt; 0 and classify as local (idx=4)
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportFrom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;grp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;local&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="c1"&gt;# always last — after internal
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt; (&lt;code&gt;.intent/enforcement/mappings/code/style.yaml&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;style.import_order&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ast_gate&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;check_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;import_order&lt;/span&gt;
    &lt;span class="na"&gt;internal_roots&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cli"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;features"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mind"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;services"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shared"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;will"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tooling&lt;/strong&gt; — a new &lt;code&gt;core-admin workers blackboard purge&lt;/code&gt; command to clear stale findings when a sensor produces false positives before a fix is applied.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current State
&lt;/h2&gt;

&lt;p&gt;7 sensors active. 52 rules. 0 findings. Blackboard clean.&lt;/p&gt;

&lt;p&gt;The convergence loop is running. The daemon detects violations, the remediator dispatches fixes, the sensor confirms they're gone. That's A3.&lt;/p&gt;

&lt;p&gt;The sensor-fixer coherence check doesn't exist yet. Until it does, every new sensor I add needs manual qualification before activation. That's a human step where CORE should eventually do the work itself.&lt;/p&gt;

&lt;p&gt;Which is the point of the whole project.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CORE is open source: &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Previous posts in this series cover the constitutional model, the autonomous loop, and the ViolationExecutor implementation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>codequality</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>PASSED with 252 findings. FAILED with 78. Which audit would you trust?</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Tue, 07 Apr 2026 21:00:32 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/passed-with-252-findings-failed-with-78-which-audit-would-you-trust-1of</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/passed-with-252-findings-failed-with-78-which-audit-would-you-trust-1of</guid>
      <description>&lt;p&gt;&lt;em&gt;A story about instrument qualification, false positives, and why honest governance sometimes means failing on purpose.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The paradox
&lt;/h2&gt;

&lt;p&gt;This morning, CORE's audit system reported 252 findings and returned a verdict of &lt;strong&gt;PASSED&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This evening, it reported 78 findings and returned a verdict of &lt;strong&gt;FAILED&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nothing in production changed. No bugs were introduced. No architecture was violated.&lt;/p&gt;

&lt;p&gt;The sensors were fixed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Befr&lt;/th&gt;
&lt;th&gt;Aftr&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total findings&lt;/td&gt;
&lt;td&gt;252&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;-174&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orphan files&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modularity (blunt score)&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;needs_split&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;needs_refactor&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File size (redundant rule)&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verdict&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;honest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The FAILED verdict is the correct one. The PASSED verdict was a compliance illusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The instrument qualification problem
&lt;/h2&gt;

&lt;p&gt;In GxP-regulated environments — pharmaceutical manufacturing, medical devices, clinical software — you do not run an assay on an uncalibrated instrument and trust the result. Before any measurement is taken seriously, the instrument must be qualified: it must demonstrably measure what it claims to measure, within defined tolerances, under defined conditions.&lt;/p&gt;

&lt;p&gt;This principle is so fundamental that it precedes any discussion of the data itself. Bad data from a qualified instrument is a finding. Bad data from an unqualified instrument is noise — and acting on noise has a name: it is a deviation.&lt;/p&gt;

&lt;p&gt;Software governance systems face the same problem. An audit engine that produces findings is an instrument. If that instrument has not been qualified — if its detectors produce false positives, if its thresholds are miscalibrated, if its rules conflate distinct problem classes — then the findings it produces are not evidence. They are noise with a compliance label.&lt;/p&gt;

&lt;p&gt;Acting on that noise with automated remediation is not governance. It is confident, expensive, wrong work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Case 1: The orphan file detector
&lt;/h2&gt;

&lt;p&gt;CORE uses a static import graph traversal to detect source files unreachable from any declared entry point. The principle is sound: if no entry point can reach a file, that file is dead code and should be removed.&lt;/p&gt;

&lt;p&gt;The detector flagged 91 files as orphans.&lt;/p&gt;

&lt;p&gt;All 91 were false positives.&lt;/p&gt;

&lt;p&gt;Static import graph traversal is a deliberate choice — deterministic, auditable, no runtime dependency. The tradeoff is that dynamically-loaded components must be explicitly declared as entry points. That declaration is itself a governance artifact: it makes the implicit loading contract explicit and versioned. The detector was not wrong — the contract was incomplete.&lt;/p&gt;

&lt;p&gt;An automated agent pointed at those 91 findings would have deleted live production code. The agent would have been operating correctly within its mandate. The mandate was wrong.&lt;/p&gt;

&lt;p&gt;The fix was not to make the detector smarter. It was to declare the dynamically-loaded directories as explicit entry points — converting an implicit runtime convention into a versioned, governed contract. Functionally this resembles static linking. Constitutionally it is different: the declaration is law, subject to change control, with documented rationale. The detector enforces the contract. The contract is owned by governance, not by the build system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;entry_points&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/will/self_healing/"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/will/test_generation/"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/shared/infrastructure/"&lt;/span&gt;
  &lt;span class="c1"&gt;# ... 10 more directories&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the fix: zero orphan findings. Zero code deleted. The codebase did not change. The instrument was qualified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Case 2: The modularity score
&lt;/h2&gt;

&lt;p&gt;Four rules were producing 100 findings collectively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;modularity.single_responsibility&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modularity.semantic_cohesion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modularity.import_coupling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modularity.refactor_score_threshold&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All four were proxies for a single composite score. All four mapped to the same remediation action: &lt;code&gt;fix.modularity&lt;/code&gt;. All four carried the same enforcement level: &lt;code&gt;reporting&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The problem is that they were measuring two fundamentally different things and treating them identically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem class A: a file is too long with a single coherent responsibility.&lt;/strong&gt;&lt;br&gt;
This is a mechanical problem. The file does one thing but does too much of it. The solution is splitting — redistributing logic across smaller files along natural seams. No discipline boundaries are crossed. No architectural judgment is required. An automated system can propose and execute this split safely, subject to a Logic Conservation Gate that verifies no logic was lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem class B: a file mixes distinct architectural disciplines.&lt;/strong&gt;&lt;br&gt;
A file that combines CLI rendering, database access, and business logic in 300 lines is not a size problem. It is an architectural violation. Resolving it requires a human to decide where each responsibility belongs in the constitutional layer structure. An automated system cannot make that decision safely — not because AI is incapable of generating a proposal, but because the decision carries architectural authority that must remain with a human until the boundaries are formally established.&lt;/p&gt;

&lt;p&gt;Conflating these two problems in a single score means the governance system cannot distinguish between what it is allowed to fix autonomously and what it must escalate. That distinction is not a technical nicety. In regulated environments, it is the difference between an approved automated action and an unauthorized architectural change.&lt;/p&gt;

&lt;p&gt;The fix was to retire the four proxy rules and replace them with two precise sensors:&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"modularity.needs_split"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"enforcement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reporting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rationale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Automatable. Mechanical redistribution, no discipline boundaries crossed."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&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;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"modularity.needs_refactor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"enforcement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blocking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rationale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Requires human judgment. Autonomous action prohibited until architectural decision is approved."&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;The &lt;code&gt;blocking&lt;/code&gt; enforcement on &lt;code&gt;needs_refactor&lt;/code&gt; is the point. It is not a warning. It is a constitutional stop. The system will not proceed autonomously until a human has reviewed and authorized the architectural boundary decision.&lt;/p&gt;

&lt;p&gt;This is why the audit now returns FAILED. Twenty-seven files contain mixed-discipline violations. They are real findings. They require real decisions. The system is correctly refusing to act without authorization.&lt;/p&gt;




&lt;h2&gt;
  
  
  The verdict paradox
&lt;/h2&gt;

&lt;p&gt;A governance system that always passes is not a governance system. It is a reporting system with a green checkbox.&lt;/p&gt;

&lt;p&gt;PASSED with 252 findings meant: the system detected many things, none of them were classified as blocking, therefore no action is required. The 91 false positives contributed to a picture of busyness without actionability. The composite modularity score produced findings that the automated remediator could not distinguish from each other. Everything was flagged, nothing was escalated.&lt;/p&gt;

&lt;p&gt;FAILED with 78 findings means: the system has detected 27 architectural violations that require human decisions before any automated action proceeds. It has identified 19 files that can be split autonomously, subject to validation gates. Every finding in the report corresponds to a specific, actionable condition.&lt;/p&gt;

&lt;p&gt;The failure verdict is evidence that the governance system is functioning correctly. It is not a regression. It is an honest measurement.&lt;/p&gt;




&lt;h2&gt;
  
  
  The principle
&lt;/h2&gt;

&lt;p&gt;Governance quality is not measured by finding count. It is measured by finding accuracy.&lt;/p&gt;

&lt;p&gt;In regulated environments, the difference between a false positive acted upon and a true positive ignored is not a technical footnote. It is a compliance failure. Instrument qualification is not overhead — it is the precondition for trusting any measurement that follows.&lt;/p&gt;

&lt;p&gt;Before you ask what your audit found, ask whether your audit can be trusted.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CORE is an open-source constitutional governance runtime for AI-assisted software development. Architecture, governance rules, and enforcement mappings are public.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;github.com/DariuszNewecki/CORE&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Spent a Saturday Cleaning My Own Repo. CORE Made Me.</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Sat, 04 Apr 2026 19:42:23 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/i-spent-a-saturday-cleaning-my-own-repo-core-made-me-3pdf</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/i-spent-a-saturday-cleaning-my-own-repo-core-made-me-3pdf</guid>
      <description>&lt;p&gt;&lt;em&gt;Not because I wanted to.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because the system I built demands that everything it touches is defensible. And when I looked honestly at my own repository — the README, the docs, the &lt;code&gt;.gitignore&lt;/code&gt; — they weren't.&lt;/p&gt;

&lt;p&gt;So I fixed them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broken command nobody noticed
&lt;/h2&gt;

&lt;p&gt;It started with a README.&lt;/p&gt;

&lt;p&gt;The Quick Start section told anyone who cloned CORE to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry run core-admin check audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That command doesn't exist. The correct command is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry run core-admin code audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One word difference. But anyone who followed that instruction would get an error on their very first interaction with the project. First impression: broken.&lt;/p&gt;

&lt;p&gt;The CLI had evolved. The legacy verb-first pattern (&lt;code&gt;check audit&lt;/code&gt;) was purged months ago when CORE's command structure was redesigned around resource-first architecture. The README hadn't kept up. It was documenting a command that no longer existed.&lt;/p&gt;




&lt;h2&gt;
  
  
  "If the docs lie, the system lies."
&lt;/h2&gt;

&lt;p&gt;This is the thing about building a governance runtime: you can't enforce standards on AI-generated code while your own documentation ships broken commands.&lt;/p&gt;

&lt;p&gt;CORE's entire thesis is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Never produce software you cannot defend.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not rhetorically. Technically, legally, epistemically, historically.&lt;/p&gt;

&lt;p&gt;If I can't defend my own README — if the first thing someone tries doesn't work — then I'm not living by the standard I built into the system.&lt;/p&gt;

&lt;p&gt;That's not a philosophical problem. It's a credibility problem. And a consistency problem. And those are exactly the problems CORE exists to solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Saturday of self-governance looks like
&lt;/h2&gt;

&lt;p&gt;Here's what actually got done:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;README:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed the broken audit command (&lt;code&gt;check&lt;/code&gt; → &lt;code&gt;code&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Removed a stale metric (&lt;code&gt;0 blocking violations&lt;/code&gt;) that may or may not have been current&lt;/li&gt;
&lt;li&gt;Removed an acknowledgment that no longer reflected the project's direction&lt;/li&gt;
&lt;li&gt;Replaced a buried, collapsible workflow diagram with a cleaner conceptual flow — visible immediately, no click required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CONTRIBUTING.md:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updated the CI description (it had said "smoke testing" — it does more than that now)&lt;/li&gt;
&lt;li&gt;Added the audit command so contributors know how to verify compliance locally before opening a PR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;.gitignore:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Found that &lt;code&gt;logs/*&lt;/code&gt; was missing — only &lt;code&gt;!logs/.gitkeep&lt;/code&gt; existed, with no corresponding exclusion rule. Any non-&lt;code&gt;.log&lt;/code&gt; file landing in &lt;code&gt;logs/&lt;/code&gt; would have been tracked silently.&lt;/li&gt;
&lt;li&gt;Added proper &lt;code&gt;logs/*&lt;/code&gt; and &lt;code&gt;reports/*&lt;/code&gt; exclusions with the same pattern used for &lt;code&gt;var/&lt;/code&gt; and &lt;code&gt;work/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;docs/ — complete rewrite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The docs site had 111 files across 30 directories, most of them written at various stages of development, not reflecting current architecture&lt;/li&gt;
&lt;li&gt;I replaced all of it with six files: &lt;code&gt;index.md&lt;/code&gt;, &lt;code&gt;how-it-works.md&lt;/code&gt;, &lt;code&gt;autonomy-ladder.md&lt;/code&gt;, &lt;code&gt;getting-started.md&lt;/code&gt;, &lt;code&gt;cli-reference.md&lt;/code&gt;, &lt;code&gt;contributing.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Every CLI command in the reference was verified against the actual source code — not inferred, not remembered, not guessed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. The first draft of &lt;code&gt;cli-reference.md&lt;/code&gt; was written by an AI assistant — from inference, not from source. I caught it, pushed back, and made it search the actual command registrations before writing anything. Same standard I apply to everything else.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CLI reference problem is the whole problem in miniature
&lt;/h2&gt;

&lt;p&gt;The first draft of &lt;code&gt;cli-reference.md&lt;/code&gt; was written by an AI assistant — from inference, not from source.&lt;/p&gt;

&lt;p&gt;It had wrong subcommands. Plausible ones, but wrong.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;core-admin proposals inspect &amp;lt;id&amp;gt;&lt;/code&gt; — doesn't exist. It's &lt;code&gt;show&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;core-admin inspect status&lt;/code&gt; — legacy verb-first pattern, purged months ago. It's &lt;code&gt;core-admin admin status&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;core-admin governance coverage&lt;/code&gt; — wrong group entirely. It's &lt;code&gt;core-admin constitution status&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Three wrong commands in one file. All confident. All wrong.&lt;/p&gt;

&lt;p&gt;I caught it. Pushed back. Asked the assistant to search the actual source code before writing anything. It did. The commands got fixed.&lt;/p&gt;

&lt;p&gt;The irony was not subtle: an AI assistant producing plausible but unverified output, in documentation for a system that exists specifically to prevent AI from producing plausible but unverified output.&lt;/p&gt;

&lt;p&gt;That's not a documentation problem. That's an epistemic problem. And it's the same one that lives in &lt;code&gt;.intent/northstar/core_northstar.md&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nothing is assumed silently. All assumptions must be explicit, owned, and traceable. Reasoning requires citation. If CORE cannot point to evidence, it cannot act.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What this has to do with autonomy
&lt;/h2&gt;

&lt;p&gt;CORE is currently at A2+ — governed generation, universal workflow pattern. I'm working toward A3 — strategic autonomy, where CORE identifies and proposes architectural improvements without being asked.&lt;/p&gt;

&lt;p&gt;For A3 to be trustworthy, the system has to be clean. Not just the code — the whole project. The README someone reads before cloning. The docs they follow when getting started. The &lt;code&gt;.gitignore&lt;/code&gt; that determines what gets committed.&lt;/p&gt;

&lt;p&gt;If those are wrong, the foundation is wrong. And you can't build autonomous operation on a wrong foundation.&lt;/p&gt;

&lt;p&gt;Cleaning the repo isn't glamorous. It doesn't advance the autonomy ladder. But it's the kind of work the system's own philosophy demands — and that I'd been quietly deferring.&lt;/p&gt;




&lt;h2&gt;
  
  
  The self-referential part
&lt;/h2&gt;

&lt;p&gt;There's something almost uncomfortable about this.&lt;/p&gt;

&lt;p&gt;I built a system that enforces: &lt;em&gt;you cannot ship what you cannot defend.&lt;/em&gt; And then I had a README with a broken command, a &lt;code&gt;.gitignore&lt;/code&gt; with a missing rule, and a documentation site with 111 files of outdated content.&lt;/p&gt;

&lt;p&gt;The system couldn't enforce standards on its own repository — it doesn't govern Markdown files. That's a human responsibility.&lt;/p&gt;

&lt;p&gt;Which means the human has to do it.&lt;/p&gt;

&lt;p&gt;That's not a failure of CORE. That's the design. &lt;code&gt;.intent/&lt;/code&gt; is human-authored and immutable at runtime. CORE can never write to it. The constitution is mine to maintain.&lt;/p&gt;

&lt;p&gt;The same is true for everything outside the autonomy lanes — the README, the docs, the project presentation. CORE governs the code. I govern the rest.&lt;/p&gt;

&lt;p&gt;And today I did.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you're curious
&lt;/h2&gt;

&lt;p&gt;The repo is at &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've looked before and bounced — the docs are cleaner now. The commands in the Quick Start actually work.&lt;/p&gt;

&lt;p&gt;If you're new: read &lt;code&gt;.intent/&lt;/code&gt; before the source. That's where the law lives.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previous in this series: &lt;a href="https://dev.to/dariusz_newecki_e35b0924c/my-ai-has-22-workers-2470-resolved-violations-and-still-cant-call-itself-autonomous-heres-the-4020"&gt;My AI Has 22 Workers, 2,470 Resolved Violations, and Still Can't Call Itself Autonomous. Here's the Gap.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>codequality</category>
      <category>devjournal</category>
      <category>documentation</category>
    </item>
    <item>
      <title>The AI That Refused To Ship Its Own Fix</title>
      <dc:creator>Dariusz Newecki</dc:creator>
      <pubDate>Wed, 01 Apr 2026 18:15:43 +0000</pubDate>
      <link>https://dev.to/dariusz_newecki_e35b0924c/the-ai-that-refused-to-ship-its-own-fix-1m1</link>
      <guid>https://dev.to/dariusz_newecki_e35b0924c/the-ai-that-refused-to-ship-its-own-fix-1m1</guid>
      <description>&lt;p&gt;&lt;em&gt;Or: what constitutional governance actually looks like in practice&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I spent today doing something unusual. I was improving an AI system — and the system kept stopping me from making mistakes.&lt;/p&gt;

&lt;p&gt;Not because it was clever. Because it was governed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;CORE is a constitutional governance runtime for AI coding agents. The short version: instead of letting AI write code freely and checking quality afterwards, CORE requires every decision to be traceable to declared law before execution begins.&lt;/p&gt;

&lt;p&gt;Every rule lives in &lt;code&gt;.intent/&lt;/code&gt;. Every action requires authority. Every mutation is defensible or it doesn't happen.&lt;/p&gt;

&lt;p&gt;Today's session was about advancing CORE toward A3 — full autonomous operation on Tier 1 violations. Eight items on the A3 readiness checklist were marked ❌. By end of session: one remained.&lt;/p&gt;

&lt;p&gt;Here's what the path looked like.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gate That Wasn't Wired
&lt;/h2&gt;

&lt;p&gt;Early in the session I wanted to promote two entries in the autonomous remediation map from PENDING to ACTIVE. The Logic Conservation Gate had been implemented — a protection against AI refactors that delete more than 50% of a file's logic. The comment in the YAML said &lt;em&gt;"gated until Logic Conservation Gate implemented."&lt;/em&gt; Gate implemented. Promote.&lt;/p&gt;

&lt;p&gt;I gave Claude Code the prompt.&lt;/p&gt;

&lt;p&gt;It came back with a finding I hadn't expected:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The gate exists in ComplexityRemediationService. ModularityRemediationService — the actual handler these entries call — never touches it. The comment in the YAML is still accurate."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The gate was implemented. Just not in the right place.&lt;/p&gt;

&lt;p&gt;We wired it. Then we promoted.&lt;/p&gt;

&lt;p&gt;That's not a dramatic story. That's exactly how it should work. The system forced verification before the claim. No amount of "the gate exists somewhere" was sufficient. It had to exist &lt;em&gt;here&lt;/em&gt;, in &lt;em&gt;this path&lt;/em&gt;, or the promotion was a lie.&lt;/p&gt;




&lt;h2&gt;
  
  
  83 Silent Failures, Now Loud
&lt;/h2&gt;

&lt;p&gt;Overnight, 83 proposals failed. Each showed &lt;code&gt;execution_results: {}&lt;/code&gt; — empty. The handlers were running but returning nothing.&lt;/p&gt;

&lt;p&gt;Three months ago this would have been invisible. The handlers returned &lt;code&gt;ok=True&lt;/code&gt; unconditionally. Internal errors were swallowed. The proposal consumer would mark everything COMPLETED and move on.&lt;/p&gt;

&lt;p&gt;Yesterday we fixed that. Wrapped every handler in try/except. Derived &lt;code&gt;ok&lt;/code&gt; from actual outcomes instead of hardcoding success.&lt;/p&gt;

&lt;p&gt;So this morning: 83 failures instead of 83 false completions.&lt;/p&gt;

&lt;p&gt;That's progress. Honest failure is worth more than dishonest success. CORE's constitution says exactly this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"CORE must never produce software it cannot defend."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A system that lies about its own outcomes cannot defend them.&lt;/p&gt;




&lt;h2&gt;
  
  
  319 Stuck Findings
&lt;/h2&gt;

&lt;p&gt;The blackboard showed 319 entries in &lt;code&gt;claimed&lt;/code&gt; status. All with &lt;code&gt;claimed_by = NULL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Legacy entries — claimed before we added atomic claiming with worker identity. The fix was one SQL statement. But finding it required reading the blackboard, querying &lt;code&gt;claimed_by&lt;/code&gt;, and tracing the pattern.&lt;/p&gt;

&lt;p&gt;No amount of assuming "the system is fine" would have found this. The evidence had to be read. The constitution demands it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Memory without evidence is forbidden."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After the fix, a new batch of 319 appeared — this time with a real UUID. The worker was claiming findings, finding no handler for them in the remediation map, and leaving them stuck.&lt;/p&gt;

&lt;p&gt;Another fix: release unmappable findings immediately at claim time.&lt;/p&gt;

&lt;p&gt;Each fix revealed by the system's own honesty about its state.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes This Different
&lt;/h2&gt;

&lt;p&gt;Most AI coding tools measure success by output volume. Lines written, tickets closed, PRs merged.&lt;/p&gt;

&lt;p&gt;CORE measures success by defensibility. Can you explain why this change was made? Under what authority? With what evidence? What happens if it's wrong?&lt;/p&gt;

&lt;p&gt;Today we made 14 commits. Each traceable to a checklist item. Each verified by the system before and after. The daemon either ran clean or it didn't. The blackboard either showed stuck entries or it didn't.&lt;/p&gt;

&lt;p&gt;The AI didn't just write code. It was governed while writing code. And when the governance caught a mistake — the gate that wasn't wired, the handler that lied about success, the findings that stayed claimed forever — we fixed the governance, not just the symptom.&lt;/p&gt;

&lt;p&gt;That's the mind shift. Not &lt;em&gt;"AI writes code faster."&lt;/em&gt; But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Law governs intelligence. Defensibility outranks productivity."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;CORE is not for everyone. It's explicitly not for casual app builders or speed-only workflows.&lt;/p&gt;

&lt;p&gt;It's for regulated environments. Safety-critical systems. Teams where &lt;em&gt;"the AI decided"&lt;/em&gt; is not an acceptable answer in a post-mortem.&lt;/p&gt;

&lt;p&gt;If that's your world — the architecture is open. The constitution is public.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/DariuszNewecki/CORE" rel="noopener noreferrer"&gt;github.com/DariuszNewecki/CORE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you think in terms of governance rather than just generation — I'm looking for collaborators. Not necessarily programmers. People who understand that software systems need to be able to explain themselves.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written the same day the session happened. The daemon is running clean as I type this.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>python</category>
      <category>core</category>
    </item>
  </channel>
</rss>
