Why AI agent teams are just hoping their agents behave

I’m 19, studying computer engineering in Brazil. A few weeks ago I was testing an AI agent with no restrictions. Just to see what it would do.

It was destructive.

Nothing permanent, I caught it. But it was the kind of moment where you sit back and think: what if I hadn’t been watching? What if this was running in production? What if someone else’s agent is doing this right now and nobody is watching?

That’s when I realized the problem. Everyone is racing to give agents more tools, more autonomy, more access. But nobody is building the layer that controls what they can actually do with it. The assumption is that a good prompt is enough. It isn’t.

The gap nobody is talking about

The AI agent space has exploded. LangChain, CrewAI, browser-use, OpenAI Agents SDK, the tooling for building agents has never been better. You can have an agent browsing the web, writing code, calling APIs, and moving files in an afternoon.

But here’s what I couldn’t find: a serious answer to “how do I control what my agent can actually do at runtime?”

The common answers I got:

  • “Write a good system prompt”
  • “Add some input validation”
  • “Just don’t give it dangerous tools”

These are not answers. These are hopes dressed up as engineering.

A good system prompt doesn’t stop an agent from being manipulated through prompt injection. Input validation doesn’t catch an agent that decides rm -rf ./old_stuff is a reasonable interpretation of “clean up.” And “don’t give it dangerous tools” directly contradicts the reason you’re using agents in the first place.

What actually needs to exist

The thing missing is embarrassingly simple: a policy layer that sits between your agent and the world.

Not prompt engineering. Not vibes. An actual enforcement layer that says:

  • This agent can read from ./workspace but cannot delete anything
  • This agent can call the OpenAI API but not your production database
  • This command requires a human to approve it before it executes
  • Everything gets logged, always

The goal isn’t to babysit every action manually, that defeats the purpose of automation. The goal is to define the boundaries once, enforce them automatically, and only surface the genuinely ambiguous decisions to a human.

This is what firewalls do for networks. This is what WAFs do for web apps. Agents need the same thing, and almost nobody is building it.

So I built it

I built AgentGuard, an open source runtime firewall for AI agents.

It’s a Go proxy that sits between your agent and its tools. You define policies in YAML. The proxy enforces them in real time, blocking, holding for approval, logging everything. It has adapters for LangChain, CrewAI, browser-use, and MCP. There’s a dashboard that shows you live what your agents are doing and lets you approve or deny actions with one click.

It’s not finished. The SQLite audit backend isn’t done. Some adapters are still rough. But the core works, and I think the core is the right idea.

GitHub logo

Caua-ferraz
/
AgentGuard

AgentGuard is a firewall for AI agents, preventing that any unwanted surprises go without supervision by your agent

AgentGuard

The firewall for AI agents.
Policy enforcement, real-time oversight, and full audit logging for autonomous AI systems

Quickstart •
Why AgentGuard •
Architecture •
Policy Engine •
Dashboard •
Adapters •
Setup Guide •
Contributing

The Problem

Every trending AI project is giving agents more autonomy — running shell commands, browsing the web, calling APIs, moving money, even performing penetration tests. But nobody is building the guardrails.

Right now, most teams deploying AI agents are just… hoping they behave.

AgentGuard fixes that.

Why AgentGuard

Without AgentGuard With AgentGuard
Agent runs rm -rf / — you find out later Policy blocks destructive commands before execution
Agent calls production API with no oversight Action paused, you get a Slack/webhook notification to approve
No record of what the agent did or why Full audit trail with timestamps, reasoning, and decisions
“It worked on my machine” debugging Query any agent session from the audit

…

In 5 days it’s been cloned by 165 unique developers with almost no active distribution. I think that says something about how real this problem is.

The thing I keep thinking about

Only 14.4% of organizations send AI agents to production with full security approval. 88% reported confirmed or suspected AI agent security incidents last year.

Everyone is moving fast. Nobody is building the guardrails.

I don’t know if AgentGuard is the right answer. But I’m pretty confident “hope” isn’t.

Claude Code + Telegram: How to Supercharge Your AI Assistant with Voice, Threading & More

The Problem with Claude Code’s Official Telegram Plugin

Claude Code’s official Telegram plugin does the basics: text messages in, text messages out. But if you’ve used it for more than a day, you’ve hit the walls:

  • No voice messages (talk to Claude from your phone? Nope)
  • No conversation threading in groups
  • No sticker/GIF support (Claude is confused by them)
  • No persistent memory across sessions
  • Crashes mean lost context

Enter claude-telegram-supercharged — a drop-in replacement that adds 15+ features without changing your existing bot setup.

What You Get

🎤 Voice Messages — Both Ways

This is the killer feature. Hold the mic button on Telegram, say “refactor the auth middleware to use JWT,” and Claude gets it as text via Whisper transcription. It can even reply with voice via ElevenLabs TTS.

Think of it as Wispr Flow for Claude Code. Walk your dog, talk to your AI assistant. No typing needed.

Transcription uses a smart fallback chain: OpenAI Whisper API → Groq → Deepgram → local whisper-cli. Set one API key and forget it.

🧵 Conversation Threading

In group chats, the plugin follows reply chains — it knows who said what and responds in the correct thread. Up to 3 levels deep. Forum topics are fully supported too, with each topic isolated.

💬 Persistent Memory

When you clear chat history, Claude saves a summary to disk first. On restart, that memory loads back in. Your assistant never truly forgets — context survives crashes, restarts, and /clear commands.

📦 Message Batching

Forward 20+ messages at once and they’re collected into one batch (5-second debounce), auto-summarized, then Claude responds to everything in one reply. Perfect for “summarize this group chat.”

🔄 Daemon Mode with Auto-Restart

The supervisor script manages Claude as a child process with:

  • Exponential backoff restart (1s → 2s → 4s → max 30s)
  • Context watchdog — auto-restarts at 70% context usage
  • Single-instance lock (no duplicate bots competing)
  • Signal-file protocol for clean restarts from Telegram

Say “clear everything” in chat → Claude saves memory → supervisor restarts with fresh context. Zero downtime.

More Features

  • Stickers & GIFs — animated stickers become multi-frame collages Claude can actually see
  • MarkdownV2 auto-escaping — no more broken formatting
  • Document support — PDFs, DOCX, CSV up to 10MB
  • Inline keyboard buttons — tappable choices for confirmations
  • Reaction status — 👀 read → 🔥 working → 👍 done
  • Telegraph Instant View — long responses published as native Telegram articles
  • Two-tier model routing — fast model for simple queries, Opus for complex ones
  • Google Calendar integration — check schedule, create events from chat
  • Scheduled messages — reminders and recurring tasks

Setup in 5 Minutes

Prerequisites

  • Bun runtime (curl -fsSL https://bun.sh/install | bash)
  • A Telegram bot token from @BotFather
  • Claude Code installed

Step 1: Install the Official Plugin

# Inside a Claude Code session
/plugin install telegram@claude-plugins-official

Step 2: Clone & Apply the Supercharged Version

git clone https://github.com/k1p1l0/claude-telegram-supercharged.git

# Copy the enhanced server over the official one
cp claude-telegram-supercharged/server.ts 
   ~/.claude/plugins/cache/claude-plugins-official/telegram/0.0.1/server.ts

# Install the daemon supervisor
mkdir -p ~/.claude/scripts
cp claude-telegram-supercharged/supervisor.ts 
   ~/.claude/scripts/telegram-supervisor.ts

Step 3: Configure Your Bot Token

# Inside Claude Code
/telegram:configure YOUR_BOT_TOKEN_HERE

Step 4: Launch

# Option A: Standard (with Telegram channel)
claude --channels plugin:telegram@claude-plugins-official

# Option B: Daemon mode (recommended — auto-restarts)
bun ~/.claude/scripts/telegram-supervisor.ts

Step 5: Pair

DM your bot on Telegram. It replies with a 6-character code. In Claude Code:

/telegram:access pair <code>

Done. Your next message reaches Claude.

Step 6: Lock It Down

Switch to allowlist mode so strangers can’t interact:

/telegram:access policy allowlist

Voice Setup (Optional but Worth It)

For the voice-to-Claude workflow, add your OpenAI key to ~/.claude/channels/telegram/.env:

OPENAI_API_KEY=sk-proj-...

That’s it. The plugin handles format conversion, chunking, and transcription automatically. For fully offline transcription, install whisper.cpp instead.

Always-On with macOS launchd

If you’re on a Mac and want the bot running 24/7 (surviving lid close, logout, and reboots), create a launchd plist:

# ~/Library/LaunchAgents/com.user.claude-telegram.plist

The repo’s README has the full XML template. Key settings: RunAtLoad: true, KeepAlive: true, wrapped with caffeinate -s to prevent sleep.

Why This Matters

The gap between “AI assistant in a terminal” and “AI assistant in my pocket” is huge. Most developers I know have Claude Code running but only use it at their desk. Voice messages + Telegram means you can:

  • Debug on the go — describe the error, get a fix suggestion while walking
  • Manage tasks — “schedule a reminder to review PR #42 tomorrow at 10am”
  • Quick lookups — “what’s the syntax for PostgreSQL UPSERT again?”
  • Group collaboration — add Claude to your team chat with proper threading

The supercharged plugin turns Telegram into a proper AI interface, not just a chat relay.

Links

Have you tried running Claude Code through Telegram? What’s your setup? Drop a comment below.

Harness as Code: Treating AI Workflows Like Infrastructure

Every AI coding session I’ve had follows the same arc: I open Claude/ChatGPT, explain what I want, go back and forth for 20 minutes, get something that mostly works, then close the tab. The code exists. The process that created it doesn’t.

Try reproducing that session tomorrow. Try reviewing the prompts your teammate used. Try version-controlling the “vibe” that made the AI generate good code that one time.

You can’t. And that’s the problem.

The IaC Parallel

Remember when deploying infrastructure meant clicking through the AWS console? You’d configure a load balancer, set up security groups, tweak auto-scaling — all by hand. It worked, until someone asked “can you do that again exactly the same way?” and the answer was always “probably.”

Then Terraform happened. Infrastructure as Code. Define everything in .tf files, run plan, run apply. Reproducible. Versionable. Reviewable. The console still exists, but serious teams don’t touch it.

AI-assisted development is at the “clicking around in the console” stage right now. We chat with AI, copy-paste code, manually verify, repeat. It works — until it doesn’t, and there’s no trail to debug.

What if AI workflows were defined in code? CLI commands. YAML configs. Shell scripts. No chat windows. No interactive sessions. Every step reproducible, every decision versionable.

I’m calling this Harness as Code.

CoDD: A Concrete Implementation

I built CoDD (Coherence-Driven Development) to test this idea. It’s a Python CLI that takes a Markdown spec and produces design documents and code through a deterministic pipeline.

pip install codd-dev

The full pipeline:

spec.md (your requirements in Markdown)
  → codd init                    # bootstrap project config
  → codd plan --init             # AI designs the document dependency graph
  → codd generate --wave 1..N   # generate design docs, wave by wave
  → codd validate                # quality gate: catch AI laziness
  → codd implement --sprint 1..M # generate code from design docs
  → codd assemble                # integrate fragments into a working project
  → build                        # standard build (npm, cargo, whatever)

No interactive AI chat at any step. Every AI call goes through claude --print — Claude Code CLI’s non-interactive STDIO mode:

claude --print --model claude-opus-4-6 --tools "" 
  "$(cat prompt.txt)"

Prompt in, text out. AI as a pure function. The ai_command in CoDD’s config defines how AI is called:

# codd.yaml
ai_command: claude --print --model claude-opus-4-6 --tools ""

Swap claude for any other CLI and the pipeline still works. CoDD doesn’t care which LLM you use — it only cares about stdin/stdout.

What “Coherence-Driven” Actually Means

Most AI code generators treat each prompt independently. CoDD chains design documents through explicit dependency graphs:

Requirements
  ├→ Acceptance Criteria        (Wave 1)
  ├→ ADR: Technology Stack      (Wave 1)
  │    └→ System Design          (Wave 2, depends on both above)
  │         ├→ Component Design   (Wave 3)
  │         └→ Task Flows         (Wave 3)
  │              └→ Implementation Plan (Wave 4)

When generating Wave 2’s System Design, the AI receives the full text of Wave 1’s outputs as context. The ADR says “static export only” → System Design respects React Server Component boundaries. Acceptance Criteria says “ARIA labels required” → Component Design specifies aria-pressed, focus traps, keyboard bindings.

Upstream decisions constrain downstream generation. That’s the coherence.

Real Numbers

I wrote a 37-line spec for a Todo app (Next.js 15, TypeScript strict, dark theme, localStorage):

# TaskFlow — Personal Todo App

## Functional Requirements
- Task CRUD: create, read, update, delete tasks
- Each task has: title, description (optional), due date (optional),
  priority (low/medium/high), completed status
- Task list with filtering by: status (all/active/completed), priority
- Inline task completion toggle (checkbox)
- Local state management (no backend, localStorage)

## UI Requirements
- Single-page app with responsive layout (mobile-first)
- Dark theme with accent color (#3b82f6)
- Floating action button opens a modal form
- Toast notifications on create/update/delete
- Keyboard shortcuts: Enter to submit, Escape to close modal

## Constraints
- Next.js 15 App Router with React Server Components
- Tailwind CSS
- TypeScript strict mode
- Deploy-ready as static export

Results:

Input Output
spec.md (37 lines) 6 design documents (1,353 lines)
102 code files (6,445 lines)
TypeScript strict mode build: zero errors

The generated design docs include Mermaid diagrams, component trees with RSC boundaries, state machine definitions, a full implementation plan with 17 sprints — all traceable back to the spec through dependency metadata.

Model Role Separation

Here’s where it gets interesting. The --ai-cmd flag lets you assign different models to different pipeline stages:

# Design docs — needs judgment, use Opus
codd generate --wave 1 
  --ai-cmd 'claude --print --model claude-opus-4-6 --tools ""'

# Code generation — needs volume, use Codex (or Sonnet)
codd implement --sprint 1 
  --ai-cmd 'codex --full-auto -q'

# Quality check — needs rigor, back to Opus
codd validate

Opus for architecture. Codex for implementation. Opus for QC. Each model plays to its strengths. You define this in a shell script, not through some proprietary orchestration layer.

Dynamic Pipelines (No Magic Numbers)

Wave and sprint counts depend on your spec — a complex app might have 8 waves and 40 sprints, a simple one might have 3 waves and 5 sprints. CoDD returns these counts for shell scripting:

waves=$(codd plan --waves)      # → 4
sprints=$(codd plan --sprints)  # → 17

So the full automation script has zero hardcoded values:

#!/bin/bash
set -e

codd init --requirements spec.md
codd plan --init

waves=$(codd plan --waves)
for wave in $(seq 1 $waves); do
  codd generate --wave $wave
done

codd validate

sprints=$(codd plan --sprints)
for sprint in $(seq 1 $sprints); do
  codd implement --sprint $sprint
done

codd assemble

Change the spec, run the same script. Different wave structure, different sprint count, same pipeline. This is what I mean by Harness as Code — the workflow is defined in code, adapts to input, and needs no human adjustment.

Adding Human Checkpoints

Full automation is one mode. Sometimes you want to review before proceeding:

#!/bin/bash
set -e

codd init --requirements spec.md
codd plan --init
waves=$(codd plan --waves)

# Generate wave 1, then pause for human review
codd generate --wave 1
echo "Review acceptance criteria and ADR in docs/"
echo "Press Enter to continue, Ctrl+C to abort"
read

# Remaining waves run automatically
for wave in $(seq 2 $waves); do
  codd generate --wave $wave
done

codd validate

sprints=$(codd plan --sprints)
for sprint in $(seq 1 $sprints); do
  codd implement --sprint $sprint
done

codd assemble

Human-in-the-loop is just read in a shell script. No special API. No webhook configuration. Just standard Unix.

Quality Gates

AI models cut corners when they can. codd validate catches:

Check Why
TODO/TBD detection AI writes “TODO: implement later” and moves on
Meta-commentary removal “The following section will describe…” — no it won’t, it’s empty
Section structure Required sections (Overview, Architecture) must exist
Mermaid diagrams Detailed design without diagrams gets rejected
Dependency consistency depends_on references in frontmatter must resolve

Validation failures block the pipeline. Fix and regenerate, or the build doesn’t proceed. Same idea as terraform validate — catch problems before they propagate.

The Comparison

Interactive AI Chat Harness as Code (CoDD)
Reproducible No Yes — same spec, same pipeline
Versionable No Yes — spec + config in git
Reviewable No Yes — PR the spec, review the diff
Model-switchable Manual Per-step via --ai-cmd
CI/CD compatible No Yes — it’s just shell commands
Human checkpoints Always (you’re the human) Optional (read where needed)

What I Learned

Spec quality is the bottleneck. My first spec for the Todo app had no UI requirements — the result looked functional but ugly. Adding 10 lines of UI spec (dark theme, FAB, toast notifications, keyboard shortcuts) transformed the output. CoDD faithfully expands what you write. It won’t invent what you don’t.

AI laziness is real and predictable. Without quality gates, roughly 15-20% of generated design documents contain TODOs or placeholder sections. The validate step catches all of them.

The “wave” abstraction matters. Generating all design docs in one shot produces inconsistencies. Generating them in dependency order, with upstream docs as context, produces documents that actually reference each other correctly.

Try It

pip install codd-dev
codd init --requirements spec.md
codd plan --init

The repo is here: github.com/yohey-w/codd-dev

CoDD is early (v1.1.0, ~900 weekly PyPI downloads), but the pipeline works end-to-end. The 37-line spec to working TypeScript app isn’t a demo — it’s the actual workflow I use.

If Terraform taught us that infrastructure belongs in code, maybe it’s time to accept that AI workflows do too.

What does your AI development workflow look like? Is it reproducible?

Untangling Data Relationships: Why Traditional Methods Fail and Algorithms Are the Only Solution

A Typical System Migration Nightmare
You’re handed a legacy system migration project - ERP cloud migration, data consolidation into a new data warehouse. Documentation? Non-existent. No one remembers a system built a decade ago. The original team is long gone, leaving nothing but a production database black box.

You start digging for a data dictionary - only to find there isn’t one. You’re left to figure it out alone: Which table is the customer master? How do orders link to products? What on earth do those ref_-prefixed fields point to?

A week in, you’ve painstakingly mapped relationships for 50 tables. But the system has 2,000 - and the business team is breathing down your neck for a go-live. You start to wonder: Why in 2026 are we still using primitive methods to understand data relationships?

This isn’t a hypothetical scenario - it’s the daily reality of data engineering. The root cause isn’t technology, but that our understanding of data relationships is still stuck in the manual age.

The Core Pain: Lost Organizational Knowledge

When key team members leave, the implicit connections between systems disappear with them - this isn’t a tech problem, it’s a problem of lost organizational knowledge.

There are three traditional fixes, and all fall short:

1. Dig through documentation
The issue: Legacy systems have no docs at all, or docs that are a decade out of date. You’re relying on obsolete paper memories, not the data itself.

2. Consult subject matter experts (SMEs)
The issue: When SMEs are on staff, relationships live only in their heads; when they leave, organizational amnesia is inevitable. You try to rebuild relationships through interviews, but human memory is unreliable, and knowledge transfer is painfully inefficient.

3. Reverse-engineer code
The issue: Business logic is often hardcoded in stored procedures, ETL scripts, or application code - you can’t deduce it from table schemas alone.

Worse, even if you nail the mappings this time, what happens when the business changes? Map everything manually all over again? Maintenance costs skyrocket exponentially.

The central conflict: Data relationships evolve dynamically with business needs, but our methods for understanding them remain static and manual.
Why “Guessing Field Names” Is Doomed to Fail

A core assumption of traditional methods is that field naming is consistent - e.g., customer_id must point to the customer table. But the real world doesn’t play by these rules:

• cust_ref, cust_id, and customer_no might all reference the same table

• The same field name can mean something entirely different across systems

• Many relationships have no foreign key constraints, or constraints are disabled

• Field naming devolves into chaos as systems evolve over time

You try regex matching and rule engines to guess - but accuracy never hits a usable threshold. Why?

Because you’re trying to infer semantics from syntax - and data is the only true carrier of semantics.

A field’s real meaning isn’t in its name, but in the values it actually stores. Do customer_ref in the orders table and cust_id in the customer table relate? Compare their value ranges - if every customer_ref in the orders table exists in the customer table’s cust_id, that’s a real relationship, regardless of naming.

Algorithm-Driven: From “Guessing Names” to “Analyzing Content”
No more relying on metadata - analyze data content and characteristics directly.

Inclusion (Containment Relationships): Identify Master Tables

The most common relationship is one-to-many: an order’s customer_id is always a subset of the customer master table. The algorithm is straightforward:

  1. Calculate the distinct set of customer_id in the orders table (Set A)

  2. Calculate the distinct set of id in the customer table (Set B)

  3. Measure the percentage of Set A that exists in Set B (inclusion ratio)

An inclusion ratio ≥90% signals a strong relationship; 100% means full containment, enabling automatic merging.

This changes everything: You don’t care what fields are called. The algorithm tells you Field X in the orders table is a subset of Field Y in the customer table - and builds the relationship automatically.

Equivalence (Identical Entities): Uncover Different Labels for the Same Thing

Sometimes two tables store the exact same entity, with entirely different field names. For example:

• User table: user_id = “U10001”, “U10002”

• Customer table: customer_code = “U10001”, “U10002”

This is an equivalence relationship! The algorithm checks bidirectional inclusion ratios, detects near-perfect overlap, and links them automatically.

This is a game-changer for cross-system integration: Different systems follow different naming standards, but store the same core entities.

Hierarchical Patterns: Streamline Dimensional Modeling

Some relationships aren’t direct - they’re hierarchical. For example:

• Department code: 01.01.003

• Team code: 01.01.003.001

By analyzing code structures, the algorithm uncovers hierarchical dependencies and streamlines data warehouse dimensional modeling - something that once required manual validation, now fully automated.

Quantify Relationships: From “Gut Feel” to Hard Metrics

The biggest flaw of traditional methods is that they’re unquantifiable: You think two tables are related, but how strongly? No one can say for sure.

Arisyn introduces a four-dimensional assessment framework:

• Distinct record count in the master table

• Distinct record count in the contained table

• Co-occurrence frequency

• Inclusion ratio (the critical metric)

Relationships are no longer subjective “gut feelings” - they’re objective, weighted metrics:

For engineering teams, this means automation rules: Relationships with a ≥90% ratio are auto-added to the data graph; those with <90% go to a manual review queue. Data engineering becomes scalable - no longer dependent on the intuition of a handful of experts.

Cross-Source Discovery: Break Down Data Silos

The most painful scenario is cross-system integration: Orders live in MySQL, customers in Dameng, products in Oracle. Manually mapping relationships means jumping between three systems, wasting hours on context switching.

Algorithms shine here because they’re natively cross-source: They don’t care where data lives - only what it contains.

Arisyn automatically identifies the inclusion relationship between orders.cust_ref (MySQL) and customers.cust_id (Dameng), building a 100% reliable link. You see a complete cross-system lineage on the data graph, with auto-generated SQL - an experience impossible with traditional tools.
Real-world manufacturing use case: 8 heterogeneous data sources, 2,000+ tables. The algorithm uncovered 3,000+ relationships - 800+ of them cross-source. A manual effort would take at least 3 months; the algorithm did it in hours.

Engineering Challenges: Why This Isn’t Easy

The algorithm sounds simple, but production implementation comes with massive challenges:

  1. Massive data volume
    Enterprise environments have thousands of tables and tens of thousands of fields. A brute-force pairwise comparison is O(n²) - requiring parallel computing, incremental updates, and intelligent sampling to optimize performance.

  2. Poor data quality
    Legacy data is riddled with dirty data, nulls, and outliers. Algorithms need robust error handling - e.g., noise tolerance for inclusion ratio calculations.

  3. Real-time requirements
    Business systems change constantly; relationships discovered today may shift tomorrow. Incremental update mechanisms are a must - no more full recalculations every time.

Arisyn is built on a cloud-native architecture, supporting high-concurrency, low-latency real-time computing - with relationship discovery completed in minutes.

Value from a Data Engineer’s Perspective

You might be asking: Is this really better than manual work? For data engineers, the benefits are undeniable:

• Efficiency: From weeks/months to minutes/hours - a quantum leap, not just a small improvement.

• Accuracy: Objective judgments based on data content, eliminating human memory errors and omissions.

• Maintainability: Auto-incremental updates for data changes - no more manual syncs.

• Scalability: Algorithm complexity remains manageable as you scale from 10 tables to 2,000; manual work becomes unfeasible as volume grows linearly.

Most importantly: You move from a bottleneck model dependent on a few experts to an engineered model with reproducible algorithms. Data capabilities are no longer the “secret sauce” of a handful of senior team members - they become scalable, standardized infrastructure.
Conclusion

Data relationship discovery isn’t a new problem - but we’ve been solving it the hard way for 20 years.

Technological evolution never comes from making old tools faster - it comes from paradigm shifts: Like moving from horse-drawn carriages to steam engines, it’s not about better horses, but a completely new power source.

Algorithm-driven data relationship discovery is, at its core, a shift from understanding data based on human experience to understanding it based on data and algorithms. This isn’t just an efficiency boost - it’s an evolution of organizational capability.

When we turn data relationships from a black box to a white box, from implicit to explicit, from unquantifiable to measurable - data becomes a true asset, not a burden.

Data engineering still has a long road ahead - but at this critical step, we’re finally leaving the manual age behind.

I Built a 13,000-Title Arabic Streaming Guide in 4 Weeks With Claude AI

I built Shoof Aflam — an Arabic streaming guide with 13,400+ titles across 17 platforms — in under a month. The secret? I coded the entire thing with Claude (Anthropic’s AI), pair-programming every component from data pipelines to SEO optimization. Here is the real, honest story.

How It Started

I had a simple problem: there was no Arabic equivalent of JustWatch. If you wanted to know where to legally watch an Arabic movie or series, you had to check every platform manually. No centralized guide existed.

Instead of spending months planning architecture, I opened Claude Code and started building. The entire project — from first commit to 13,400 indexed titles — took about 4 weeks of intensive pair-programming sessions.

The Stack (Built With Claude)

  • Next.js 16 with full static export — ~7,000 pre-rendered HTML pages
  • TypeScript 5 strict mode
  • Tailwind CSS 4 for RTL-first Arabic design
  • Python 3 scripts for TMDB/YouTube/Wikipedia data collection
  • 129 Vitest tests enforced as pre-build gate
  • Nginx + Cloudflare on a single Hetzner VPS (not Vercel)

Every line of code was written in collaboration with Claude. I described what I wanted, Claude wrote the implementation, I reviewed and iterated. Some components went through 5-6 revisions in a single session.

What Claude Actually Built

Here is what we built together, honestly:

Data pipeline — 10+ Python scripts that:

  • Mass-discover Arabic titles from TMDB API (went from 424 to 13,400+ titles)
  • Enrich with cast, crew, trailers, ratings, production data
  • Fetch Arabic overviews and translate English ones via Google Translate
  • Pull Wikipedia Arabic extracts for cultural context
  • Generate unique FAQ entries from real title data (98.6% unique across 64,800 entries)
  • Collect YouTube review comments with optimized API quota management

SEO system — Claude ran multiple audit rounds and fixed everything:

  • Schema.org JSON-LD for 11 entity types with sameAs links to IMDB/TMDB
  • Dynamic title tags, featured snippet blocks, OG meta
  • Thin content detection and noindexing (went from 43% thin to 0%)
  • Content enrichment bringing pages from ~50 words to ~190 words average
  • HTTP/2, lazy-loaded search index, LCP optimization

Outreach automation — A complete system running on the VPS:

  • Automated discovery of guest post blogs
  • Email outreach with personalized pitches
  • Backlink monitoring with Telegram notifications
  • All running via cron, zero manual intervention

The Data: Real Numbers

Metric Value
Total titles 13,426
Indexed pages 11,766
With Arabic overview 98%
Production data coverage 99.8%
Wikipedia facts 1,400+
Unique FAQ entries 64,813
Vitest tests 129
Static pages generated ~7,000
Build time ~13 seconds

Lessons From AI Pair-Programming

What worked great:

  • Claude excels at generating boilerplate, test suites, and data processing scripts
  • Running multiple Claude agents in parallel (5-6 at once) for SEO audits was incredibly productive
  • Claude caught issues I would have missed — like uploadDate missing from VideoObject schema, or FAQ answers being 88.7% duplicates

What needed human judgment:

  • Deciding what to noindex vs keep (content quality is subjective)
  • Evaluating whether outreach emails sound natural
  • Choosing which data to trust (TMDB has gaps for Arabic content)
  • Strategic decisions: which platforms to target, what content adds real value

What Claude got wrong:

  • Initially generated overview descriptions that were too templated
  • Some SEO recommendations conflicted with AdSense compliance
  • Automated provider refresh found zero MENA data (TMDB/JustWatch dont cover Arabic streaming)
  • A few agents tried to build spam-like systems that I had to reject

The Hardest Part: Platform Data

The biggest unsolved problem: 80% of titles have no streaming platform data. TMDB and JustWatch have almost zero coverage for Arabic content in MENA regions. The data simply doesnt exist in any API. Getting real platform coverage requires scraping individual platform catalogs — Shahid, WatchIT, OSN+ — which is a separate engineering challenge.

SEO Results (Honest Assessment)

After the full SEO overhaul:

  • Google organic traffic: still low (~10/day) — the site is new
  • Technical SEO: excellent (all schema valid, no errors in GSC)
  • Content quality: dramatically improved but still 58% of pages under 200 words
  • The real test will be over the next 2-3 months as Google recrawls

Try It

The entire codebase was built with Claude in about 4 weeks. If you are considering AI pair-programming for a side project, my advice: it works remarkably well for data-heavy, SEO-focused static sites. Just keep your human judgment engaged for quality and strategic decisions.

Alex Nitrovic builds shoofaflam.tv, the largest Arabic streaming guide. The project was built entirely with Claude (Anthropic) as an AI pair-programming partner.

💰I Built a Token Billing System for My AI Agent – Here’s How It Works

I’ve been building an AI agent that routes requests across multiple LLM providers, OpenAI, Anthropic etc., based on the task. But pretty quickly, I hit a real problem: how do you charge for this fairly?

Flat subscriptions didn’t make sense. Token costs vary by model, input vs output, and actual usage. A user generating a two-line summary isn’t the same as someone churning out 3,000-word articles, yet flat pricing treats them the same.

I looked at a few options for usage-based billing. Stripe Billing has metered subscriptions but you have to build your own token tracking pipeline on top. Orb and Metronome are good, but they’re separate vendors, you’d still need something to capture token data from your LLM calls and pipe it in. What I wanted was something at the gateway level, where the traffic already flows.

I ended up using Kong AI Gateway with Konnect Metering & Billing (built on OpenMeter). The gateway proxies every LLM request, so it already knows the token counts. The metering layer plugs directly into that. No separate vendor, no custom pipeline.

So instead of debating about pricing models, I set up the billing layer. A working system where every API request flows through a gateway, gets tracked, and is priced based on real usage:

  1. 🚧 Route requests through AI Gateway
  2. 🪙 Tokens get metered per consumer
  3. 💵 Pricing gets applied
  4. 🧾 Invoice generated

Here’s the whole setup, step by step.

  • Set up the gateway
  • Step 1: Create a consumer
  • Step 2: Configure the AI Proxy
  • Step 3: Enable token metering
  • Step 4: Create a feature
  • Step 5: Create a plan with a rate card
  • Step 6: Create a subscription
  • Step 7: Validate the invoice
  • Step 8: Connect Stripe

The Setup

The billing pipeline has three layers:

Kong AI Gateway proxies the LLM requests. It sits between the app and the provider, handles auth, and this is the part that matters for billing, it logs token statistics for every request.

Konnect Metering & Billing (this is built on OpenMeter) takes those token events and aggregates them per consumer, per billing cycle. It supports defining features, pricing models, and plans on top of the raw usage data.

Stripe collects payment. The metering layer generates invoices that sync to Stripe.

Let me walk through each piece.

Prerequisites

You can do this entirely through the UI or via CLI. I’ll cover both as we go.

  1. A Kong Konnect account
  2. An OpenAI API key (or any LLM provider key of your choice)

For CLI, you’ll also need decK (v1.43+) installed and a PAT from Kong Konnect.

Set Up the Gateway

Once you log in, click on API Gateway and create one.

I’m using Serverless here. You can choose Self-managed too. Enter the gateway name as ai-service and click Create and configure. Once that’s done, click Add a service and route and fill in:

  • Service Name: ai-service
  • Service URL: http://httpbin.konghq.com/anything
  • Route Name: ai-chat
  • Route Path: /chat

CLI

If you prefer the command line, generate your PAT and run:

export KONNECT_TOKEN='your_konnect_pat'
curl -Ls https://get.konghq.com/quickstart | bash -s -- 
  -k $KONNECT_TOKEN --deck-output

This gives you a running Kong Gateway connected to Konnect. It’ll output some environment variables, export them as instructed. You’ll also need:

export DECK_OPENAI_API_KEY='your_openai_api_key'

Then set up the service and route:

_format_version: "3.0"
services:
  - name: ai-service
    url: http://httpbin.konghq.com/anything
routes:
  - name: ai-chat
    paths:
      - "/chat"
    service:
      name: ai-service

Apply it with deck gateway apply. Now you have a route at /chat that we’ll wire up to an LLM.

Step 1: Create a Consumer

You can’t bill anyone if the gateway doesn’t know who is making the request. Consumers are how Kong identifies API callers. Later, we’ll map each consumer to a billing customer.

Add a consumer with a key-auth credential:

You can enter the Key value as acme-secret-key.

Now, you need to add the key-auth plugin to the service so the gateway actually requires authentication:

  1. Click on Plugins in the left sidebar
  2. Click on New Plugin
  3. Select Key Authentication from the plugin list
  4. Select Service as the scope or keep it as Global
  5. Click Save

CLI

_format_version: "3.0"
consumers:
  - username: acme-corp
    keyauth_credentials:
      - key: acme-secret-key

Then enable the key-auth plugin on the service so the gateway actually requires authentication:

_format_version: "3.0"
plugins:
  - name: key-auth
    service: ai-service
    config:
      key_names:
        - apikey

Apply both with deck gateway apply.

Now every request to /chat must include an apikey header. The gateway identifies the caller as acme-corp, and that identity flows through to metering. Without this step, usage events have no subject. They’re anonymous, and you can’t attribute them to anyone.

Step 2: Configure the AI Proxy

Next, wire the route to an actual LLM. The AI Proxy plugin accepts requests in OpenAI’s chat format and forwards them to the configured provider.

  1. Navigate to Plugins
  2. Click on New Plugin
  3. Select AI Proxy from the plugin list

Following the below yaml for CLI and configure the plugin fields accordingly:

_format_version: "3.0"
plugins:
  - name: ai-proxy
    config:
      route_type: llm/v1/chat
      auth:
        header_name: Authorization
        header_value: Bearer ${{ env "DECK_OPENAI_API_KEY" }}
      model:
        provider: openai
        name: gpt-4o
      logging:
        log_payloads: true
        log_statistics: true

Two things to note here:

log_statistics: true is what makes billing possible. Without it, the gateway proxies requests but doesn’t record token counts. When enabled, it captures prompt tokens, completion tokens, and total tokens on every response. This is the data that metering consumes downstream.

log_payloads: true logs the actual request/response content. This is optional and useful for debugging, but you’d probably turn it off in production for privacy reasons.

Apply with deck gateway apply and test:

curl -X POST "$KONNECT_PROXY_URL/chat" 
  -H "Content-Type: application/json" 
  -H "apikey: acme-secret-key" 
  --json '{
    "messages": [
      {"role": "system", "content": "You are a mathematician."},
      {"role": "user", "content": "What is 1+1?"}
    ]
  }'

You should get a response from GPT-4o. The gateway handled auth, forwarded the request, and logged the token statistics.

If you want to proxy multiple providers (say, OpenAI and Anthropic with automatic failover), you’d use [ai-proxy-advanced](https://developer.konghq.com/plugins/ai-proxy-advanced/) instead with a load balancing config. I stuck with a single provider here to keep the billing walkthrough focused.

Step 3: Enable Token Metering

Now we connect the gateway’s token logs to the metering system.

In Konnect, go to Metering & Billing in the sidebar. You’ll see an AI Gateway Tokens section. Click Enable Related API Gateways, select your control plane (the quickstart one), and confirm.

This activates a built-in meter called kong_konnect_llm_tokens. It uses SUM aggregation on the token count, grouped by:

  • $.model : which LLM handled the request
  • $.type : whether the tokens are input (request) or output (response)

The grouping matters because LLM providers charge differently for input vs. output tokens. Output tokens are typically 3-5x more expensive because input can be parallelized across GPUs while output generation is sequential, each token depends on all previous tokens. If your metering doesn’t split these, your pricing will be wrong.

At this point, every authenticated request through the AI Gateway generates a usage event that gets aggregated by the meter. But usage alone doesn’t generate invoices. You need to define what’s billable and how it’s priced.

Step 4: Create a Feature

A feature is the link between raw metered data and something that appears on an invoice. Without it, usage is tracked but never billed.

Go to Metering & Billing → Product Catalog → Features and create one:

  • Name: ai-token
  • Meter: AI Gateway Tokens
  • Group by filters:

    • Provider = openai
    • Type = request (this tracks input tokens; you’d create a separate feature for output tokens if you want to price them differently)

The filters narrow the meter to a specific slice of usage. In a real setup, you’d likely create multiple features, one per model, one per token direction, to apply different rates. For this walkthrough, I’m keeping it to one feature to show the flow.

Step 5: Create a Plan with a Rate Card

Plans bundle features with pricing. Go to Product Catalog → Plans and create one:

  • Name: Starter
  • Billing cadence: 1 month

Add a rate card:

  • Feature: ai-token
  • Pricing model: Usage Based
  • Price per unit: 1
  • Entitlement type: Boolean (grants access to the feature)

A note on what “price per unit” means here: 1 unit = 1 token, because the meter SUMs individual tokens. So entering 1 means $1.00 per token, which is way too expensive for real use. I’m using it here because the official tutorial does the same thing: a round number that makes invoice changes easy to spot during testing.

For production, you’d enter something like 0.000003 for GPT-4o input tokens ($3.00 per 1M tokens) or 0.00001 for GPT-4o output tokens ($10.00 per 1M tokens). There’s no “per 1,000” toggle in the UI. You do the math yourself and enter the per-token price as a decimal.

Publish the plan. It’s now available for subscriptions.

Step 6: Create a Customer and Start a Subscription

This is where the consumer from Step 1 connects to the billing system.

Go to Metering & Billing → Billing → Customers and create one:

  • Name: Acme Corp
  • Include usage from: select the acme-corp consumer

This mapping is what ties gateway traffic to a billable entity. The consumer handles identity at the gateway level; the customer handles identity at the billing level. They’re separate concepts joined here.

Now create a subscription:

  • Go to the Acme Corp customer, then Subscriptions → Create a Subscription
  • Plan: Starter
  • Start the subscription

One important detail: metering only invoices events that occur after the subscription starts. If you sent test requests before creating the subscription, those tokens won’t appear on any invoice. I spent some time confused by this before finding it in the docs.

Step 7: Validate the Invoice

Send a few requests through the gateway:

for i in {1..6}; do
  curl -s -X POST "$KONNECT_PROXY_URL/chat" 
    -H "Content-Type: application/json" 
    -H "apikey: acme-secret-key" 
    --json '{
      "messages": [
        {"role": "user", "content": "Explain what a Fourier transform does in two sentences."}
      ]
    }'
  echo ""
done

Wait a minute or two for the events to propagate, then go to Metering & Billing → Billing → Invoices. Click on Acme Corp, go to the Invoicing tab, and hit Preview Invoice.

You should see the ai-token feature listed with the aggregated token count and the calculated charge based on your rate card. That’s the billing pipeline working end to end, from an API request to a line item on an invoice.

Connecting Stripe

Konnect syncs invoices to Stripe, which handles payment collection, receipts, and retry logic for failed payments. You connect your Stripe account in the Metering & Billing settings, and invoices flow through automatically at the end of each billing cycle.

The result for end users is a transparent invoice showing exactly what they consumed: token count, model, rate applied. Not a flat fee with no breakdown.

## Things I Ran Into

The consumer-customer mapping confused me at first. Kong Gateway has “consumers” (API identity). Metering & Billing has “customers” (billing identity). They’re separate. You create both, then link them. If you skip the consumer or forget to link it, usage events come in but they’re not attributed to anyone billable. Set this up before you start sending traffic.

Input vs. output pricing is a bigger deal than I expected. Output tokens from OpenAI’s GPT-4o cost $10.00/1M vs. $2.50/1M for input. If you use a single flat rate for “tokens,” you’ll underprice output-heavy workloads significantly. Splitting features by token type (request vs. response) and pricing them separately is worth the extra configuration.

The order of operations matters. Specifically: create the consumer and link it to a customer before you start sending traffic you care about billing for. Events that arrive before a subscription exists don’t retroactively appear on invoices.

Where I’d Take This Next

This walkthrough uses a single provider and a single feature. A production setup would look more like:

  • Multiple features: one per model per token direction (GPT-4o input, GPT-4o output, Claude input, Claude output)
  • Tiered pricing: lower per-token rates at higher usage thresholds to incentivize growth
  • Entitlements with metered limits: cap total tokens per month per plan tier, so you can offer Starter (500K tokens), Pro (5M tokens), Enterprise (unlimited)
  • AI Proxy Advanced: route across multiple providers with load balancing (lowest-latency, round-robin, or cost-based routing)

The docs for all of these are at developer.konghq.com/metering-and-billing and developer.konghq.com/ai-gateway.

If you’re building an AI agent and thinking about how to charge for it, I’d be curious to hear your approach. Per-token, credits, flat rate? What’s working, what’s not? Drop your thoughts in the comments.

ORCHESTRATE v3.1 UAT — How AI Agents Tested Their Own Marketing Platform

ORCHESTRATE v3.1 UAT — How AI Agents Tested Their Own Marketing Platform

We just shipped v3.1 of the ORCHESTRATE marketing platform and ran a full User Acceptance Test — not with human testers, but with the same AI agents that built it.

What is ORCHESTRATE?

ORCHESTRATE is a multi-channel content publishing platform that manages LinkedIn pages, Reddit posts, Dev.to blogs, YouTube uploads, and Printify merch — all from a single MCP (Model Context Protocol) server. It runs 100+ tools across 10 capability areas, orchestrated by AI agents following a rigorous agile methodology.

The UAT Process

For Sprint 13, we ran the platform through its paces:

  1. Blog Publishing — Created and published articles to Dev.to via MCP tools
  2. Trending Topic Discovery — Scanned Reddit for trending AI/automation topics
  3. Product Promotion — Pulled real product mockups from our Printify store and created targeted LinkedIn posts
  4. Video Production — Generated a narrated YouTube video entirely through AI: script generation, Piper TTS narration, ffmpeg video assembly, and YouTube upload
  5. Cross-Platform Distribution — Published the same content across LinkedIn, Reddit, Dev.to, and YouTube simultaneously

The Tech Stack

  • Backend: Node.js REST API (port 3847) + MCP HTTP server (port 3848)
  • Frontend: React + Vite + Tailwind
  • AI Orchestration: MCP (Model Context Protocol) with 100+ registered tools
  • Audio: Piper TTS sidecar (port 8500) for narration
  • Video: ffmpeg in Docker for video assembly
  • Merch: Printify API integration for product management
  • Infrastructure: Docker Compose, single container deployment

Watch the UAT Video

We recorded the entire UAT experience as a narrated YouTube video:

The video was produced entirely by AI agents — from script generation to TTS narration to video assembly to YouTube upload.

What We Learned

Running UAT with AI agents revealed something interesting: the agents are better at systematic testing than ad-hoc exploration. They follow the acceptance criteria precisely, hit every endpoint, and document everything. But they don’t stumble onto edge cases the way a human tester might.

The solution? Combine AI-driven systematic UAT with human exploratory testing. Let the agents handle the regression suite while humans focus on the unexpected.

Try It Yourself

The ORCHESTRATE platform is built on open protocols (MCP) and standard tooling. If you’re building AI-powered content pipelines, the key insight is: treat your AI tools as first-class citizens in your CI/CD pipeline, not as ad-hoc helpers.

Shop merch: iamhitl.com
Follow the journey: I Am HITL on Dev.to

Microsoft ECIF Funding vs Other Cloud Incentives: Which One Delivers Real Value?

Adopting AI and cloud technologies is no longer optional—it’s essential for staying competitive. Yet, for many organizations, the biggest challenge isn’t strategy or technology—it’s the AI adoption cost. From infrastructure setup to skilled resources, the financial burden can slow down innovation.
This is where funding programs and cloud incentives come into play. Among them, Microsoft ECIF funding stands out as a strategic option. But how does it compare with other cloud incentives available in the market? More importantly, which one aligns best with your business goals?
Let’s explore.

What Is Microsoft ECIF Funding?
Microsoft ECIF funding (End Customer Investment Funds) is a program designed to help organizations accelerate their adoption of Microsoft technologies, especially AI and cloud solutions.
Unlike generic incentives, ecif funding is focused on delivering real business outcomes. It supports:
AI and cloud solution deployment
Proof of Concept (PoC) development
Microsoft Copilot adoption
Azure-based digital transformation initiatives
By reducing the AI adoption cost, ECIF enables businesses to move from idea to implementation faster and with less financial risk.

Understanding Other Cloud Incentives
Most cloud providers offer incentives to attract new customers and encourage platform usage. These typically include:

  1. Cloud Credits
    Free or discounted credits to explore services and run initial workloads.
  2. Startup and Innovation Programs
    Packages designed for startups that include credits, mentorship, and technical resources.
  3. Migration Support
    Financial incentives to help businesses shift from on-premise systems to the cloud.
  4. Training and Certification Offers
    Access to courses and certifications at reduced or no cost.
    While useful, these options are often broad and not always aligned with specific business outcomes.

Microsoft ECIF Funding vs Other Cloud Incentives
Let’s compare these options across key factors that matter to decision-makers.

Purpose and Strategic Focus
Microsoft ECIF funding is designed to support real-world implementation. It prioritizes projects that deliver measurable ROI, especially in AI adoption.
In contrast, other incentives often focus on onboarding and experimentation. They help you get started but may not support long-term execution.
👉 If your goal is to reduce AI adoption cost while achieving tangible outcomes, ecif funding offers a more strategic advantage.

Customization and Expert Support
One of the biggest strengths of Microsoft ECIF funding is its tailored approach. Businesses work with certified partners to design and execute solutions aligned with their goals.
Other cloud incentives are usually standardized. While they provide flexibility, they lack personalized guidance.
👉 This makes ecif funding ideal for organizations that need structured support and expertise.

Financial Impact and ROI
ECIF funding can cover a significant portion of project costs, reducing upfront investment and risk. It is designed to optimize long-term value.
On the other hand, most cloud incentives offer limited, short-term savings—such as credits that expire or only apply to specific services.
👉 For businesses concerned about AI adoption cost, ECIF delivers better long-term ROI.

Accessibility and Requirements
Other cloud incentives are easier to access. You can often sign up and start using them immediately.
However, Microsoft ECIF funding requires:
A defined project scope
A clear business use case
Collaboration with a Microsoft partner
👉 While this may seem complex, it ensures that funding is used effectively and delivers real impact.

Benefits of Microsoft ECIF Funding
Organizations leveraging Microsoft ECIF funding gain several advantages:
Accelerated Deployment: Faster implementation of AI and cloud solutions
Cost Optimization: Significant reduction in AI adoption cost
Lower Risk: Financial support minimizes experimentation risks
Expert Guidance: Access to experienced partners for execution
Scalable Solutions: Build solutions that grow with your business

Real-World Use Cases
Here’s how companies are using ecif funding to drive innovation:
Customer Support Automation
Deploy AI-powered chatbots to handle queries efficiently and reduce operational costs.
Data-Driven Decision Making
Build advanced analytics dashboards using cloud-based AI tools.
Workflow Automation
Automate repetitive processes to improve productivity and reduce manual effort.
Sales and Marketing Optimization
Use AI insights to personalize customer experiences and increase conversions.
In each case, Microsoft ECIF funding helps lower the AI adoption cost while delivering measurable business value.

When Should You Consider Other Cloud Incentives?
Other cloud incentives may be suitable if:
You are in the early exploration phase
You want to test multiple cloud platforms
You need quick access to free credits
However, these options are often limited when it comes to scaling and achieving long-term ROI.

How to Choose the Right Option
Before deciding, ask yourself:
Do I have a clear AI or cloud use case?
Am I focused on long-term ROI or short-term savings?
Do I need expert guidance for implementation?
Is reducing AI adoption cost a top priority?
If your answer leans toward structured growth and measurable outcomes, Microsoft ECIF funding is the better choice.

Conclusion: Invest Smartly in Your AI Future
Choosing between Microsoft ECIF funding and other cloud incentives is not just about cost—it’s about value. While other incentives can help you get started, ecif funding empowers you to scale, innovate, and achieve real business results.
It reduces the AI adoption cost, provides expert support, and ensures your investment delivers measurable ROI.

Take the Next Step
Ready to unlock the full potential of Microsoft ECIF funding?
Explore how your business can benefit from tailored funding opportunities or enhance your expertise with industry-recognized certifications.
👉 Visit Adoptify.ai to learn more about ECIF funding and certification programs—and start your journey toward smarter, faster AI adoption today.

Claude Code 소스코드를 뜯어봤다

더 많은 글은 radarlog.kr에서.

Claude Code의 소스코드가 유출됐다. TypeScript 파일 1,884개, 총 31MB.

누군가 이미 Mintlify로 깔끔한 문서 사이트를 만들어서 공개했는데, 거기에 정리된 환경변수는 30개다. 소스코드에는 195개 있다. 문서화된 슬래시 커맨드는 20개 남짓이다. 소스코드에는 80개 이상 있다.

문서에 없는 나머지는 뭘까. 직접 뜯어봤다.

소스코드의 전체 구조

압축을 풀면 src/ 하나에 모든 게 들어 있다. 게임 프로젝트처럼 폴더 구조가 역할별로 깔끔하게 나뉘어 있다.

src/
├── tools/          (2.8MB) — 40개의 도구 정의
├── components/     (9.5MB) — Ink 기반 터미널 UI
├── commands/       (2.8MB) — 80+ 슬래시 커맨드
├── services/       (1.9MB) — API, MCP, 분석, 컴팩트
├── hooks/          (1.3MB) — React 훅 (터미널 UI용)
├── utils/          (6.7MB) — 유틸리티 모음
├── constants/      (122KB) — 시스템 프롬프트, 상수
├── coordinator/    (23KB)  — 코디네이터 모드
├── buddy/          (79KB)  — 가상 펫 시스템 (!?)
└── voice/          (6.5KB) — 음성 모드

UE5 프로젝트의 Source/ 폴더를 보는 것 같다. 모듈 간 의존성이 깔끔하고, 각 도구가 독립적으로 분리되어 있다. tools/ 안에 40개 디렉토리가 각각 하나의 도구를 담당한다. 언리얼의 모듈 시스템이랑 느낌이 비슷하다.

런타임은 Bun이다. Node가 아니다. feature() 함수로 빌드 타임에 기능을 켜고 끄는 구조가 있는데, 이게 UE5의 WITH_EDITOR 같은 컴파일 플래그랑 정확히 같은 패턴이다.

const buddy = feature('BUDDY')
  ? require('./commands/buddy/index.js').default
  : null

feature('BUDDY')가 빌드 타임에 false로 평가되면 해당 코드가 번들에서 통째로 빠진다. Dead code elimination. UE5에서 #if WITH_EDITOR로 에디터 전용 코드를 빼는 것과 같다.

문서에 없는 슬래시 커맨드들

공식 문서에 나오는 커맨드는 /help, /compact, /config, /mcp 정도다. 소스코드에서 발견한 커맨드는 훨씬 많다. 그중 실제로 쓸 수 있는 것들을 추려봤다.

/btw — 사이드 질문. 메인 대화를 끊지 않고 빠른 질문을 던진다. immediate: true로 설정되어 있어서 대화 맥락을 오염시키지 않는다. 작업 중에 “btw 이 함수 뭐하는 거야?” 같은 질문을 던지기에 딱이다.

const btw = {
  type: 'local-jsx',
  name: 'btw',
  description: 'Ask a quick side question without interrupting the main conversation',
  immediate: true,
  argumentHint: '<question>',
}

/rewind — 코드 되돌리기. 대화와 코드를 이전 시점으로 되돌린다. alias가 /checkpoint다. Git의 특정 시점으로 돌아가는 게 아니라, Claude Code가 자체적으로 관리하는 체크포인트 시스템이다. 잘못된 방향으로 갈 때 “처음부터 다시”가 아니라 “여기서부터 다시”가 가능하다.

/compact — 컨텍스트 요약. 이건 문서에 나오지만, 인자를 받는다는 건 안 나온다. /compact 코드 변경사항 위주로 요약해줘처럼 요약 방향을 지정할 수 있다. 소스코드를 보면 customInstructions로 사용자 인자를 그대로 요약 프롬프트에 넘긴다.

/review — PR 코드 리뷰. gh CLI를 써서 PR diff를 가져온 다음 코드 리뷰를 해준다. PR 번호 없이 치면 열린 PR 목록을 보여준다.

const LOCAL_REVIEW_PROMPT = (args: string) => `
  You are an expert code reviewer. Follow these steps:
  1. If no PR number is provided, run `gh pr list`
  2. If provided, run `gh pr view <number>`
  3. Run `gh pr diff <number>` to get the diff
  4. Analyze the changes...
`

/advisor — 보조 모델 설정. 메인 모델 외에 “어드바이저” 모델을 따로 붙일 수 있다. /advisor opus로 설정하면 메인 모델이 작업할 때 Opus가 조언을 한다. 해제는 /advisor unset.

/stickers — 스티커 주문. 진짜로 Claude Code 스티커를 주문하는 페이지(stickermule.com/claudecode)를 브라우저에서 연다. 이스터에그인데, 소스코드에 떡하니 있다.

/sandbox — 샌드박스 토글. Bash 명령을 격리된 환경에서 실행하는 샌드박스 모드를 제어한다. macOS에서 사용 가능하고, 자동 허용 모드와 결합하면 안전하게 “다 허용”을 할 수 있다.

/fast — 빠른 모드. 더 빠른 모델로 전환한다. Claude AI 구독자와 API 사용자만 쓸 수 있고, isFastModeEnabled()로 게이트된다.

/effort — 노력 수준 조절. low, medium, high, max, auto 5단계. 간단한 질문에는 low, 복잡한 리팩토링에는 max. API 비용을 직접 제어할 수 있다.

/stats — 사용 통계. Claude Code 사용 패턴과 활동 통계를 보여준다.

/passes — 친구 초대. 무료 1주일 이용권을 친구에게 공유하고, 자신은 추가 사용량을 받는 레퍼럴 시스템이다. checkCachedPassesEligibility()로 자격을 확인한다.

/mobile — 모바일 앱 QR. alias가 /ios, /android다. QR 코드를 터미널에 표시해서 모바일 앱 다운로드를 안내한다.

/chrome — 크롬 확장 설정. Claude in Chrome 베타 기능을 설정한다. Claude AI 구독자만 사용 가능.

195개 환경변수 — 숨겨진 설정 표면

Mintlify 분석에서 문서화한 환경변수는 약 30개다. 소스코드에서 grep으로 찾은 CLAUDE_CODE_ 접두어 환경변수는 195개다.

전부 나열하진 않겠지만, 실전에서 유용한 것들이 있다.

CLAUDE_CODE_AUTO_COMPACT_WINDOW — 자동 컴팩트가 트리거되는 컨텍스트 윈도우 비율을 조절한다. 기본값보다 일찍 또는 늦게 컴팩트가 돌도록 할 수 있다.

CLAUDE_CODE_DISABLE_MOUSE — 마우스 입력을 완전히 끈다. tmux 안에서 Claude Code를 쓸 때 마우스 이벤트가 충돌하는 경우에 유용하다.

CLAUDE_CODE_SCROLL_SPEED — 스크롤 속도 조절. 터미널 환경에 따라 스크롤이 너무 빠르거나 느릴 때.

CLAUDE_CODE_TMUX_PREFIX — tmux 프리픽스 키 충돌을 해결한다. tmux 안에서 Claude Code의 키바인딩이 먹히지 않을 때 이걸로 조정한다.

CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING — 파일 체크포인팅을 끈다. /rewind에 쓰이는 체크포인트 시스템인데, 디스크 I/O가 부담될 때 끌 수 있다.

CLAUDE_CODE_COORDINATOR_MODE — 코디네이터 모드를 활성화한다. Claude가 직접 코드를 안 쓰고, 워커 에이전트를 지휘하는 오케스트레이터 역할만 한다. 이건 2편에서 자세히 다룬다.

CLAUDE_CODE_STREAMLINED_OUTPUT — 출력을 간소화한다. 도구 호출 과정 같은 중간 과정을 숨기고 결과만 보여준다.

CLAUDE_CODE_SYNTAX_HIGHLIGHT — 구문 강조를 제어한다. 터미널에서 색상이 깨질 때 끄면 된다.

CLAUDE_CODE_DISABLE_CRON — 크론 스케줄링을 끈다. Claude Code에 크론이 있다는 것 자체가 놀라운데, 이건 3편에서 다룬다.

# 실전 조합 예시 — tmux 안에서 가볍게 쓰기
export CLAUDE_CODE_DISABLE_MOUSE=1
export CLAUDE_CODE_STREAMLINED_OUTPUT=1
export DISABLE_AUTO_COMPACT=1

환경변수 중에는 CLAUDE_CODE_UNDERCOVER처럼 Anthropic 내부용으로 보이는 것도 있다. 이건 3편에서 다룬다.

키바인딩 — 커스터마이징이 된다

Claude Code의 키바인딩이 전부 커스터마이징 가능하다는 건 거의 알려지지 않았다. 소스코드에 defaultBindings.ts가 있고, 사용자 오버라이드를 keybindings.json에서 읽는다.

기본 키바인딩 중 쓸만한 것들이 많다.

// 글로벌
'ctrl+t': 'app:toggleTodos',     // 투두 리스트 토글
'ctrl+o': 'app:toggleTranscript', // 대화 전문 보기
'ctrl+r': 'history:search',       // 히스토리 검색

// 채팅
'shift+tab': 'chat:cycleMode',    // 모드 전환 (plan/code)
'meta+p': 'chat:modelPicker',     // 모델 선택
'meta+o': 'chat:fastMode',        // 빠른 모드 토글
'meta+t': 'chat:thinkingToggle',  // 사고 과정 표시 토글
'ctrl+s': 'chat:stash',           // 입력 스태시
'ctrl+g': 'chat:externalEditor',  // 외부 에디터로 열기

// 작업 중
'ctrl+b': 'task:background',      // 작업을 백그라운드로

ctrl+b로 현재 실행 중인 작업을 백그라운드로 보낼 수 있다. 에이전트가 긴 작업을 하고 있을 때, 끝날 때까지 기다리지 않고 다른 입력을 할 수 있다는 뜻이다. tmux에서는 ctrl+b를 두 번 눌러야 한다(tmux prefix와 겹치므로).

ctrl+s는 스태시다. git stash처럼, 지금 입력 중인 내용을 임시 저장하고 나중에 꺼낼 수 있다.

shift+up을 치면 메시지 액션 모드로 들어간다. 이전 메시지를 선택해서 복사하거나 다시 보낼 수 있다.

Windows에서는 VT 모드 지원 여부에 따라 shift+tab 대신 meta+m이 기본으로 바뀐다. 소스코드에서 Bun과 Node의 버전별 VT 모드 지원을 직접 체크하고 있다.

const SUPPORTS_TERMINAL_VT_MODE =
  getPlatform() !== 'windows' ||
  (isRunningWithBun()
    ? satisfies(process.versions.bun, '>=1.2.23')
    : satisfies(process.versions.node, '>=22.17.0 <23.0.0 || >=24.2.0'))

이런 수준의 플랫폼별 호환성 처리는 UE5에서 iOS/Android 크로스플랫폼 입력 처리할 때 보던 패턴과 똑같다.

macOS에서 잠들지 않는 이유

Claude Code가 작업 중일 때 맥이 잠들지 않는다. 운이 좋아서가 아니다. 소스코드에 caffeinate를 직접 호출하는 코드가 있다.

const CAFFEINATE_TIMEOUT_SECONDS = 300 // 5분
const RESTART_INTERVAL_MS = 4 * 60 * 1000 // 4분마다 재시작

// refCount 기반 — 작업이 0개가 되면 caffeinate를 끈다
export function startPreventSleep(): void {
  refCount++
  if (refCount === 1) {
    spawnCaffeinate()
  }
}

레퍼런스 카운팅 방식이다. 작업이 시작되면 카운트가 올라가고, 끝나면 내려간다. 카운트가 0이 되면 caffeinate 프로세스를 죽인다. 5분 타임아웃을 걸고 4분마다 재시작하는 이유는, Node 프로세스가 SIGKILL로 죽으면 cleanup 핸들러가 안 돌기 때문이다. orphan caffeinate가 5분 뒤 자동으로 죽는다.

게임 서버에서 keepalive 체크하는 것과 같은 패턴이다. 부모가 죽어도 자식이 무한히 살아남지 않도록, 자체 타임아웃을 건다.

다음 편 — 시스템 프롬프트와 코디네이터 모드

1편에서는 표면에 드러나는 숨겨진 기능들을 다뤘다. 2편에서는 더 깊이 들어간다. Claude Code의 시스템 프롬프트가 어떻게 조립되는지, 프롬프트 캐시를 깨지 않기 위해 어떤 구조를 쓰는지, 코디네이터 모드에서 워커 에이전트를 어떻게 지휘하는지. “AI가 AI를 관리하는” 아키텍처의 내부 구조다.

“Mintlify 문서에는 환경변수가 30개다. 소스코드에는 195개 있다.”

The Role of Communication in Brand Crises

Strategic Brand Communication

Brand communication is central to crisis management. Transparent, accurate, and timely communication helps organizations mitigate negative perceptions and fosters stakeholder trust.

Channels and Stakeholder Engagement

Organizations must carefully select communication channels to reach different stakeholders. Social media, press releases, and internal communication platforms all play a vital role in shaping public perception during crises.