<?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: Arif Kurnaz</title>
    <description>The latest articles on DEV Community by Arif Kurnaz (@arifkurnaz).</description>
    <link>https://dev.to/arifkurnaz</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%2F4019981%2F021bb17e-1333-4c76-b185-db1eac85db59.jpeg</url>
      <title>DEV Community: Arif Kurnaz</title>
      <link>https://dev.to/arifkurnaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arifkurnaz"/>
    <language>en</language>
    <item>
      <title>Attestkeep 1.0 is out, and three readers changed it before it shipped</title>
      <dc:creator>Arif Kurnaz</dc:creator>
      <pubDate>Sun, 06 Sep 2026 10:52:38 +0000</pubDate>
      <link>https://dev.to/arifkurnaz/attestkeep-10-is-out-and-the-comment-thread-is-in-the-changelog-m44</link>
      <guid>https://dev.to/arifkurnaz/attestkeep-10-is-out-and-the-comment-thread-is-in-the-changelog-m44</guid>
      <description>&lt;p&gt;Six days ago I posted &lt;a href="https://dev.to/arifkurnaz/soc-2-cra-nis2-they-all-ask-your-cluster-the-same-five-questions-4169"&gt;SOC 2, CRA, NIS2: they all ask your cluster the same five questions&lt;/a&gt;. I expected a few reactions. What I got was three people reading the mechanism instead of the claims, and two of them found a hole that mattered.&lt;/p&gt;

&lt;p&gt;Today the tool behind that post reached 1.0. Most of what changed between the post and the release came out of that thread, and it would be strange to write a release post that pretends otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://attestkeep.com" rel="noopener noreferrer"&gt;Attestkeep&lt;/a&gt; is a validating admission webhook for Kubernetes with a scanner behind it. Every pod CREATE and UPDATE outside a short list of bypass namespaces is reviewed against a policy: the &lt;code&gt;:latest&lt;/code&gt; tag, a registry allow-list, digest pinning, vulnerability thresholds from the last scan, cosign signatures and attestations, and fifteen workload hardening checks (privileged containers, hostPath mounts and their relatives). Every decision, allowed or refused, is written to a ledger under the content hash of the policy that made it. When a period has gone by, you pick a framework and the ledger becomes a signed evidence package with citations, statuses and named gaps. That last part is what the previous post was about. This one is about what shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the comments changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vinh Nguyen&lt;/strong&gt; pointed out that a ledger of admission decisions is evidence about boundary crossings, not about the population. Whatever entered while the webhook was down, or before it was installed, is still running and has no row. So the control grew a second half. An hourly sweep reads every running container's observed &lt;code&gt;imageID&lt;/code&gt;, not the spec's image reference, which under a mutable tag still matches its original admission event while the bytes underneath have changed, and reconciles the digest against the ledger. A digest with no admission behind it lands in the evidence package as its own &lt;code&gt;population&lt;/code&gt; section. The policy decides what a finding does: recorded, announced, or the pod is stopped so its controller recreates it through the webhook, onto the ledger this time.&lt;/p&gt;

&lt;p&gt;Then he read the mechanism again and found the destructive case. A pod applied by hand has no controller, so stopping it closes the finding by deleting its subject: no denial, no admission, an absence where an unverified workload used to be. Static pods fail from the other end, because the kubelet rebuilds the mirror without going near admission, so enforcement loops without ever producing an event. Both are now reported and left running, in the same bucket as side-loaded images, marked &lt;code&gt;unmanaged&lt;/code&gt;, with one line per sweep saying the sweep found something only a person can decide. That was 0.3.3 and it is in 1.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tobias&lt;/strong&gt; asked whether ran-and-found-nothing is recorded as evidence, or only findings. Admission is the easy half: every review writes a row, including "allowed, nothing wrong". The quiet week is the hard half, and the answer is that the operator keeps re-verifying its own webhook endpoint against the CA bundle it published to the API server, records any window in which that check fails, and prints those windows in the evidence package as outages against the period. What I conceded then still holds today: the absence alert, an &lt;code&gt;absent()&lt;/code&gt; over the &lt;code&gt;attestkeep_*&lt;/code&gt; series, is a few lines in your Prometheus and not a toggle in ours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kane Lim&lt;/strong&gt; listed what a decision record should reference. The row today carries the namespace, the pod, the image reference and its digest, the verdict and its reason, whether the scan result was cached, the policy name and the policy's content hash, and whether break-glass was active. The workload's service account is still not on it. That is a fair gap and it is still open.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 1.0 means
&lt;/h2&gt;

&lt;p&gt;1.0.0 is the 0.3.6 line declared stable. Nothing about an installed policy, licence or evidence document changes on upgrade.&lt;/p&gt;

&lt;p&gt;Since the first post the ledger became tamper-evident. Every decision is content-hashed when it is written, and the operator periodically seals the ledger with signed checkpoints: each carries the Merkle root of the records in its range and chains to the previous checkpoint's hash. The signing key is generated into a Kubernetes Secret and never stored in PostgreSQL, so rewriting ledger rows and re-signing the seals require two different accesses. The evidence package states whether the record set verifies and names the exact records and seals that do not. Where the guarantees end is written down on the &lt;a href="https://docs.attestkeep.com/evidence-trust/" rel="noopener noreferrer"&gt;evidence trust model&lt;/a&gt; page, including the part where &lt;code&gt;generated_at&lt;/code&gt; is still an assertion by the signer and not a trusted clock.&lt;/p&gt;

&lt;p&gt;Two decisions in 1.0 itself are about posture rather than features, so they get a paragraph each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;admissionTiming&lt;/code&gt;.&lt;/strong&gt; A digest nobody has scanned has no result yet. Scanning takes minutes and the API server waits seconds, so the gate never scans inline; the scanner fills a cache in the background and admission reads the cache. The policy chooses what happens to the unknown: &lt;code&gt;AllowAndScan&lt;/code&gt;, the default, admits it, queues the scan and decides on every later admission of that digest; &lt;code&gt;DenyUntilScanned&lt;/code&gt; refuses it with "a scan has been queued, retry shortly" until the report exists. In 0.3.x a Community policy that set the second one was silently treated as the first. From 1.0 it is honoured in every edition, because the rule is now written down: policy behaviour is never gated by licence, only capacity is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;failurePolicy&lt;/code&gt;.&lt;/strong&gt; The webhook ships with &lt;code&gt;Ignore&lt;/code&gt;. While it is unreachable, pods are admitted unreviewed. The console used to paint that amber, which nagged everyone towards a fail-closed posture they had not chosen. Now it explains the trade: the window is recorded for your evidence, the hourly sweep reviews what came in, and &lt;code&gt;webhook.failurePolicy: Fail&lt;/code&gt; is one Helm value away if you want a gate that holds while the operator is down. Neither value is universally right. The point is that the choice is yours and the consequence is on the record either way.&lt;/p&gt;

&lt;p&gt;And one thing that was plainly a bug. Every operator replica used to run the daily licence check two minutes after its own start, so a rolling restart or two spent the day's allowance and the pods logged a refusal they could not act on. It is now one call a day per cluster, however many pods run and however often they restart; the check time is kept in the operator's database and shared by all replicas. Enforcement never depended on it: the certificate a cluster holds keeps working for its thirty-day term.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a key buys, and what it does not
&lt;/h2&gt;

&lt;p&gt;Every security feature is in the free Community edition: scanning, signature and attestation verification, admission enforcement, the sweep, the sealed ledger, evidence packages, deny-until-scanned, fail-closed. A community edition with the security removed would deserve to lose to the free tools. What a paid key buys is capacity, and single sign-on.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Community&lt;/th&gt;
&lt;th&gt;Team&lt;/th&gt;
&lt;th&gt;Business&lt;/th&gt;
&lt;th&gt;Enterprise&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clusters per key&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance frameworks&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;all eight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image names a month&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;sized to your estate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single sign-on (OIDC)&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;free, forever&lt;/td&gt;
&lt;td&gt;$480 a month, or $4,800 a year&lt;/td&gt;
&lt;td&gt;$1,440 a month, or $14,400 a year&lt;/td&gt;
&lt;td&gt;$3,000 a month, or $30,000 a year&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prices exclude VAT. Checkout runs on Polar as merchant of record, so the card never reaches our servers. There is no time-limited trial because there is no need for one: Community never expires, and the question a trial usually answers, does this work on my cluster, is one you can answer on your own cluster for as long as you like. Any charge can be refunded within 14 days, for any reason.&lt;/p&gt;

&lt;p&gt;For the launch, the code &lt;code&gt;LAUNCH20&lt;/code&gt; takes 20% off the first invoice until 6 October 2026: a month if you pay monthly, the whole first year if you pay yearly.&lt;/p&gt;

&lt;p&gt;What leaves your cluster: once a day, a licence identifier, a hash of the &lt;code&gt;kube-system&lt;/code&gt; namespace UID, and the operator version. Nothing about your images. The scanner reads your registry, the operator writes to your PostgreSQL, and no agent registers with us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it, then watch it refuse something
&lt;/h2&gt;

&lt;p&gt;One Helm command. The chart pulls from the registry, there is no repository to add.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;attestkeep oci://ghcr.io/attestkeep/charts/attestkeep &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; attestkeep &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;clusterName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;trial &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--wait&lt;/span&gt;

kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; attestkeep port-forward svc/attestkeep 8080:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The console asks for a licence key on first run; the free one comes from an account at attestkeep.com and never expires. Then create the owner account and you land on the overview.&lt;/p&gt;

&lt;p&gt;An admission webhook that is silently not running looks exactly like a compliant cluster, so the first thing to do after installing any gate is to watch it refuse something. With the default policy the smallest violation is the &lt;code&gt;:latest&lt;/code&gt; tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl run enforcement-check --image=nginx:latest
Error from server: admission webhook "image-security.attestkeep.com" denied the request:
image security policy: nginx:latest: the :latest tag is blocked by policy

$ kubectl get pod enforcement-check
Error from server (NotFound): pods "enforcement-check" not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The error comes from &lt;em&gt;Error from server&lt;/em&gt;, meaning the deny happened inside the API server's admission chain and not in an agent that might have been asleep. If the pod was created instead, check in order: a bypassed namespace, a policy in audit mode, a webhook that is failing open, an installation that was never activated.&lt;/p&gt;

&lt;p&gt;Kubernetes 1.27 or later, amd64 and arm64. Every release image is signed twice on the same digest: keyless through GitHub's OIDC, which proves the digest was built by the release workflow on that tag, and keyed against &lt;code&gt;cosign.pub&lt;/code&gt; at &lt;a href="https://docs.attestkeep.com/cosign.pub" rel="noopener noreferrer"&gt;docs.attestkeep.com/cosign.pub&lt;/a&gt;, which verifies with nothing beyond your registry and exists for air-gapped clusters. Verify the digest, not the tag. It is the same argument the product makes to your own cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it still does not do
&lt;/h2&gt;

&lt;p&gt;Being straight about the limits, again, since the whole pitch is honest gaps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The compliance mappings have not been through legal or audit review. They are a careful reading of the published texts, with citations included so a professional can check the work rather than trust it.&lt;/li&gt;
&lt;li&gt;Nothing binds a report to a trusted clock.&lt;/li&gt;
&lt;li&gt;It answers admission time and rescan time. It does not watch behaviour at runtime, and it does not do eBPF. If a container starts doing something odd at three in the morning, that is somebody else's product.&lt;/li&gt;
&lt;li&gt;One installation is one cluster's view. Five clusters on Enterprise are five consoles. A fleet view is on the roadmap without a date attached, because I would rather say that than name a release I might miss.&lt;/li&gt;
&lt;li&gt;It is self-hosted and closed source. Every claim above is checkable from inside your cluster, and the &lt;a href="https://github.com/attestkeep/attestkeep-docs/issues" rel="noopener noreferrer"&gt;issue tracker&lt;/a&gt; is public, but you cannot read the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you read the last post and left a comment, some of this is yours. If you install it and it refuses something it should not have, or admits something it should not have, that is the comment I want.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://attestkeep.com" rel="noopener noreferrer"&gt;Attestkeep&lt;/a&gt;, a Kubernetes admission controller with compliance evidence built in. The release notes for 1.0.0 and 1.0.1 are on the &lt;a href="https://docs.attestkeep.com/releases/" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>security</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
    <item>
      <title>SOC 2, CRA, NIS2: they all ask your cluster the same five questions</title>
      <dc:creator>Arif Kurnaz</dc:creator>
      <pubDate>Mon, 31 Aug 2026 12:52:22 +0000</pubDate>
      <link>https://dev.to/arifkurnaz/soc-2-cra-nis2-they-all-ask-your-cluster-the-same-five-questions-4169</link>
      <guid>https://dev.to/arifkurnaz/soc-2-cra-nis2-they-all-ask-your-cluster-the-same-five-questions-4169</guid>
      <description>&lt;p&gt;In eleven days, on 11 September 2026, the reporting obligations of the EU Cyber Resilience Act start applying to anyone who puts a product with digital elements on the European market. Not the full regulation. Just the part where, if you find out an actively exploited vulnerability is in your product, you have 24 hours to tell ENISA about it.&lt;/p&gt;

&lt;p&gt;I have watched a lot of engineering teams meet this class of deadline for the first time. It usually goes the same way. Somebody in sales gets a security questionnaire. Somebody in engineering gets forwarded the questionnaire. Three weeks later there is a shared folder called &lt;code&gt;evidence-final-v3&lt;/code&gt; with 200 screenshots in it, and nobody can tell you which screenshot answers which question.&lt;/p&gt;

&lt;p&gt;I have spent the last several months building a tool whose entire job is that folder, so I read the instruments properly. This is what I found out. It is written for engineers, not for a compliance team, and I try to be specific about what the text says rather than what a vendor blog says it says.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where SOC 2 came from, and why that still shapes it
&lt;/h2&gt;

&lt;p&gt;SOC 2 exists because of a misuse.&lt;/p&gt;

&lt;p&gt;In 1992 the AICPA published SAS 70, an auditing standard for service organisations. Its purpose was narrow: if you outsourced your payroll, your auditor needed some assurance that your payroll provider's internal controls did not corrupt your financial statements. It was an accounting instrument, for accountants, about financial reporting.&lt;/p&gt;

&lt;p&gt;Then the industry outsourced everything else. By the mid-2000s companies were sending their customer data to service providers, and they wanted assurance about &lt;em&gt;that&lt;/em&gt;, not about financial reporting. There was nothing designed for it, so they asked for the thing that existed. Vendors started waving SAS 70 reports around as proof they were secure. They were not proof of that. SAS 70 had no defined control set at all: the service organisation wrote its own control objectives, and the auditor tested against whatever had been written. Two SAS 70 reports could have nothing in common.&lt;/p&gt;

&lt;p&gt;In 2010 the AICPA split the thing in half. Financial reporting controls stayed, renamed SOC 1 under SSAE 16 (SSAE 18 since 2017). The security question got its own report: SOC 2, with an actual defined set of criteria behind it.&lt;/p&gt;

&lt;p&gt;That history is worth carrying, because SOC 2 still has SAS 70's shape in one important respect. It defines &lt;em&gt;criteria&lt;/em&gt;, not controls. It tells you what has to be true. It does not tell you how. More on that in a moment, because it is the single most common misunderstanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type I and Type II
&lt;/h2&gt;

&lt;p&gt;Two report types, and the difference is most of the value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type I&lt;/strong&gt; is a point in time. An auditor looks at your controls on one date and gives an opinion on whether they are suitably designed. It answers: do you have the right things in place?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type II&lt;/strong&gt; covers a period, typically 3 to 12 months, with 6 being the usual choice for a first report. The auditor gives an opinion on whether the controls were suitably designed &lt;em&gt;and operated effectively throughout that period&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A Type I says you built the fence. A Type II says the fence was standing every day for six months.&lt;/p&gt;

&lt;p&gt;Almost every buyer who asks for SOC 2 means Type II, or will mean it at renewal. And it matters enormously to how you should think about evidence, because "operated effectively throughout the period" is not a thing you can produce at the end. The auditor samples across the whole window. If your quarterly access review was supposed to run four times and it ran once, in the week before fieldwork, that is an exception in your report and everybody reading it can see it.&lt;/p&gt;

&lt;p&gt;That property, that the evidence must have existed continuously rather than being assembled afterwards, is the one I would burn into a wall. It is what makes screenshot folders a bad answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five criteria, and the four you probably do not need
&lt;/h2&gt;

&lt;p&gt;SOC 2 is built on the Trust Services Criteria (AICPA TSP section 100, 2017, revised 2022). Five categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — the Common Criteria, CC1 to CC9. Mandatory. Every SOC 2 includes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability&lt;/strong&gt; — is the system up when you said it would be&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidentiality&lt;/strong&gt; — is information designated confidential protected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing Integrity&lt;/strong&gt; — is processing complete, valid, accurate, timely, authorised&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — personal information handled per your notice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only Security is required. You choose the rest, and you should choose as few as you can defend, because each one is more scope, more testing, more cost. Most infrastructure and SaaS companies do Security, or Security plus Availability. Add Confidentiality if your contracts talk about it. Processing Integrity is genuinely rare and mostly belongs to payments and payroll.&lt;/p&gt;

&lt;p&gt;Inside the Common Criteria, the ones an engineer actually touches:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Roughly&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CC1–CC3&lt;/td&gt;
&lt;td&gt;Governance, communication, risk assessment. Mostly organisational.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC4&lt;/td&gt;
&lt;td&gt;Monitoring: do you check your own controls are present and functioning?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC5&lt;/td&gt;
&lt;td&gt;Control activities.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC6&lt;/td&gt;
&lt;td&gt;Logical and physical access. Who can reach what, and how you keep the outside out.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC7&lt;/td&gt;
&lt;td&gt;System operations. Detecting vulnerabilities and configuration drift, spotting anomalies, handling incidents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC8&lt;/td&gt;
&lt;td&gt;Change management. Nothing untested or unauthorised reaches production.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC9&lt;/td&gt;
&lt;td&gt;Risk mitigation, including vendor and third-party risk.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you run containers on Kubernetes, most of your technical evidence lands in CC6, CC7 and CC8. CC6.8 is the one people miss: &lt;em&gt;"the entity implements controls to prevent or detect and act upon the introduction of unauthorized or malicious software."&lt;/em&gt; That is your image supply chain, stated in 2017 language.&lt;/p&gt;

&lt;h2&gt;
  
  
  SOC 2 does not tell you what to do
&lt;/h2&gt;

&lt;p&gt;This is the part that catches teams out.&lt;/p&gt;

&lt;p&gt;There is no SOC 2 control list. There is no "you must scan images" clause. The criteria are outcome statements, and &lt;em&gt;you&lt;/em&gt; define the controls that meet them, and then the auditor tests the controls &lt;em&gt;you&lt;/em&gt; defined. You write a control saying "all container images are scanned before deployment and images with critical vulnerabilities are blocked", and now you are on the hook to prove that happened every day of the period.&lt;/p&gt;

&lt;p&gt;This cuts both ways. The freedom is real: you are not forced into somebody else's architecture. The trap is also real, and it is that a weak control, written vaguely, passes the audit while protecting nothing. "We use industry standard scanning tools" is a sentence that can be true while your cluster runs whatever anybody pushes.&lt;/p&gt;

&lt;p&gt;The auditor is not there to tell you the control is weak. They are there to test whether it operated as described.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other instruments, and their clocks
&lt;/h2&gt;

&lt;p&gt;SOC 2 is voluntary and market-driven; you do it because a customer asked. Most of what arrived after it is not voluntary. Here is the landscape as it stands at the end of August 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EU Cyber Resilience Act&lt;/strong&gt; — Regulation (EU) 2024/2847. Applies to products with digital elements sold in the EU, which for most of us means the software itself. Three dates: conformity assessment bodies from 11 June 2026 (passed), vulnerability and incident reporting from &lt;strong&gt;11 September 2026&lt;/strong&gt; (eleven days away), and the substantive obligations, including technical documentation and the SBOM requirement, from &lt;strong&gt;11 December 2027&lt;/strong&gt;. Annex I Part II point 1 is the SBOM clause: components documented in a commonly used machine-readable format, covering at least the top-level dependencies. You do not have to publish it. You do have to have it and hand it over when a market surveillance authority asks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2&lt;/strong&gt; — Directive (EU) 2022/2555. Applies to entities in essential and important sectors, and reaches software vendors indirectly, forcefully, through Article 21(2), which names supply chain security and requires covered entities to consider the security practices of their direct suppliers. That is why NIS2-derived questionnaires arrive at companies that are not themselves in scope. Being a supplier to somebody in scope is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DORA&lt;/strong&gt; — Regulation (EU) 2022/2554, in force since 17 January 2025 for EU financial entities and the ICT providers serving them. Chapter V Article 28 is the third-party risk chapter, and it has teeth in a way NIS2 does not, including audit rights written into contracts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ISO/IEC 27001:2022&lt;/strong&gt; — certification rather than a report. Buyers outside the US often prefer it. Annex A control 8.8 (technical vulnerabilities), 8.25 through 8.31 (secure development, separation of environments) are the ones your pipeline touches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIST&lt;/strong&gt; — SP 800-190 for container security specifically, SP 800-218 (SSDF) for secure development, SP 800-53 Rev. 5 for the full federal control catalogue. Not law unless you sell to the US government, but the language is precise and much of the rest of the world quotes it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDPR Article 32&lt;/strong&gt; — security of processing. Short, general, and still the clause that turns a container escape into a regulatory event if personal data was on the other side of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  They are all asking the same five questions
&lt;/h2&gt;

&lt;p&gt;Here is the thing I did not expect when I started reading these side by side. The instruments are written by different bodies, in different decades, for different legal systems, and underneath they converge hard.&lt;/p&gt;

&lt;p&gt;CRA Annex I Part I (3)(g), on availability and resilience of essential functions, and SOC 2 A1.2 both turn on outages and what the system does when a component fails. CRA (3)(c) on access control and CC6.1 both turn on hardening and federated access. CRA (3)(k) on recording and monitoring activity and CC7.2 both turn on the audit trail. DORA Article 9's protection and prevention requirements land in the same place as CC6.8.&lt;/p&gt;

&lt;p&gt;For a workload running in a cluster, strip away the citations and every one of them is asking:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is running?&lt;/strong&gt; An inventory. Not "what did we deploy", what is &lt;em&gt;actually admitted right now&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where did it come from?&lt;/strong&gt; Provenance. A signature, an identifiable registry, a build you can point at.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is wrong with it?&lt;/strong&gt; Known vulnerabilities, against a database that was current at the time of the check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who allowed the exceptions?&lt;/strong&gt; Because there are always exceptions. An unrecorded exception is indistinguishable from a control failure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can you prove all of the above for a period you did not choose in advance?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Question 5 is the one tools get wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good evidence looks like
&lt;/h2&gt;

&lt;p&gt;Most compliance tooling is built to produce a dashboard. A dashboard tells you the state now. An auditor is not asking about now, they are asking about February.&lt;/p&gt;

&lt;p&gt;Working backwards from what a Type II sampling exercise actually needs, evidence has to carry five properties:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A period, stated on the document.&lt;/strong&gt; Not "generated today", but "covers 1 February to 31 July, and here is what happened in that window."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provenance of the evidence itself.&lt;/strong&gt; Who generated it, from which system, at what version. A compliance mapping is an interpretation, and interpretations change as you read a framework more carefully. Evidence that does not record which reading it used cannot be re-examined later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrity.&lt;/strong&gt; A PDF is a suggestion. Anybody can edit a PDF. If the document that goes to the auditor is not cryptographically bound to the bytes that were generated, then the strongest statement you can make about it is "someone in our company typed this."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Citation, not paraphrase.&lt;/strong&gt; Every claim should name the clause it answers, quoted close to the instrument's own words. Auditors read the criterion, not your marketing vocabulary. If your report says "we are compliant with CC7.1" without restating what CC7.1 asks, you have made the reader do a lookup, and made yourself impossible to check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest gaps.&lt;/strong&gt; This is the one I care most about. A container security tool can evidence maybe a third of NIS2 Article 21. The rest is staff training, disclosure policies, reporting to a national CSIRT, business continuity. A report that quietly maps a feature list onto the other two thirds is worse than no report at all, because it tells an organisation a duty is discharged when nobody has done it. Anything that comes back all green is lying to you, and the lie is expensive precisely when it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the admission controller is the right place to stand
&lt;/h2&gt;

&lt;p&gt;For the Kubernetes-specific part of this: scanning in CI is necessary and insufficient.&lt;/p&gt;

&lt;p&gt;CI scanning proves you scanned an image. It does not prove that only scanned images ran. Those are different claims and the second is the one CC6.8 asks for. Between the pipeline and the cluster there is a gap wide enough to drive a &lt;code&gt;kubectl apply&lt;/code&gt; through: a manually applied manifest, a Helm chart from a vendor, a sidecar injected by a mesh, a &lt;code&gt;latest&lt;/code&gt; tag that resolved to something different this morning than it did last week.&lt;/p&gt;

&lt;p&gt;The admission webhook is the last point where the answer to "may this run" is still no. It is also the only point where a record of the decision is a record of what actually entered the cluster, rather than a record of intent. Every admission review is a dated, attributable event: this digest, this policy, admitted or refused, at this moment. That is the raw material a Type II sample is made of, and it accumulates whether or not anybody remembers to collect it.&lt;/p&gt;

&lt;p&gt;That property, evidence that exists because the control ran and not because somebody prepared for an audit, is the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we built this into Attestkeep
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://attestkeep.com" rel="noopener noreferrer"&gt;Attestkeep&lt;/a&gt; is a Kubernetes admission controller that scans images, verifies signatures and attestations, and enforces policy at admission. That part is not novel and I would not write a post about it. The part I want to describe is what happens after six months of it running.&lt;/p&gt;

&lt;p&gt;You pick a period and a framework. It generates a report against eight of them: SOC 2, EU CRA + NIS2, DORA, NIST SP 800-190, SSDF, SP 800-53 Rev. 5, ISO 27001, and GDPR Article 32. Every requirement in the report carries its citation, the obligation restated close to the instrument's own words, a status, and a note written in the period's own numbers.&lt;/p&gt;

&lt;p&gt;There are four statuses, and the fourth is the reason I am writing this section:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;met&lt;/code&gt; — the control operates and the records show it operating&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;partial&lt;/code&gt; — it operates but something narrows what it proves: a permissive failure policy, audit-only mode, an exemption&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gap&lt;/code&gt; — squarely within what this thing can enforce, and the records say it is not being enforced&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;outside_scope&lt;/code&gt; — a duty of the organisation, not a property of a cluster. Named rather than omitted, so the reader can see where the document's coverage ends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an unedited fragment from a real 30-day report generated against a demo cluster:&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;"CC4.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"citation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CC4.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Evaluations to ascertain that controls are present and functioning"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"asks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The entity selects, develops, and performs ongoing and/or separate evaluations to ascertain whether the components of internal control are present and functioning."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"met"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"the control's operation is measured continuously rather than sampled: 293 reviews, 31 admitted, 262 refused, and 3 windows in which it was not operating"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"admission"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"availability"&lt;/span&gt;&lt;span class="p"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and, from the same report, one that did not pass:&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;"CC6.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"citation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CC6.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"no registry allow-list is in force, so an image may be pulled from any registry the node can reach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"control_statement.allowed_registries"&lt;/span&gt;&lt;span class="p"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The summary for that period was 3 met, 6 partial, 2 gap, 2 outside scope. That is a demo cluster with a loose policy, and the report says so. I would rather ship a tool that tells you that in August than one that tells you everything is fine and lets an auditor find it in February.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;evidence&lt;/code&gt; field is a pointer into the sections of the same document that carry the underlying numbers, so a reader can check the claim rather than accept the note.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrity.&lt;/strong&gt; The report is signed with Ed25519 into a DSSE envelope carrying an in-toto Statement v1. The signature covers &lt;code&gt;report.json&lt;/code&gt; and nothing else. The subject is the report's SHA-256, so the signature binds to the exact bytes, and any copy of those bytes can be checked against it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the auditor receives&lt;/strong&gt; is a zip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;README.txt          what is signed, and three ways to check it
report.json         the evidence. these exact bytes are what is signed
attestation.json    DSSE envelope, in-toto Statement v1
certificate.jwt     the public half of the signing key, signed by us
&amp;lt;id&amp;gt;.pdf            a readable rendering. convenience only, carries no signature
&amp;lt;id&amp;gt;.attestkeep.json  all of the above in one file, for single-file verifiers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The README is always in English, whatever language the console is set to, because an auditor's file gets read in places you cannot predict. It states plainly that if the PDF and &lt;code&gt;report.json&lt;/code&gt; ever disagree, &lt;code&gt;report.json&lt;/code&gt; is the record and the PDF is wrong. Verification works three ways: a browser page that runs entirely client-side and uploads nothing, a Python script with no dependencies, or &lt;code&gt;cosign&lt;/code&gt; if you already have it. The archive is byte-for-byte reproducible: the zip entry timestamps come from the report's own generation time rather than the clock, so two people downloading the same package get the same file.&lt;/p&gt;

&lt;p&gt;And the scope statement, which is printed at the top of every SOC 2 report we produce:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is evidence for an audit, not an audit: only a service auditor issues an opinion, and only the entity defines its own system boundary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I put that there because I have seen what the alternative does to people. A tool cannot make you compliant. It can make the day the auditor asks a boring one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;Being straight about the limits, since I just spent 400 words demanding honest gaps from everybody else.&lt;/p&gt;

&lt;p&gt;The compliance mappings have not been through legal or audit review. They are my careful reading of published texts, with citations included specifically so a professional can check my work rather than trust it. The NIST SP 800-190 citations were corrected once already, when I went back and compared them against the published guidance instead of my notes.&lt;/p&gt;

&lt;p&gt;Nothing here binds a report to a trusted clock. &lt;code&gt;generated_at&lt;/code&gt; is an assertion by the signer, not proof. If you need trusted timestamping, you need it from somewhere else, and the predicate says so in a comment rather than hiding it.&lt;/p&gt;

&lt;p&gt;And the honest scope line applies to me too: one cluster's admission control answers part of SOC 2 and a smaller part of NIS2. It does not answer your access reviews, your onboarding, your incident response drills, or your vendor register.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you take one thing
&lt;/h2&gt;

&lt;p&gt;Whatever you use, and it does not have to be mine, make the evidence a byproduct of the control operating rather than a project you run before an audit. The frameworks converge on this even where their words differ. SOC 2 Type II wants the whole period. CRA wants technical documentation that was maintained, not assembled. DORA wants an audit right that is meaningful when exercised without notice.&lt;/p&gt;

&lt;p&gt;Update (September 2026). Vinh Nguyen pointed out in the comments that questions 1 and 5 come apart exactly where this article admits they might: the admission ledger records honestly when the control was not operating, but nothing in it says what crossed during those windows — or what predates the install, or what walked in under failurePolicy: Ignore. Whatever did is still running long after the window closed, and a ledger of boundary crossings has no row for it.&lt;/p&gt;

&lt;p&gt;He was right, so the control grew a second half. A periodic sweep now reads every running container's observed imageID — not the spec's image reference, which under a mutable tag still matches its original admission event while the bytes underneath have changed — and reconciles each digest against the admission ledger. A running digest with no allowed admission event behind it lands in the evidence package as its own population section, right next to the availability section it completes: the document that admitted the two questions come apart now stitches them back together. Policy decides what a finding does — recorded, announced, or the pod is stopped so its controller recreates it through the webhook, onto the ledger this time. The details, including the honest edges (out-of-scope namespaces, side-loaded images with no registry digest, truncated lists that say so), are in the comment thread below.&lt;/p&gt;

&lt;p&gt;Evidence you can only produce by preparing for the question is not evidence that the control was working. It is evidence that you can prepare.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://attestkeep.com" rel="noopener noreferrer"&gt;Attestkeep&lt;/a&gt;, a Kubernetes admission controller with compliance evidence built in. It is early. If you have been through a Type II with containers in scope and something above is wrong, I would genuinely like to hear it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Ternary Semantic Brain Core — Zero Hard-Coding, Language-Independent Meaning Engine</title>
      <dc:creator>Arif Kurnaz</dc:creator>
      <pubDate>Tue, 07 Jul 2026 17:29:01 +0000</pubDate>
      <link>https://dev.to/arifkurnaz/ternary-semantic-brain-core-zero-hard-coding-language-independent-meaning-engine-30pe</link>
      <guid>https://dev.to/arifkurnaz/ternary-semantic-brain-core-zero-hard-coding-language-independent-meaning-engine-30pe</guid>
      <description>&lt;h1&gt;
  
  
  Ternary Semantic Brain Core — Zero Hard-Coding, Language-Independent Meaning Engine
&lt;/h1&gt;

&lt;p&gt;I built a meaning-learning engine that works without LLMs, embeddings, or&lt;br&gt;
translation tables. Everything is stored as 2-bit ternary values {-1, 0, +1}.&lt;br&gt;
It learns meaning purely from word co-occurrence in plain text.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it different
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No hard-coded linguistic knowledge.&lt;/strong&gt; No stoplists, POS tags, tokenizer,&lt;br&gt;
fixed vocabulary, or translation tables. All linguistic structure emerges&lt;br&gt;
from training data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language-independent.&lt;/strong&gt; Tested with English + Turkish. Same mechanism&lt;br&gt;
works for any language with letter-based writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ternary representation.&lt;/strong&gt; {-1, 0, +1} — inhibition, unknown, excitation.&lt;br&gt;
&lt;code&gt;0&lt;/code&gt; means "I don't know" — a first-class answer, not a failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single decision rule.&lt;/strong&gt; All thresholds come from each word's own&lt;br&gt;
distribution. No hyperparameter tuning. (We call it "golden ratio freeze"&lt;br&gt;
— referring to structural convergence, not φ = 1.618.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emergent morphology.&lt;/strong&gt; After EN+TR dictionary training: 247 suffixes and&lt;br&gt;
38 prefixes discovered automatically with zero linguistic rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-language bridge.&lt;/strong&gt; Without being told "water = su," the brain&lt;br&gt;
forms bridges between equivalent concepts across languages. After 65 books:&lt;br&gt;
average Jaccard 0.47, cosine 0.61 across 10 EN-TR word pairs.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Start with an empty brain&lt;/li&gt;
&lt;li&gt;Train with monolingual dictionaries (word → definition)&lt;/li&gt;
&lt;li&gt;Optionally add books/articles for richer meaning&lt;/li&gt;
&lt;li&gt;Query: &lt;code&gt;/compare water su&lt;/code&gt;, &lt;code&gt;/map fire&lt;/code&gt;, &lt;code&gt;/senses storm&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The brain builds a sparse graph of word relationships. Multi-meaning words&lt;br&gt;
split into separate sense layers automatically. Meaning groups emerge from&lt;br&gt;
community detection on the neighbor graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Concept neurons&lt;/td&gt;
&lt;td&gt;Each word is a neuron with sparse ternary signature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentence neurons&lt;/td&gt;
&lt;td&gt;Sentences become neurons linking words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synapse graph&lt;/td&gt;
&lt;td&gt;PMI-weighted co-occurrence connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sense layers&lt;/td&gt;
&lt;td&gt;Dynamic multi-meaning, born from data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Topic groups&lt;/td&gt;
&lt;td&gt;Community detection on neighbor graphs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Results (65 books trained)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Concepts&lt;/td&gt;
&lt;td&gt;288,407&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentences&lt;/td&gt;
&lt;td&gt;1,234,706&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synapses&lt;/td&gt;
&lt;td&gt;102.7M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;~1.3 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cross-Language Bridge Examples
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;English&lt;/th&gt;
&lt;th&gt;Turkish&lt;/th&gt;
&lt;th&gt;Jaccard&lt;/th&gt;
&lt;th&gt;Cosine&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;water&lt;/td&gt;
&lt;td&gt;su&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;td&gt;0.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fire&lt;/td&gt;
&lt;td&gt;ateş&lt;/td&gt;
&lt;td&gt;0.35&lt;/td&gt;
&lt;td&gt;0.57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;king&lt;/td&gt;
&lt;td&gt;kral&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;td&gt;0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sea&lt;/td&gt;
&lt;td&gt;deniz&lt;/td&gt;
&lt;td&gt;0.49&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;moon&lt;/td&gt;
&lt;td&gt;ay&lt;/td&gt;
&lt;td&gt;0.43&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What this is NOT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not an LLM — no attention, no transformer, no text generation&lt;/li&gt;
&lt;li&gt;Not open source — binary-only experimental release&lt;/li&gt;
&lt;li&gt;Not a pretrained model — you train from scratch with your own data&lt;/li&gt;
&lt;li&gt;Not AGI — no claims of consciousness or general intelligence&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/arifkurnaz/ternary-semantic-brain-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;ternary-semantic-brain-demo
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x scripts/linux/&lt;span class="k"&gt;*&lt;/span&gt;.sh
./scripts/linux/02_train.sh &lt;span class="nt"&gt;--dict&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux binary included. Windows via WSL2.&lt;br&gt;
Full paper and architecture docs in the repo.&lt;/p&gt;




</description>
      <category>ternary</category>
      <category>nlp</category>
      <category>semantics</category>
      <category>c</category>
    </item>
  </channel>
</rss>
