Erdoğan EFES-2026'da ASELSAN'ın oyun değiştirici sistemlerini inceledi

Cumhurbaşkanı Recep Tayyip Erdoğan, ASELSAN’ın ileri teknolojileriyle boy gösterdiği EFES-2026 Tatbikatı’nda oyun değiştirici sistemlerle ilgili bilgi aldı
– ASELSAN’ın sahada kullanılan çözümleri, birçok yabancı askeri heyet ve sektör temsilcisi tarafından yakından incelendi
– ASELSAN’ın sahada kendini kanıtlayan teknolojileri, Türk savunma sanayisinin küresel rekabetteki yükselişinin somut örneklerinden biri olarak dikkati çekti

Four Metrics That Actually Tell You Whether Your Enterprise RAG Is Working

enterprise-rag-evaluation

Enterprise RAG — A practitioner’s build log | Post 4 of 6

RAG evaluation in most implementations stops at one question: did the system retrieve the document that was supposed to be retrieved?

That is the right question for a consumer search product. It is an incomplete question for an enterprise knowledge system where some documents are accessible to all employees and others are restricted by role. In that environment, retrieval correctness is necessary but not sufficient. You also need to know whether restricted documents leaked into answers they should not have influenced.

Enterprise RAG implements four metrics. Each measures a different failure mode. Together they constitute a validation standard that is appropriate for internal knowledge systems handling mixed-sensitivity documents.

The four metrics and what each catches

Pass rate — the percentage of evaluation cases where expected documents were retrieved and forbidden documents were not.

This is the composite metric. A case passes only when both conditions hold simultaneously: the expected documents appear in the citation set and no forbidden documents appear. A system that retrieves all expected documents but also leaks one forbidden document does not pass that case. Pass rate does not reward partial correctness.

Restricted leakage count — the number of evaluation cases that returned at least one forbidden document in the citation set.

This is the most operationally critical metric for an enterprise deployment. A restricted leakage count of zero means the role filter is working correctly across every test case in the evaluation set. Any non-zero value indicates a specific failure to investigate — which case, which document, which role, which query.

Citation coverage — the average number of citations returned per evaluation case.

Low citation coverage indicates that the retrieval system is returning answers without grounding them in source documents. In an enterprise context, an answer without citations cannot be verified, audited, or traced back to a source document. Citation coverage is a proxy for answer auditability.

Average latency (ms) — the mean query execution time across all evaluation cases.

Latency is not a quality metric. It is an operational baseline. If latency increases after a retrieval configuration change — switching from local lexical to Azure AI Search, adding a reranking step, increasing chunk count — the evaluation run captures it. Latency regression during evaluation is a signal worth investigating before deploying the change.

What the evaluation output looks like

Running POST /eval/run returns all four metrics in a single response alongside the per-case results:

{
  "pass_rate": 1.0,
  "restricted_leak_count": 0,
  "citation_coverage": 2.4,
  "average_latency_ms": 38.2,
  "cases": [...]
}

Each case in the result array includes the question, the role used, the retrieved document IDs, and a pass/fail indicator. A failed case shows exactly which expected document was missing or which forbidden document leaked.

enterprise-rag-evaluation

The evaluation runner calls POST /query internally for each case, which means it exercises the entire pipeline: authentication, role filter, retrieval, generation, and citation assembly. The metrics reflect actual system behavior, not a mocked retrieval path.

Why the evaluation set structure matters as much as the metrics

The evaluation set (demo/evaluation_set.json) defines each case with three fields alongside the question and role:

  • Expected document IDs — documents that must appear in the citation set for the case to pass
  • Forbidden document IDs — documents that must not appear in the citation set

Both lists are required for every case. An evaluation case without forbidden document IDs cannot measure restricted leakage. An evaluation set without any cases involving restricted documents cannot validate access control at all.

Most RAG golden sets I have reviewed define expected documents only. They measure retrieval recall but provide no signal on access control correctness. Adding forbidden document IDs to every test case involving a restricted document is the minimum viable evaluation standard for an enterprise knowledge system.

enterprise-rag-citations

What the evaluation set does not yet cover

The current evaluation set is optimized for access-control validation and citation tracing. It does not yet cover:

  • Answer correctness — whether the generated answer is factually accurate relative to the cited documents. This requires human relevance labels or LLM-as-judge evaluation templates.
  • Semantic retrieval quality — the lexical retriever handles the current evaluation set well. A semantic retrieval configuration may return different ranked results that pass the access-control checks but rank differently by relevance.
  • Regression thresholds in CI — the evaluation runner is callable from CI. The current setup does not fail a CI run if pass rate drops below a threshold. Adding a threshold check (if restricted_leak_count > 0: fail) to the CI workflow is the practical next hardening step.

These are documented roadmap items, not silent gaps.

Current limits

  • Evaluation set size is small — calibrated for repeatable local validation, not production-scale coverage.
  • Answer correctness evaluation requires human labels or an LLM judge. Neither is implemented in the current evaluation runner.
  • Latency benchmarks reflect the local SQLite retrieval path. Azure AI Search latency profiles will differ.
  • The evaluation runner requires the ADMIN_TOKEN when management protection is enabled, which prevents accidental evaluation runs in shared environments.

Next engineering step

Review the evaluation cases in demo/evaluation_set.json and count how many include at least one forbidden document ID. If any cases have only expected documents, add a forbidden document ID for a restricted document that should not be retrievable by that role. Then re-run POST /eval/run and verify the leakage count remains zero.

One question for you

Does your current RAG evaluation set include forbidden document IDs alongside expected document IDs? If not, how do you validate that restricted documents are not influencing answers for unauthorized roles?

Next post: Security decisions in Enterprise RAG — how API keys, audit logs, and the order of role enforcement work together to make the system defensible.

Beyond the Stateless Prompt: Building an Auditable Product Intelligence Pipeline with Cascadeflow and Hindsight

Pasting a 10,000-line CSV of customer support reviews into a stateless LLM context window is lazy engineering, and the results show it. You get hallucinated aggregates, ignored edge cases, and zero traceability when a stakeholder asks why a critical bug was classified as low priority.

When building PulseIQ—an enterprise platform designed to synthesize unstructured customer feedback into prioritized engineering action items—we rejected the stateless “dump-everything-into-GPT” pattern. We needed a system that was deterministic where it mattered, semantic where it counted, and fully auditable. We also needed the system to understand time; a complaint about onboarding in version 2.2 has a completely different engineering context than the same complaint in version 1.8.

To solve this, we built a hybrid architecture that integrates Cascadeflow’s orchestration pipeline to process feedback through an explicit, 10-stage evaluation graph, paired with Hindsight’s contextual memory layer to track sentiment regressions and issue streaks over product version releases.

Gating the Pipeline: Cascadeflow Heuristics

A major pain point of building LLM pipelines is the lack of structural predictability. Raw customer reviews are messy—containing HTML tags, casing noise, and random casing symbols.

We used docs.cascadeflow.ai as our blueprint for constructing a 10-stage sequence. By enforcing strict TypeScript schemas for each step, we ensure that early stages normalize data deterministically before passing it to expensive semantic evaluation steps.

Here is how the pipeline is orchestrated in cascadeflow.ts:

export class CascadeflowEngine {
  private stages: PipelineStage[];

  constructor() {
    this.stages = CascadeflowEngine.getInitialStages();
  }

  public async executePipeline(
    inputText: string,
    onProgress: (stages: PipelineStage[], activeStageId: string | null, currentLog: string, result?: PipelineResult) => void,
    latencyMs: number = 400
  ): Promise<PipelineResult> {
    const activeStages = [...this.stages];
    onProgress(activeStages, 'stage-1', "[Ingest Engine] Raw payload received.");

    // Stage 1: Ingest
    activeStages[0].status = 'processing';
    await this.delay(latencyMs);
    activeStages[0].status = 'completed';

    // Stage 2: Data Cleaning
    activeStages[1].status = 'processing';
    const cleanedText = this.cleanText(inputText);
    onProgress(activeStages, 'stage-2', `[Sanitizer] Cleaned text: "${cleanedText.substring(0, 40)}..."`);
    await this.delay(latencyMs);
    activeStages[1].status = 'completed';

    // Stage 3: NLP Tokenization
    activeStages[2].status = 'processing';
    const tokens = this.extractTokens(cleanedText);
    onProgress(activeStages, 'stage-3', `[Tokenizer] Extracted ${tokens.length} semantic vectors.`);
    await this.delay(latencyMs);
    activeStages[2].status = 'completed';

    // ... subsequent stages evaluate sentiment, category and priorities

By decoupling these steps, we gain a massive advantage: independent debugging. If our tokenization logic fails on non-ASCII characters, we can fix Stage 3 in isolation without touching our downstream sentiment calculations or wasting LLM token costs.

Connecting the Timeline: Hindsight Contextual Memory

Once you have a structured pipeline output, the next challenge is placing it in the context of history. When engineering deploys a new release (say, v2.1), we need to immediately understand if customer satisfaction is rising or falling compared to v2.0 and v1.9.

To build this version-pinned memory matrix, we integrated Hindsight’s agent memory principles. Hindsight tracks persistent records of past feedback analyses and evaluates long-term customer friction trends. Instead of passing an infinitely growing list of past support tickets to the LLM, we use Hindsight’s memory store to maintain compiled statistical summaries pinned directly to specific release versions.

Here is the core logic from hindsight.ts that calculates version-to-version sentiment drift coefficients:

export class HindsightEngine {
  private storageKey = 'pulseiq_hindsight_memory';

  public getSentimentShifts(): Array<{
    previousVersion: string;
    currentVersion: string;
    percentageChange: number;
    shiftType: 'improvement' | 'regression' | 'stable';
    description: string;
  }> {
    const records = this.getRecords();
    const shifts: any[] = [];

    const versionRatings: Record<string, { sum: number; count: number }> = {};
    records.forEach(r => {
      if (!versionRatings[r.version]) {
        versionRatings[r.version] = { sum: 0, count: 0 };
      }
      versionRatings[r.version].sum += r.sentimentScore;
      versionRatings[r.version].count += 1;
    });

    const sortedVersions = Object.keys(versionRatings).sort();
    for (let i = 0; i < sortedVersions.length - 1; i++) {
      const prev = sortedVersions[i];
      const curr = sortedVersions[i + 1];

      const prevAvg = versionRatings[prev].sum / versionRatings[prev].count;
      const currAvg = versionRatings[curr].sum / versionRatings[curr].count;

      const diff = currAvg - prevAvg;
      const percentage = Math.round(Math.abs(diff) * 100);

      shifts.push({
        previousVersion: prev,
        currentVersion: curr,
        percentageChange: percentage,
        shiftType: diff < -0.15 ? 'regression' : diff > 0.15 ? 'improvement' : 'stable',
        description: diff < -0.15 
          ? `Sentiment dropped significantly after the release of ${curr}.` 
          : `Sentiment rose steadily after the release of ${curr}.`
      });
    }
    return shifts;
  }
}

This logic enables us to answer crucial business questions automatically. If a customer reports a bug, Hindsight scans the memory store, determines if this issue started in v2.2 or has been a recurring issue since v1.9, and triggers a warning if it detects a “streak” of unresolved complaints.

To learn more about implementing similar persistent contexts in your own microservice pipelines, check out the Hindsight documentation.

Tracing a Live Multi-Factor Authentication Lockout

To see the hybrid Cascadeflow-Hindsight system in action, trace what happens when we feed this support ticket into the platform:

“Ever since version 2.1 deployed, the MFA SMS token arrives 20 minutes late, leading to persistent verification lockouts from my corporate workspace! Fix this ASAP!”

  1. The Cascadeflow Run: The system normalizes the casing, extracts tokens, maps it to the category "Authentication" (Confidence: 0.94), and calculates a priority score of 92/100 (HIGH).
  2. The Hindsight Evaluation: Because the memory store already has a record of “MFA complaints spiking in v2.1” from last week, the system flags a 4-week recurring issue streak and automatically adjusts the layout’s dynamic suggestion:

    • Suggestion: “MFA anomalies have consistently spiked over the last 4 weeks. Twilio SMS OTP gateway is experiencing persistent routing timeouts on the v2.1 path. Immediately deploy fallback SMS-redundancy route or temporarily whitelist corporate workspace IPs.”

Lessons Learned

  1. Deterministic Gating is Your Shield: Never send raw user inputs directly to semantic LLM steps. Normalizing casings and filtering HTML tags in early pipeline stages saves token costs and prevents prompt-injection attacks.
  2. State Streams Save the User Experience: AI processing takes time. Streaming active logs through a terminal-style UI while Cascadeflow runs gives users visual feedback and increases platform confidence.
  3. Stateless Prompts are Useless for Regressions: To track regressions, you need a dedicated, version-aware agent memory layer. Pinning statistical metadata to release version tags in a persistent buffer like Vectorize agent memory is the only scalable way to detect regressions without inflating LLM context windows.

Conclusion

By moving away from stateless, single-pass prompts and building a hybrid architecture with Cascadeflow and Hindsight, we transformed customer complaints from a chaotic swamp of text into a clean, version-aware stream of business decisions.

Most Creators Are Building in Pieces. I’m Building the Entire System.

Most Creators Are Building in Pieces. I’m Building the Entire System.

Music. Tools. Code. Distribution. One ecosystem — not fragmented platforms.


TizWildin Entertainment HUB — Free Plugins, Sample Packs, Audio Lists & ARC Source Spine

Free audio plugins, producer kits, sample packs, public discovery lists, and ARC source-spine links from GareBear99 / TizWildin.

garebear99.github.io

Main Link: https://garebear99.github.io/TizWildinEntertainmentHUB/

TizWildin Entertainment is not a label.

It’s not just a dev project.

It’s a creator infrastructure system being built from the ground up.

The Problem with Modern Creation

Creators are forced into disconnected systems:

Music: Spotify / SoundCloud
Code: GitHub
Writing: blogs / Dev.to
Distribution: multiple platforms
Monetization: fragmented everywhere

Nothing connects.

Everything breaks context.

And every release becomes a dead endpoint instead of a system.

The Shift: From Content → Systems

TizWildin Entertainment is built around one idea:

Every creative output should be reusable infrastructure.

Not files.

Not posts.

Systems.

What TizWildin Entertainment Actually Is

A modular creative ecosystem spanning music, development, and media engineering.

🎧 Audio & Sound Design Layer
Advanced sample packs (808s, sub bass systems, warped drums)
Experimental synth architectures
Sound design frameworks (not just loops)

Example releases & audio ecosystem:

https://soundcloud.com/tizwildin
https://soundcloud.com/tizwildin/sets/album
🧠 Developer Tooling Layer
Audio generation scripts
Pack builders
Plugin concepts (VST/AU/standalone systems)
Experimental creative tooling

Open-source ecosystem entry point:

https://github.com/GareBear99
🎬 Media + Release Layer
Album systems (not just track lists)
Visual identity pipelines
Cover + branding generation systems
Structured multi-layer releases

Example project distribution:

https://dev.to/tizwildin
🌐 Distribution Layer (Unified Pipeline)

Instead of scattered uploads, everything flows through:

GitHub → tooling + systems
Dev.to → documentation + engineering posts
SoundCloud → audio output layer

This creates a full-stack creative pipeline instead of isolated uploads.

The Core Idea: Everything is Interoperable

A sample pack is not just audio.

It includes:

generation scripts
metadata systems
preview tools
structure logic
visual identity assets

A music release is not just tracks.

It includes:

production breakdowns
companion packs
sound system documentation
iterative variations

Each release becomes a living system, not a static upload.

Why This Matters (SEO: Creator Economy / Music Tech / Open Source Audio Tools)

The industry is shifting toward:

AI-assisted production
modular creative systems
open-source tooling
cross-platform ecosystems

But most creators are still stuck in:

“Make → Upload → Forget”

That model is collapsing.

What I’m Building Instead

TizWildin Entertainment is evolving into:

A creator infrastructure layer
A hybrid between label, dev lab, and tooling ecosystem
A system where music + code + design evolve together

Think:

GitHub + Ableton + Creative OS

Current Active Ecosystem

Core focus areas:

Sub-bass / 808 engineering systems
Sample pack architecture (not just libraries)
Audio generation tooling
Cross-platform publishing pipeline
Unified branding system across all outputs
Experimental sound design releases
Core Public Nodes
🎧 Music & releases: https://soundcloud.com/tizwildin
📦 Audio catalog / albums: https://soundcloud.com/tizwildin/sets/album
🧠 Dev + engineering posts: https://dev.to/tizwildin
⚙️ Open-source tooling: https://github.com/GareBear99
Final Thought

The future of creation won’t be split into:

musicians
developers
designers
marketers

It will be built by people treating all of them as one system.

That’s what TizWildin Entertainment is becoming.

Not content production.

Creative infrastructure engineering.


TizWildin Entertainment HUB — Free Plugins, Sample Packs, Audio Lists & ARC Source Spine

Free audio plugins, producer kits, sample packs, public discovery lists, and ARC source-spine links from GareBear99 / TizWildin.

garebear99.github.io

The Hidden Privacy Problem in Every AI App

Every AI Product Has the Same Hidden Privacy Problem

The more useful the assistant becomes, the more sensitive the user data becomes.

A user writes something like:

I need to move my appointment from Tuesday to Friday because I had surgery last month and I’m still on medical leave.

My policy number is INS-48291.

The task is simple: reschedule an appointment. But the prompt also includes sensitive medical, employment-related, and internal policy information that the model may not need to complete that task.

In many AI applications, that message is sent directly to a third-party LLM provider.

Why This Matters Now

In regulated environments, teams are expected to limit personal data processing, explain why data is needed, and apply privacy by design.

With LLMs, that becomes harder because users often paste sensitive information directly into prompts, even when that information is not required for the task.

The risk is not that every AI app will receive a massive fine.

The real risk is losing control over where sensitive data goes, how long it is stored, whether it appears in logs or traces, and whether the company can prove that the model actually needed that data in the first place.

Companies want to use LLMs in customer support, healthcare, finance, legal workflows, HR, internal tools, and enterprise automation.

But these are exactly the environments where sensitive data appears naturally in conversations.

So the question is not:

Can we remove all personal data?

The real question is:

Can we protect personal data while keeping the AI useful?

This is the problem I tried to solve with PII Firewall, an open-source privacy layer for AI applications.

PII Firewall behaves as a stateful proxy that sits between your application and any LLM provider. It detects sensitive information, replaces it with safe tokens before the model call, and restores the original values only inside your trusted environment.

It is model-agnostic by design, works across 55+ languages, and lets teams combine multiple PII detection techniques through a simple, unified framework.

The model still gets the context it needs. But it never needs to know who the user really is.

Redaction Is Not Enough

The most common approach to privacy is redaction.

Take this input:

My name is Maria Perez and my email is [email protected].

A simple redaction system might turn it into:

My name is [REDACTED] and my email is [REDACTED].

That protects the data, but it also destroys useful context.

If the model later responds with:

I have updated the record for [REDACTED].

The final answer is technically private, but not useful.The model does not know what was redacted. Was it a person, a company, an email address, or a case reference?

And in a multi-turn conversation, a stateless redaction layer cannot reliably preserve who or what each placeholder refers to across messages.

The Core Idea: Pseudonymize, Reason, Rehydrate

PII Firewall uses reversible pseudonymization.

Instead of deleting sensitive values, it replaces them with safe tokens:

John Doe         → PERSON_1
[email protected] → EMAIL_1

So the LLM receives:

Hi, I'm PERSON_1. My email is EMAIL_1.
Can you help me update my insurance claim?

The model can still understand that there is a person, an email address, and a task.

It can respond naturally:

Sure, PERSON_1. I can help you update the account linked to EMAIL_1.

Then PII Firewall rehydrates the response inside your trusted environment:

Sure, John Doe. I can help you update the account linked to [email protected].

The user gets a personalized answer, but the LLM provider never receives the raw personal data.

A Flexible Privacy Framework

PII Firewall is not the first attempt to protect LLM calls from sensitive data exposure.

Privacy proxies, PII redaction tools, anonymization layers, and AI security gateways are becoming part of the production LLM stack.

But in practice, privacy is rarely solved with a single detector, a single language, or a single rule.

Some applications need fast pattern matching for emails, phone numbers, credit cards, IBANs, or internal IDs. Others need language-aware models to detect names, locations, organizations, dates, or contextual references. Some teams need healthcare-specific detection, while others need finance, legal, HR, customer support, or internal enterprise rules.

PII Firewall lets teams:

  • Choose the LLM provider
  • Combine different PII detection techniques
  • Adapt detection to multiple languages
  • Define different actions per entity
  • Keep reversible mappings in a scoped vault

In other words, the goal is not to provide one fixed privacy policy, but a framework for defining the right privacy behavior for each application.

Model-Agnostic by Design

PII Firewall can sit in front of OpenAI, Anthropic, or any provider that accepts text input and returns text output.

This matters because AI infrastructure changes quickly. A team may start with one provider, later route workloads to another, or eventually move some models in-house.

Your privacy layer should not have to be rewritten every time your model strategy changes.

PII Firewall is designed as middleware: a thin privacy boundary between your application and whichever model you choose.

Detector-Agnostic Too

PII detection is not a solved problem with a single perfect technique.

Some sensitive data is structured and easy to detect:

[email protected]
+34 600 123 456
4242 4242 4242 4242

Rule-based patterns work very well for these cases.

Other data is contextual:

John lives near the hospital and spoke with Dr. Martinez last Friday.

Here, names, roles, dates, and locations may need language understanding.

PII Firewall supports multiple detection engines. You can use:

  • Simple rule-based patterns when you want speed and precision
  • NER-based detection when you need context
  • Transformer models for more specialized domains
  • Hybrid mode to combine several approaches

Built for More Than English

A lot of privacy tooling works well in English and then quietly breaks down elsewhere.

Real users write in Spanish, French, Italian, Portuguese, German, Arabic, Japanese, and many other languages. They use different name structures, address formats, national identifiers, phone formats, bank account formats, and local conventions.

PII Firewall includes language-aware routing, so detection can adapt to the language and region of the text.

This allows the system to apply the right patterns and models for the context instead of relying on a single English-centric detector.

For example, a privacy layer used in Europe should understand IBANs, local phone numbers, national identifiers, and multilingual names.

A global AI product cannot treat privacy as an English-only problem.

Different Domains Need Different Privacy Behavior

Different industries have different privacy needs.

A healthcare assistant should preserve clinical utility while protecting patient identity.

A finance assistant should protect payment data while keeping enough context for analysis.

A legal assistant may need to preserve case references while anonymizing party names and addresses.

PII Firewall includes domain-specific presets for common scenarios such as:

  • Healthcare
  • Finance
  • Legal
  • Generic

These presets are not meant to be rigid. They are starting points.

Teams can override specific behaviors, add their own entity types, or define new profiles for their own internal data.

For example, a company may want to detect:

  • Employee IDs
  • Customer IDs
  • Ticket numbers
  • Contract references
  • Internal project codes

Those identifiers may not be “standard PII”, but they can still be sensitive inside a business context.

The same applies to how different values are handled.

Not all sensitive data should be handled the same way:

  • A person’s name might need to be pseudonymized so the model can continue referencing that person.
  • A credit card number should usually be masked.
  • A precise date of birth might be generalized.
  • A value that should never be exposed may need to be fully redacted.

PII Firewall supports different actions depending on the type of data:

John Doe                   → PERSON_1
[email protected]            → EMAIL_1
4242 4242 4242 4242         → ************4242
17 March 1984               → 1980s
Highly sensitive value      → [REDACTED]

Privacy is not one-size-fits-all. The right behavior depends on the data type, the use case, and the risk profile.

Stateful Privacy

One of the most important parts of PII Firewall is that it is stateful.

A stateless filter can remove data, but it cannot easily remember that across a conversation:

PERSON_1 = John Doe
EMAIL_1  = [email protected]
CASE_1   = Insurance Claim 8821

PII Firewall keeps this mapping in a vault scoped to the right context.

That context can include things like:

  • Organization
  • User
  • Case
  • Thread

This makes it possible to track mappings safely and restore values only when appropriate.

It also makes compliance workflows easier.

For example, if a user invokes a right-to-forget request, the application can purge the mappings for that user, case, or session.

The goal is to manage sensitive data across its lifecycle, not just remove it from a single prompt.

Example

Here is the basic idea in code:

from privacy_firewall import PrivacyFirewallSDK

firewall = PrivacyFirewallSDK.create(
    domain="healthcare",
    detector_backend="hybrid",
)

context = {
    "tenant_id": "acme-corp",
    "case_id": "case-8821",
    "thread_id": "thread-001",
    "actor_id": "user-42",
}

sanitized = firewall.anonymize_text(
    text=user_prompt,
    context=context,
)

response = my_llm(
    sanitized.sanitized_text,
)

final = firewall.rehydrate_text(
    text=response,
    context=context,
)

Conclusion

As AI moves into production, privacy cannot remain an afterthought, especially as regulation becomes stricter in Europe.

The safest personal data to send to an LLM is the data it never receives.

PII Firewall is an open-source project. If you are building AI products in healthcare, finance, legal tech, customer support, internal automation, or enterprise SaaS, I would love feedback, issues, and contributions from people working on real-world systems.

CVE-2026-26007: Subgroup Confinement Attack in pyca/cryptography

A single missing validation check in pyca/cryptography recently exposed how legacy elliptic curve math can quietly leak private keys.

If you run a Python backend, pyca/cryptography likely forms the core of your security posture. On February 10, 2026, the maintainers released version 46.0.5 to address a high-severity vulnerability tracked as CVE-2026-26007 (GHSA-r6ph-v2qm-q3c2) with a CVSS score of 8.2. This is a textbook cryptographic subgroup confinement attack that allows an attacker to leak private key bits during Elliptic Curve Diffie-Hellman (ECDH) key exchanges or forge signatures in ECDSA. Understanding this flaw requires a deep dive into abstract algebra and legacy cryptographic curves.

The Mathematics of Subgroup Confinement

Elliptic curve cryptography operates over finite fields where curve points form an abelian group. Secure implementations work within a subgroup of a large prime order n. The relationship between the total group order N and the prime subgroup order n is defined by the cofactor h, where N = h * n.

In modern curves like NIST P-256 or secp256k1, the cofactor is exactly 1. The total group order is prime, making them immune to subgroup attacks. However, legacy binary curves, often called SECT curves like SECT163K1 or SECT283R1, have cofactors greater than 1, typically 2 or 4.

When the cofactor exceeds 1, the group contains small-order subgroups. If an application performing an ECDH key exchange does not validate that the incoming public key point lies within the correct subgroup, an attacker can exploit this by transmitting a malicious public key point P belonging to a small-order subgroup of order r.

When the victim computes the shared secret S = d * P, where d is the private key, the resulting point S falls within that subgroup. Since there are only r possible values for S, the attacker can deduce the value of d modulo r by observing subsequent encrypted communication. Repeating this with different subgroups allows an attacker to use the Chinese Remainder Theorem to reconstruct the private key.

The Vulnerability in pyca/cryptography

The flaw in pyca/cryptography versions up to 46.0.4 stems from a lack of strict validation when parsing public keys. When an application loaded an elliptic curve public key from DER or PEM formats, or constructed it using public_key_from_numbers(), the library did not verify whether the point belonged to the proper prime-order subgroup.

For curves with a cofactor of 1, this omission is harmless. But for binary SECT curves, this allowed maliciously crafted public keys to pass through the loading phase undetected, exposing downstream ECDH or ECDSA operations to key-leakage attacks.

Analyzing the Rust Patches

To fix this, the maintainers modified the Rust-based backend in version 46.0.5. Since pyca/cryptography leverages Rust for performance, the validation logic belongs in the native layer wrapping OpenSSL.

Here is the validation implemented in the Rust layer of the codebase:

impl ECPublicKey {
    fn new(
        pkey: openssl::pkey::PKey<openssl::pkey::Public>,
        curve: pyo3::Py<pyo3::PyAny>,
    ) -> CryptographyResult<ECPublicKey> {
        let ec = pkey.ec_key()?;
        check_key_infinity(&ec)?;

        let mut bn_ctx = openssl::bn::BigNumContext::new()?;
        let mut cofactor = openssl::bn::BigNum::new()?;

        ec.group().cofactor(&mut cofactor, &mut bn_ctx)?;
        let one = openssl::bn::BigNum::from_u32(1)?;

        if cofactor != one {
            ec.check_key().map_err(|_| {
                pyo3::exceptions::PyValueError::new_err(
                    "Invalid EC key: point does not belong to the correct subgroup",
                )
            })?;
        }

        Ok(ECPublicKey { pkey, curve })
    }
}

This fix is highly optimized. For modern curves with a cofactor of 1, the validation check is bypassed. If a legacy curve is detected, it triggers OpenSSL’s internal key check to validate that the point respects the mathematical bounds of the prime-order subgroup.

Simultaneously, the maintainers deprecated all SECT curves in the Python layer, scheduling them for complete removal in version 47.0.0.

The Architectural Takeaway: Keep It Simple

This vulnerability highlights a critical security engineering principle: complexity is the enemy of security. Legacy curves were designed when saving CPU cycles was worth the mathematical complexity of non-prime cofactors. Today, those optimizations are obsolete.

When we designed VaultKeepR for secure credential storage, we avoided this entire class of cryptographic vulnerability by eliminating legacy asymmetric protocols. With VaultKeepR, we minimized runtime validation risks by relying on a strict, modern cryptographic profile that completely bypasses legacy curves. Instead of handling complex on-the-fly elliptic curve negotiations on central servers, we utilize on-device cryptography using modern symmetric primitives.

By relying on Argon2id for key derivation and XChaCha20-Poly1305 for symmetric encryption, we ensure that there are no complex mathematical subgroup vulnerabilities to exploit. All operations happen client-side before sync.

If you maintain legacy systems relying on binary curves, migrate immediately. Transition your workloads to modern curves like Ed25519 and pin your Python environments to cryptography>=46.0.5.

The lifecycle of cryptographic primitives always bends toward simplicity. As older, more complex structures reveal their vulnerabilities under modern analysis, the industry must pivot toward designs where security is mathematically guaranteed by default, rather than enforced by complex runtime checks.

The One Thing I See in Every Developer Who Gets Unstuck

I’ve mentored over 100 developers. Some were juniors. Some had 5 years of experience but felt stuck.

And the one thing I see in every single one of them?

They didn’t need more tutorials. They needed someone to say, “You’re not alone.“

When you’re learning alone, every bug feels like failure. Every error becomes a reason to quit.

But when you’re in a community, that same bug becomes a conversation. You ask, someone answers, you fix it, you move on.

That’s the difference between surviving and thriving.

What I’m building:
A community where developers build real things – together. Not a “watch and repeat” course. A live, project-based, collaboration-first learning space.

Why you should join:
You’ll build projects that actually work
You’ll get feedback from me and other builders
You’ll stop feeling alone in your learning journey

I’m launching this in a few weeks. If you’re a developer who wants to build, not just watch – follow me.

My portfolio (proof that I build what I teach): My Portfolio

What’s one thing you’d love to learn but feel too intimidated to start alone?

Under the Hood: Building an Interactive 1,536-Dimensional Vector Space Visualizer with React & PCA

Every developer working with Large Language Models quickly learns about vector embeddings—arrays of floating-point numbers mapping words, sentences, or images into multi-thousand-dimensional semantic spaces. But while we write APIs calling text-embedding-3-small daily, humans lack the biological architecture to conceptualize 1536-dimensional coordinates.

To bridge this intuitive void, we built Vector Space Explorer: an interactive web visualizer allowing developers to input custom vocabularies, perform real vector arithmetic (like puppy - dog + cat = kitten), play semantic clustering games, and examine the raw JSON outputs returned from deep learning hubs.

Here is the technical architectural breakdown of how we built this application using React 18, Tailwind CSS, and pure client-side linear algebra math.

1. Multi-Provider Endpoint Ingestion

Depending on budget or privacy restrictions, developers use different pipelines. To serve all needs, we wrapped our request adapters to handle multiple standard API specifications through a unified, client-secured interface:

  1. Simulated (Mock Mode): An offline, high-speed, lightweight client-side embedder calculating mathematical coordinates internally so developers can test layouts instantaneously without keys.
  2. OpenAI Cloud: Requests fetched from the secure gateway using text-embedding-3-small (1,536-dim).
  3. LM Studio (Local): Allows local offline execution of state-of-the-art open models like nomic-embed-text-v1.5 on port 1234.
  4. Featherless.ai & OpenRouter: Direct serverless endpoints mapping standard OpenAI-compatible JSON responses.

Here is how the API layer executes the ingestion of raw words:

// excerpt from src/utils/api.ts
export async function fetchWordEmbedding(
  word: string, 
  settings: SystemSettings
): Promise<number[]> {
  if (settings.demoMode) {
    return generateMockEmbedding(word); // Instant client-side PCA-friendly vector
  }

  const response = await fetch(`${settings.baseUrl}/embeddings`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${settings.apiKey}`
    },
    body: JSON.stringify({
      input: word,
      model: settings.model
    })
  });

  if (!response.ok) {
    throw new Error(`Endpoint status code error: ${response.status}`);
  }

  const json = await response.json();
  return json.data[0].embedding; // Standard 1,536 float elements
}

2. The Math Behind the Visualization: Client-Side PCA

Fetching a 1,536-dimensional array is only the beginning. To render this on a computer screen, we must flatten 1,536 axes down to just 2 dimensions ($X, Y$) while preserving as much cluster structure and relative similarity as possible.

While we could send data back to Python for Scikit-Learn’s PCA, doing so ruins UI snappiness. We solved this by writing a pure TypeScript client-side Principal Component Analysis engine utilizing raw Matrix math:

Step 2.1: Constructing the Covariance Matrix

First, we mean-center the coordinate matrices of all words currently added to the sandbox, then calculate their covariance. This maps the directional associations of our coordinates.

Sigma = frac{1}{n} X^T X

Step 2.2: SVD via Jacobi Eigenvalue Algorithm

To extract the two main components (the directions capturing the highest amount of variance), we must extract the eigenvectors from our covariance matrix. We write a iterative Jacobi sweep solver to diagonalize symmetric matrices direct in TypeScript:

// Clean conceptual loop of Jacobi Eigenvalue Solver
export function solveEigenvectors(covariance: number[][], maxSweeps = 50) {
  const size = covariance.length;
  const eigenvectors = createIdentityMatrix(size);
  let matrix = cloneMatrix(covariance);

  for (let sweep = 0; sweep < maxSweeps; sweep++) {
    let offDiagonalSum = computeOffDiagonalNorm(matrix);
    if (offDiagonalSum < 1e-9) break; // Diagonalized successfully!

    for (let p = 0; p < size; p++) {
      for (let q = p + 1; q < size; q++) {
        const theta = calculateRotationAngle(matrix, p, q);
        const [c, s] = [Math.cos(theta), Math.sin(theta)];

        matrix = applyJacobiRotation(matrix, p, q, c, s);
        updateEigenvectorSet(eigenvectors, p, q, c, s);
      }
    }
  }
  return { eigenvalues: extractDiagonals(matrix), eigenvectors };
}

Step 2.3: Projecting down to 2D

We sort computed eigenvalues descending, choose the eigenvectors corresponding to the top two eigenvalues, and project our high-dimensional vectors onto those top two Principal Components to compute coordinates on our responsive galaxy map.

3. Why are “puppy” and “dog” far apart visually?

A common question emerges when users construct clusters in Sandbox mode:

“If puppy and dog have a Cosine Similarity of 0.85 (extremely high), why are they rendered far apart on the 2D constellation grid?”

This paradox illustrates the exact mathematical limitation of dimensional projection.

    ┌──────────────────────────┐
    │  1,536-Dimensional Space │ ➔ (true relationship is extremely adjacent)
    └─────────────┬────────────┘
                  │ PCA Lossy Compress
                  ▼
    ┌──────────────────────────┐
    │     2D Screen Canvas     │ ➔ (compressed projection can distort angles)
    └──────────────────────────┘
  1. Loss of Variance Info: Standard embeddings span 1,536 dimensions representation. High-similarity dimensions might point along eigenvectors #12 or #24 which are entirely discarded in order to squeeze the map onto Component #1 and #2.
  2. Global Optimization Context: PCA determines its coordinate calculations based exclusively on the currently visible set of sandbox stars. If you only have “cat”, “dog”, and “puppy” in the sandbox, the eigenvalues will polarize. By inputting highly distinct vocabulary structures (e.g., adding “planet”, “computer”, “compiler”, and “jupiter”), PCA gains rich context nodes, pulling “dog”, “puppy”, and “cat” close together into a dense animal sub-cluster while pushing tech words across to the opposite quadrant!

To offset this limitation, our side Telemetry Panel calculates both the 2D Euclidean offset and the True High-Dimensional API Cosine Similarity as you select nodes, teaching developers how to interpret projection skew.

4. Deep Vector Algebra Calculations

One of the application’s proudest features is its interactive Algebra Lab, which allows executing vector math directly in the browser.

Executing vector("puppy") - vector("dog") + vector("cat") produces a new 1,536-dimensional target coordinate array. We search all active sandbox star arrays to identify the absolute closest semantic neighbor utilizing Cosine Vector angles:

$$
text{Similarity}(A, B) = frac{A cdot B}{|A| |B|}
$$

The model traces an animated emerald trajectory line showing how close the synthesized conceptual vector came to landing exactly on its semantic targets (like #kitten).

By maintaining robust client state, loading dynamic SVG/Canvas layers smoothly, and managing API key parameters privately in browser memory without server tracking, the application guarantees secure, stateless, and incredibly educational sandbox interactions.

Fork the codebase on GitHub to explore adding 3D orbital environments, cluster mapping, or real-time Vector DB indexing visuals today!

Code and more: https://www.dailybuild.xyz/project/139-vector-space-explorer

The $1000 Operating System: Rearchitecting the Dev Team Inside Antigravity 2.0

This is a submission for the Google I/O Writing Challenge

Earlier this week, a software system built the core framework of a functioning operating system from scratch in exactly 12 hours. No human wrote a single line of code. The architecture wasn’t planned by a principal engineer; it was broken down, assigned, and compiled entirely by an autonomous ecosystem of AI agents.

The entire project cost less than $1000 in API compute credits.

If your current relationship with generative AI consists of manually treating a language model like a highly advanced autocomplete tool—typing a prompt, waiting for an isolated snippet of syntax, and copy-pasting it into your IDE—you are using a paradigm that Google just retired. At Google I/O 2026, the company shifted its focus entirely away from passive chatbot extensions. We are entering the era of independent, multi-agent orchestration engines.

As a Google Developer Expert (GDE) who designs and breaks these frameworks daily, I can tell you that this isn’t an incremental tooling upgrade. It changes the fundamental unit economics of what is financially and structurally viable to build.

1. Inside the 12-Hour Build: Parallel Orchestration in Action

During the developer keynote, Google DeepMind’s Varun Mohan introduced Antigravity 2.0, which has transitioned from an experimental IDE helper into a standalone, agent-first desktop application. To make the engineering capabilities of the platform clear, Mohan dropped the telemetry of their internal stress test: a 93-agent team assigned to write an OS.

  • The Team Size: 93 autonomous sub-agents spun up on demand.
  • The Compute Load: 15000 API requests processing 2.6 billion tokens.
  • The Operational Cost: Under $1000 USD using the new Gemini 3.5 Flash engine.

Instead of stretching one massive context window to its absolute breaking point with a single giant prompt, the core Antigravity agent acted strictly as an engineering manager. It broke the master task into parallel micro-objectives, spinning off sub-agents to handle isolated modules independently. One group engineered the memory management sub-systems, another excelled at the process scheduler, and separate agents concurrently generated and executed unit tests within an isolated containerized sandbox.

The GDE Take: What fascinated me about this run wasn’t just that the code compiled without human syntax correction; it was the ecosystem’s capacity for autonomous problem-solving. When Mohan’s team first attempted to run the classic game DOOM on the newly compiled OS onstage, the game stalled due to missing video and keyboard drivers. I’m currently testing with some agents in current version in Gemini (only Agent Manager was updated so far).

Instead of a developer jumping in to write a wrapper, Mohan simply gave the agent harness a high-level correction command. The main agent automatically recognized the missing dependencies, deployed a specialized driver sub-agent, wrote the code, ran a quick compilation test, and launched the game live on stage. As an architect, seeing a multi-agent system patch its own environment mid-execution changes my entire reference point for what “agentic coding” means.

2. Fueling the Token Monster: Why Silicon Architecture Matters

If you manage application infrastructure or keep a tight eye on cloud spend, looking at a 15,000-request architecture probably gives you financial anxiety. Running nearly a hundred agents concurrently to process billions of tokens is a massive “token monster.” If you try to run this kind of dense, recurring automation pattern over traditional, generalized infrastructure models, your operational budgets will disappear before mid-year.

To understand why this is suddenly cost-effective, we have to look at how Google co-optimized the model layer with their hardware fabric:

  • Gemini 3.5 Flash: This model is designed directly for the low-latency, rapid-fire iterations required by agent loops. Inside the Antigravity system harness, Flash is co-optimized to run up to 12x faster than standard frontier models, intentionally prioritizing execution throughput and cost efficiency without dropping the semantic reasoning necessary to maintain systemic code architecture.
  • TPU v8i Inference Chips: Standard AI hardware is typically built for massive, heavy-duty training workloads—the computing equivalent of a cargo train. For Antigravity 2.0, Google split its 8th-generation silicon footprint, creating the TPU v8i variant optimized strictly for real-time inference. It handles massive, parallelized token streams without letting the agent loops stall while waiting for compute availability.
  • Jackson Pathways: Imagine all 93 sub-agents blasting billions of tokens back and forth within a single local server rack; the localized bottleneck would completely freeze execution. Jackson Pathways acts as a dynamic traffic routing network, seamlessly distributing token loads across globally separate data center clusters in real time, keeping the entire pipeline completely fluid.

3. The Real Frontier: Autonomy Demands Absolute Responsibility

The system engineering behind Antigravity is a massive technical win, but the most important part of the keynote didn’t involve code telemetry. It came during Demis Hassabis’ final segment, where he explicitly noted that we are standing in the “foothills of the singularity.” For developers entering this space, we need a clear, unhyped understanding of what that actually implies. When an expert like Hassabis references the “singularity,” he isn’t talking about science fiction tropes or self-aware machines; he is describing a highly specific technological inflection point where AI systems become advanced enough to recursively design, iterate, and optimize software entirely independent of human engineers.

When code can propagate, scale, and compile itself across 93 parallel threads, human code review pipelines become a massive operational bottleneck. Our roles are fundamentally shifting from syntax writers to telemetry auditors, security gatekeepers, and boundary architects. If you let teams of autonomous sub-agents run wild in a repository without explicit constraints, security vulnerabilities and architectural debt will multiply faster than your team can track them. As architects, we have to master the defensive guardrails Google outlined:

Automated Pipeline Defense via Code Mender

We can no longer treat security as a post-build chore. Google highlighted Code Mender, an automated defense agent built directly into the integration layer. As your Antigravity sub-agents generate and push code to your sandbox, Code Mender runs alongside them asynchronously, scanning code blocks for critical vulnerabilities and committing automated security patches before the software ever touches a production branch.

Immutable Data Provenance (SynthID & C2PA)

In a development landscape flooded with autonomous agent systems, knowing the exact lineage of your code and media assets is a non-negotiable requirement for system compliance. Google announced widespread, unified backing for its SynthID watermarking engine and C2PA Content Credentials alongside industry majors like OpenAI, Microsoft, Nvidia, and ElevenLabs. This infrastructure creates a permanent, tamper-proof cryptographic paper trail. For a developer, this means you can cryptographically verify exactly which agent system generated a file, what data model it trained on, and whether a code block has been altered post-compilation.

4. Conclusion: Moving Up the Stack

The shift from single-turn prompts to autonomous orchestration frameworks marks the graduation of our industry. The core developer discipline of the next decade won’t be defined by how efficiently we look up documentation or format language blocks inside an IDE interface. The future belongs to the system architects—the engineers who know how to design multi-agent communication networks, configure secure containerized sandboxes, and orchestrate automated guardrails around independent code generation layers.

We aren’t being replaced; we are being promoted. The baseline engineering execution is becoming a commodity, forcing us to focus entirely on intent, boundaries, and overall system logic. The question is no longer about how to write a specific software utility—it’s about what system architecture you are ready to let a coordinated ecosystem of agents build for you.

Over to the community: If you had a $1000 token budget to spin up a 90-agent team inside Antigravity 2.0 right now, what manual deployment pipeline or complex architecture component are you letting them automate first? Let’s talk about system design in the comments below!

I replaced a $50/month OCR API with Gemma 4’s native vision (4B model, local, free). Here’s the exact script + preprocessing trick. #gemma #google

stephen_sebastian_c85ea2b profile