<?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: Haytham</title>
    <description>The latest articles on DEV Community by Haytham (@ythouma).</description>
    <link>https://dev.to/ythouma</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4077448%2Ffe0b9702-1ac9-471c-8067-2e79ae123a94.jpg</url>
      <title>DEV Community: Haytham</title>
      <link>https://dev.to/ythouma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ythouma"/>
    <language>en</language>
    <item>
      <title>No LLM is allowed near my compliance decisions, and CI enforces it</title>
      <dc:creator>Haytham</dc:creator>
      <pubDate>Thu, 24 Sep 2026 13:53:00 +0000</pubDate>
      <link>https://dev.to/ythouma/no-llm-is-allowed-near-my-compliance-decisions-and-ci-enforces-it-59ok</link>
      <guid>https://dev.to/ythouma/no-llm-is-allowed-near-my-compliance-decisions-and-ci-enforces-it-59ok</guid>
      <description>&lt;p&gt;I decided no LLM would go near my compliance decisions.&lt;/p&gt;

&lt;p&gt;If a tool decides whether your AI system is legal to ship, the last thing I want deciding that is another model nobody can explain.&lt;/p&gt;

&lt;p&gt;Opencomplai's rule engine (&lt;code&gt;packages/core&lt;/code&gt;) and CLI are fully deterministic. No LLM. No ML inference. Not anywhere in the compliance decision path.&lt;/p&gt;

&lt;p&gt;That's a design constraint, not a line for the landing page, and I don't just assert it. CI enforces it. Every &lt;code&gt;pyproject.toml&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt; and &lt;code&gt;requirements*.txt&lt;/code&gt; in the repo is scanned for unapproved AI/LLM packages on every PR, with excludes for tests, examples and fixtures so a demo notebook doesn't fail the build.&lt;/p&gt;

&lt;p&gt;Add a &lt;code&gt;transformers&lt;/code&gt; import to the risk engine without going through approval and the build breaks before it merges.&lt;/p&gt;

&lt;p&gt;There is an ML path. &lt;code&gt;packages/ai&lt;/code&gt; is an optional plugin with an ONNX/transformers intent classifier, plus an even more optional &lt;code&gt;[deep]&lt;/code&gt; extra for local GGUF models via llama-cpp-python. It's opt-in, sandboxed to its own package, and it never touches the pass/fail decision. It classifies free-text system descriptions. It doesn't decide whether Article 5 applies to you.&lt;/p&gt;

&lt;p&gt;I use AI every day. Last month I ran a workflow with more than 200 agents for more than 75 hours. So this isn't fear of the tool.&lt;/p&gt;

&lt;p&gt;What I'm afraid of is an audit trail that says "the model decided this was compliant." That's not an audit trail. That's a liability with extra steps.&lt;/p&gt;

&lt;p&gt;A regulator, or your own legal team, needs to trace why a system got classified high-risk down to a specific readable rule, not a probability distribution.&lt;/p&gt;

&lt;p&gt;The scanner and the full inventory are in the repo if you want to see exactly what is allow-listed and why: &lt;a href="https://github.com/Opencomplai/opencomplai" rel="noopener noreferrer"&gt;github.com/Opencomplai/opencomplai&lt;/a&gt;, &lt;code&gt;docs/security/ai-inventory.md&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What actually broke when I open-sourced my own compliance engine</title>
      <dc:creator>Haytham</dc:creator>
      <pubDate>Mon, 21 Sep 2026 17:39:44 +0000</pubDate>
      <link>https://dev.to/ythouma/what-actually-broke-when-i-open-sourced-my-own-compliance-engine-129c</link>
      <guid>https://dev.to/ythouma/what-actually-broke-when-i-open-sourced-my-own-compliance-engine-129c</guid>
      <description>&lt;p&gt;I assumed projecting my private monorepo down to a public repo was a solved problem. It wasn't, and the failures were more interesting than the feature I was shipping that week.&lt;/p&gt;

&lt;p&gt;OpenComplAI's Enterprise and Community editions live in related codebases. Every release means projecting the enterprise repo down into the public one. Strip internal packages, regenerate lockfiles, publish clean.&lt;/p&gt;

&lt;p&gt;First. Stripping a private directory out of the public projection doesn't strip it from &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; or the workspace manifest. The lockfile still listed the private package by name, full dependency graph included, in a repo that was supposed to contain none of it. Deleting a folder isn't the same as regenerating everything that referenced it.&lt;/p&gt;

&lt;p&gt;Second. My &lt;code&gt;assemble.sh&lt;/code&gt; script, built to prune the enterprise-only bits, was aggressive enough to delete the public repo's own &lt;code&gt;.github/&lt;/code&gt; directory on a re-run. CI workflows and issue templates went with it. A prune script that can't tell "generated cruft" from "the thing that makes this repo work" will eventually delete something you needed.&lt;/p&gt;

&lt;p&gt;I also shipped a &lt;code&gt;package-lock.json&lt;/code&gt; that leaked the enterprise package's internal name before review caught it, and ended up with orphaned badge SVGs pointing at workflows that no longer existed after the prune.&lt;/p&gt;

&lt;p&gt;None of these are exotic. They are what happens when "copy files, remove the private parts" is treated as a file-deletion problem instead of a full re-projection-and-verify one. Prune and regenerate, then gate on a verification pass. Not the other way around.&lt;/p&gt;

&lt;p&gt;That's the lesson, and it took me too long to see: the script that builds something can't be the one that certifies it.&lt;/p&gt;

&lt;p&gt;I added that verification pass after this round. &lt;code&gt;sync/doctor.py&lt;/code&gt; and &lt;code&gt;verify-sbom.sh&lt;/code&gt; check the projected repo's actual state. Both are in the repo if you want to see what I now consider the minimum for this kind of pipeline: &lt;a href="https://github.com/opencomplai/opencomplai" rel="noopener noreferrer"&gt;github.com/opencomplai/opencomplai&lt;/a&gt;, under &lt;code&gt;sync/&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>security</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Your hiring AI is either high-risk, or already illegal!</title>
      <dc:creator>Haytham</dc:creator>
      <pubDate>Tue, 15 Sep 2026 17:41:38 +0000</pubDate>
      <link>https://dev.to/ythouma/your-hiring-ai-is-either-high-risk-or-already-illegal-2ekh</link>
      <guid>https://dev.to/ythouma/your-hiring-ai-is-either-high-risk-or-already-illegal-2ekh</guid>
      <description>&lt;p&gt;If your recruitment AI scores a candidate's "enthusiasm" from their interview video, that's not a 2027 compliance problem. It's already illegal, and has been since February 2025.&lt;/p&gt;

&lt;p&gt;Most HR tech content lumps every AI hiring feature into one "get ready for the EU AI Act" bucket. In reality, there are two very different buckets, with two very different deadlines:&lt;/p&gt;

&lt;h2&gt;
  
  
  HIGH-RISK (Annex III(4)(a)) — Full obligations enforceable 2 December 2027
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CV and resume screening that ranks or filters applicants&lt;/li&gt;
&lt;li&gt;Video-interview platforms that score responses or delivery&lt;/li&gt;
&lt;li&gt;Psychometric and skills assessments feeding a hiring decision&lt;/li&gt;
&lt;li&gt;Sourcing and matching algorithms deciding who a recruiter even sees&lt;/li&gt;
&lt;li&gt;Programmatic job-ad targeting that decides who sees a role at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Required: documented risk assessment, technical documentation, bias testing, human oversight, disclosure to candidates, and an audit trail. Fines for failing these run up to €15M or 3% of global turnover.&lt;/p&gt;

&lt;h2&gt;
  
  
  PROHIBITED (Article 5) — Came into force since 2 February 2025
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Inferring a candidate's emotions from facial expression, voice tone, or body language (Article 5(1)(f)) — the EU AI Office's guidance explicitly extends "workplace" to the recruitment and interview stage&lt;/li&gt;
&lt;li&gt;Inferring personality traits from social media or non-work behaviour to filter candidates (Article 5(1)(c))&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no phase-in, no grace period, no documentation that makes this compliant. Fines run up to &lt;strong&gt;€35M or 7% of global turnover&lt;/strong&gt;. So if your ATS or interview platform has a "culture fit" or "engagement" score built on facial or voice analysis, it needs to come out, not get documented.&lt;/p&gt;

&lt;p&gt;Here's the part that actually matters for engineering teams building HR Tech: the difference between these two buckets often comes down to a single feature flag or a single import. The exact same candidate scoring codebase can be high-risk today and prohibited tomorrow, depending on what a new PR adds — and that's not something a compliance team reviewing quarterly is going to catch in time.&lt;/p&gt;

&lt;p&gt;That's the gap we built OpenComplAI to close: EU AI Act checks that run in your CI, on every commit, not a policy review that happens after the feature has already shipped. The same detection model that flags an unrecognised biometric import in a codebase applies the same way to an emotion-inference library landing in a candidate-scoring pipeline — caught before merge, not discovered at audit time.&lt;/p&gt;

&lt;p&gt;If you're building or buying AI hiring tools, it's worth an afternoon auditing your stack against these two lists specifically, not just "are we EU AI Act ready" in the abstract.&lt;/p&gt;

&lt;p&gt;OpenComplAI is free and open source, and still early enough that feedback from people actually working in HR tech shapes what we build next.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/opencomplai/opencomplai" rel="noopener noreferrer"&gt;https://github.com/opencomplai/opencomplai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>compliance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Treating EU AI Act Compliance as Code: A CI/CD Approach</title>
      <dc:creator>Haytham</dc:creator>
      <pubDate>Fri, 14 Aug 2026 09:38:26 +0000</pubDate>
      <link>https://dev.to/ythouma/treating-eu-ai-act-compliance-as-code-a-cicd-approach-22j0</link>
      <guid>https://dev.to/ythouma/treating-eu-ai-act-compliance-as-code-a-cicd-approach-22j0</guid>
      <description>&lt;p&gt;The EU AI Act's transparency obligations (Article 50) became enforceable on August 2, 2026. If you're shipping AI features into the EU, that's not a future date to plan around anymore, it's now.&lt;/p&gt;

&lt;p&gt;Most teams still handle this the way we handled security compliance in 2015: a spreadsheet, a legal review, and a PDF nobody opens again until the next audit. That doesn't scale, and it doesn't fit how software actually gets built and shipped continuously.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if compliance was a build step, not a document?
&lt;/h2&gt;

&lt;p&gt;That's the idea behind &lt;a href="https://github.com/opencomplai/opencomplai" rel="noopener noreferrer"&gt;OpenComplAI&lt;/a&gt;, an open-source project I've been building: EU AI Act risk classification and compliance checks that run in your pipeline, the same way you'd run a security scanner or a linter.&lt;/p&gt;

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

&lt;p&gt;The core is a deterministic, rule-based risk engine, no ML inference involved in the compliance decision itself (the dependency list is scanned in CI specifically to enforce that). It's Python underneath (Pydantic v2 for the data models, Typer/Rich for the CLI), with a small set of services behind it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Gateway API (Node/TypeScript) for request routing&lt;/li&gt;
&lt;li&gt;a Risk Engine that runs the classification logic&lt;/li&gt;
&lt;li&gt;an Evidence Vault for immutable, content-addressed audit trails&lt;/li&gt;
&lt;li&gt;a Doc Generator that produces Annex IV-format compliance dossiers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;opencomplai
opencomplai init &lt;span class="nt"&gt;--system-id&lt;/span&gt; my-model &lt;span class="nt"&gt;--intended-purpose&lt;/span&gt; &lt;span class="s2"&gt;"customer support chatbot"&lt;/span&gt;
opencomplai check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's also a zero-setup discovery mode that never fails your build, useful for figuring out where you stand before you gate anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opencomplai scan &lt;span class="nt"&gt;--quick&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a pre-commit hook if you want the check earlier than CI:&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/opencomplai/opencomplai&lt;/span&gt;
  &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v0.1.2&lt;/span&gt;
  &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;opencomplai-quick-scan&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What it actually checks
&lt;/h2&gt;

&lt;p&gt;The interactive checker (&lt;code&gt;opencomplai checker --web&lt;/code&gt;, or &lt;code&gt;--local&lt;/code&gt; for a fully offline version) walks through whether the Act applies to your system at all, and if so, whether you're a provider or a deployer, since the obligations differ substantially. From there it handles risk-tier classification (including general-purpose AI model considerations) and generates the evidence trail you'd actually need to hand to an auditor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands
&lt;/h2&gt;

&lt;p&gt;It's early. Community edition is AGPL-3.0; there's a commercial tier in the works for teams that want a hosted dashboard, SSO, and additional rule engines, but the core compliance engine is fully open.&lt;/p&gt;

&lt;p&gt;I'd genuinely value feedback from anyone who has done EU AI Act conformity work manually: what parts of that process actually generalize into rules, and what still needs a human in the loop? Issues, PRs, and just general "here's what we ran into" reports are all welcome.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/opencomplai/opencomplai" rel="noopener noreferrer"&gt;https://github.com/opencomplai/opencomplai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>compliance</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
