{"id":222,"date":"2026-10-30T12:51:42","date_gmt":"2026-10-30T12:51:42","guid":{"rendered":"https:\/\/www.dobryakov.net\/blog\/222\/"},"modified":"2026-10-30T12:51:42","modified_gmt":"2026-10-30T12:51:42","slug":"building-on-blocks-network","status":"publish","type":"post","link":"https:\/\/www.dobryakov.net\/blog\/222\/","title":{"rendered":"Building on Blocks Network \u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;"},"content":{"rendered":"<p>Every team I work with is suddenly shipping AI agents. The agents are the easy part. The hard part \u2014 the part I spent years solving for ordinary services \u2014 is the layer underneath: how does an agent built by one team get <strong>discovered, called, and governed<\/strong> by another, without everyone rebuilding the same plumbing and without security signing off on a free-for-all?<\/p>\n<p>Blocks Network (from PubNub) pitches itself as exactly that substrate \u2014 a network for agent-to-agent communication with routing, discovery, presence and an economy layer. So instead of reading the marketing, I built on it. This is a field report from taking it from <code>npm install<\/code> to a live two-agent call, written for the four people who actually have to approve this kind of thing: the developer, the DevOps\/platform engineer, the analyst\/architect, and the security reviewer.<\/p>\n<p>Everything below is what I observed on the real platform on a Linux box (Node v20.19.5, Blocks CLI 1.0.24). Where I couldn&#x27;t verify something, I say so.<\/p>\n<p><!--more--><\/p>\n<h2>What I built<\/h2>\n<p>Two small agents, deliberately scoped so the <em>mechanics<\/em> are the subject, not the AI:<\/p>\n<ol>\n<li><strong><code>delivery_slot_estimator<\/code><\/strong> \u2014 a deterministic specialist. Given a region, parcel weight and service tier, it returns a delivery window. No LLM: same input, same output. That determinism is the point \u2014 it&#x27;s the kind of agent another system can put in a critical path and trust.<\/li>\n<li><strong><code>order_intake<\/code><\/strong> \u2014 an orchestrator. It validates an incoming order, derives region and total weight from the line items, then <strong>calls <code>delivery_slot_estimator<\/code> over the network<\/strong> and folds the delivery window into a confirmed order.<\/li>\n<\/ol>\n<p>That second agent is the whole reason a network like this exists: <code>order_intake<\/code> doesn&#x27;t re-implement delivery logic \u2014 it <em>discovers and reuses<\/em> a capability another team could own. If you want the broader map of how agent protocol layers stack, I wrote that separately in <a href=\"https:\/\/www.dobryakov.net\/blog\/125\/\">The AI Agent Protocol Stack<\/a>.<\/p>\n<h2>The developer view<\/h2>\n<p>The scaffold is clean. <code>blocks init &lt;name&gt; --yes --language node<\/code> produces three files \u2014 <code>agent-card.json<\/code>, <code>handler.ts<\/code>, <code>trigger.ts<\/code> \u2014 plus a <code>.env<\/code>. The agent card is the contract: identity, task kinds, typed IO, runtime limits.<\/p>\n<p>A handler is just a function:<\/p>\n<pre><code class=\"language-typescript\">export default async function handler(task, ctx) {\n  const raw = task.requestParts?.[0]?.text;\n  const input = JSON.parse(raw ?? &quot;{}&quot;);\n  \/\/ ...compute...\n  return { artifacts: [{ data: JSON.stringify(result), mimeType: &quot;application\/json&quot; }] };\n}<\/code><\/pre>\n<p>Three things developers should know going in:<\/p>\n<ul>\n<li><strong>There is no <code>jsonPart<\/code> helper.<\/strong> The card happily declares <code>contentType: &quot;application\/json&quot;<\/code> with a JSON Schema, but the SDK&#x27;s part helpers are <code>textPart<\/code>, <code>filePart<\/code>, <code>filePartFromPath<\/code> only. So &quot;structured&quot; input is really a JSON string you <code>stringify<\/code> on the way in and <code>parse<\/code> on the way out yourself. The typed-IO story the card advertises isn&#x27;t first-class in code yet.<\/li>\n<li><strong>The card&#x27;s input schema is a restricted subset of JSON Schema.<\/strong> I added a perfectly valid <code>&quot;pattern&quot;<\/code> to a property and <code>blocks check<\/code> rejected it: <code>additionalProperties &#x27;pattern&#x27; not allowed<\/code>. The error is specific and actionable (good), but the allowed-keyword list isn&#x27;t documented \u2014 you discover the boundary by hitting it.<\/li>\n<li><strong>You can test a handler offline.<\/strong> It&#x27;s a plain function, so you can import it and call it with a mock task \u2014 no auth, no network, the fastest possible inner loop. This isn&#x27;t in the quickstart, but it works and it&#x27;s the first thing I&#x27;d tell a new developer.<\/li>\n<\/ul>\n<p>The agent-to-agent call from inside a handler is genuinely nice once you know the shape \u2014 and the key detail is you use the <code>taskClient<\/code> the runtime hands you on <code>ctx<\/code>, you don&#x27;t construct one:<\/p>\n<pre><code class=\"language-typescript\">const session = await ctx.taskClient.sendMessage({\n  agentName: &quot;delivery_slot_estimator&quot;,\n  ownerId: task.ownerId,\n  requestParts: [{ partId: &quot;request&quot;, text: JSON.stringify({ region, weightKg, serviceTier }) }],\n});\nawait session.waitForTerminal(20_000);\nconst [ref] = session.listArtifacts();\nconst bytes = ref.kind === &quot;inline&quot; &amp;&amp; ref.data\n  ? decodeInlineArtifact(ref)\n  : (await session.downloadArtifact(ref)).data;\nconst estimate = JSON.parse(new TextDecoder().decode(bytes));\nawait session.asyncClose();<\/code><\/pre>\n<h2>The DevOps view<\/h2>\n<p>This is where the first impression is weakest, and it&#x27;s fixable.<\/p>\n<p><strong>The very first command fails on a normal machine.<\/strong> The documented install is <code>npm i -g @blocks-network\/cli<\/code>. On any box where the global <code>node_modules<\/code> isn&#x27;t user-writable \u2014 i.e. most managed\/corporate Linux and anyone who installed Node from a distro package \u2014 it dies with <code>EACCES<\/code>. The official <code>install.sh<\/code> turns out to be <em>literally the same command<\/em>, so there is no working fallback, and its <code>export PATH=&quot;$HOME\/.blocks\/bin:$PATH&quot;<\/code> line can&#x27;t survive a <code>| sh<\/code> subshell anyway. My workaround:<\/p>\n<pre><code class=\"language-bash\">npm config set prefix ~\/.npm-global\nexport PATH=&quot;$HOME\/.npm-global\/bin:$PATH&quot;   # persist in your shell rc\nnpm i -g @blocks-network\/cli<\/code><\/pre>\n<p><strong>Headless\/CI login, on the other hand, is handled well.<\/strong> On an SSH session the browser login detected there was no local browser and returned two concrete alternatives \u2014 a device-style <code>--no-browser<\/code> flow, or a dashboard API key via <code>blocks login --api-key-stdin<\/code> \/ <code>export BLOCKS_API_KEY=...<\/code>. That&#x27;s exactly what you need for containers and pipelines. The catch: this API-key path only appears <em>inside an error message<\/em>, not in the quickstart, so the best onboarding path for automated environments is effectively hidden.<\/p>\n<p><strong>Reproducibility.<\/strong> The scaffold pins <code>&quot;@blocks-network\/sdk&quot;: &quot;latest&quot;<\/code>. Two engineers scaffolding a week apart get different trees. Pin it.<\/p>\n<p><strong>The open question for production: outbound auth.<\/strong> Running a provider locally is one command (<code>blocks run<\/code>). But when <code>order_intake<\/code> calls another agent from its handler via <code>ctx.taskClient<\/code>, the docs never say where that outbound call&#x27;s credentials come from \u2014 there&#x27;s no <code>apiKey<\/code>\/<code>baseUrl<\/code> on the context, and <code>BLOCKS_API_KEY<\/code> isn&#x27;t in the SDK&#x27;s documented env-var list. I ran my provider with both a logged-in CLI profile <em>and<\/em> <code>BLOCKS_API_KEY<\/code> in the environment, so I genuinely can&#x27;t tell which one authenticated the sub-call. For anyone deploying an agent to a server or container, &quot;what exactly do I provision so my agent can call another agent?&quot; is the make-or-break question, and it needs a crisp answer.<\/p>\n<h2>The analyst \/ architect view<\/h2>\n<p>The reuse model is the asset. Concretely, the flow I ran:<\/p>\n<pre><code>client \u2500\u2500\u25ba order_intake \u2500\u2500(network task)\u2500\u2500\u25ba delivery_slot_estimator\n                \u2502                                   \u2502\n                \u2502 validate, derive region+weight    \u2502 compute window\n                \u25bc                                    \u25bc\n         confirmed order  \u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 delivery window<\/code><\/pre>\n<p>One capability, registered once, called by another agent that knows nothing about its internals. That is the &quot;stop building the fifth copy of the same thing&quot; promise, and at enterprise scale that consolidation is where the money is. The economy\/pricing and presence primitives exist (agents can be published free or paid, public or private); I only exercised the free\/private path, so I won&#x27;t speak to billing mechanics I didn&#x27;t touch.<\/p>\n<h2>The security view<\/h2>\n<p>This is the segment that will actually decide an enterprise rollout, and it&#x27;s a mixed-but-promising picture. For the governance shape I use when agents get bounded autonomy and policy gates, see <a href=\"https:\/\/www.dobryakov.net\/blog\/194\/\">Agentic AI Governance<\/a>.<\/p>\n<ul>\n<li><strong>Private by default is the right default.<\/strong> <code>blocks register<\/code> lists an agent as <strong>private and free<\/strong>. A private agent is reachable only by its owner and by explicitly granted users\/orgs \u2014 notably, <em>org membership alone grants nothing<\/em>; the owner has to grant their own organization. That&#x27;s a defensible posture: you can stand an agent up and demo internal reuse without ever exposing it publicly. Making it public\/paid is a separate, deliberate <code>blocks publish<\/code>.<\/li>\n<li><strong>Credential hygiene is on you, and the tooling helps.<\/strong> The API key lives in <code>~\/.config\/blocks\/contexts.json<\/code> or a project <code>.env<\/code>. The skill\/docs are explicit: never hardcode, print, commit, or ship the key to browser code; browser apps must use a user-auth flow, not a provider key. The scaffold <code>.gitignore<\/code>s <code>.env<\/code>. Good defaults \u2014 but the <code>BLOCKS_API_KEY<\/code> env-var pattern for automation means key sprawl into CI secrets, so treat it like any other high-value token.<\/li>\n<li><strong>Dependency surface needs a story.<\/strong> A freshly scaffolded project&#x27;s <code>npm install<\/code> ends with <strong>6 high-severity vulnerabilities<\/strong> reported by npm. I did <em>not<\/em> verify whether those are in Blocks&#x27; own code or in transitive dependencies \u2014 but it doesn&#x27;t matter for the optics: the first <code>npm install<\/code> your security team runs throws six highs, and there&#x27;s no published SBOM or security page to hand them. For the enterprise buyer this is the single most important thing to get ahead of.<\/li>\n<li><strong>Data governance is better documented than the quickstart suggests<\/strong> \u2014 it&#x27;s just not where a developer lands. The public security page and the architecture whitepaper cover transport, encryption, isolation and residency. It&#x27;s worth its own section, below.<\/li>\n<\/ul>\n<h2>Can a human talk to an agent \u2014 and talk back?<\/h2>\n<p>&quot;Agent-to-agent&quot; is the headline, so it&#x27;s fair to ask whether a human fits on either end as genuine two-way communication \u2014 not an approval gate or an escalation, but back-and-forth. Here&#x27;s what the docs actually support:<\/p>\n<ul>\n<li><strong>Human \u2192 agent and agent \u2192 human (one direction each) is first-class.<\/strong> You scaffold a web client with <code>blocks init &lt;name&gt; --mode webapp<\/code>. A browser consumer authenticates without an embedded key \u2014 an embedded <code>BlocksAuth<\/code> widget, or your own <code>tokenEndpoint<\/code> \/ backend proxy minting short-lived JWTs. That human client submits a task and receives the agent&#x27;s <strong>progress, artifacts and streamed output<\/strong> back live. So a person can drive an agent from a web UI and watch it respond in real time.<\/li>\n<li><strong>Long-lived channels exist.<\/strong> Besides one-shot <code>request<\/code> tasks, there are <strong><code>pipe<\/code> tasks<\/strong> \u2014 &quot;long-running streaming tasks with an explicit duration&quot; (1 minute to 30 days) where the handler loops until cancelled or expired and streams to the consumer. That&#x27;s the primitive for a persistent agent\u2194client channel rather than a single call.<\/li>\n<li><strong>The protocol models bidirectional streams.<\/strong> A stream in the agent card declares <code>direction: &quot;outbound&quot; | &quot;inbound&quot; | &quot;bidirectional&quot;<\/code>; a bidirectional event stream carries both an <code>outboundSchema<\/code> and an <code>inboundSchema<\/code>, and a handler can <em>read<\/em> an inbound\/bidirectional stream (its <code>write()<\/code> is rejected on an inbound-only stream). So the shape for a client to feed data <em>into<\/em> a running task is defined at the schema level.<\/li>\n<\/ul>\n<p>Where it stops short \u2014 and this is the honest caveat: I found <strong>no documented consumer-side write method<\/strong> to push into that inbound\/bidirectional stream. Every consumer example is read-only (<code>bytes()<\/code>, <code>events()<\/code>, <code>inbound<\/code>), and a <code>TaskSession<\/code> exposes only <code>cancel\/terminate\/close<\/code> \u2014 no <code>send()<\/code> or <code>reply()<\/code>. There is also <strong>no chat, turn-taking, or conversation abstraction<\/strong> in the docs, and no notion of human presence.<\/p>\n<p>So continuous human\u2194agent interaction is clearly <em>intended<\/em> \u2014 web clients, pipe tasks, and a bidirectional stream direction are all there \u2014 but symmetric back-and-forth <em>during<\/em> a task (human sends more input mid-run, agent responds, repeat) isn&#x27;t documented end-to-end on the consumer side today. You&#x27;d build the turn-taking layer yourself on top of bidirectional streams. I&#x27;m reporting this from the docs: I built the request\/response and agent-to-agent paths, not a live bidirectional-stream conversation, so treat the two-way-during-a-task part as &quot;the spec says yes, the consumer SDK doesn&#x27;t yet show how,&quot; not as something I ran.<\/p>\n<h2>Data governance \u2014 the part security reads first<\/h2>\n<p>I went past the quickstart into the public security page and the architecture whitepaper. Here&#x27;s what&#x27;s actually stated \u2014 and what still isn&#x27;t.<\/p>\n<p><strong>Transport and connection model.<\/strong> Blocks is built on PubNub&#x27;s globally distributed messaging infrastructure. An agent opens <strong>one outbound connection on port 443<\/strong> and receives work over it \u2014 &quot;no inbound ports, no public endpoints.&quot; For a security team that&#x27;s a strong starting posture: no firewall holes, no listening sockets on your agents. Task dispatch, control messages, results, streamed events and presence all ride that one connection.<\/p>\n<p><strong>Encryption.<\/strong> The security page states <strong>TLS on every connection, with no plaintext fallback<\/strong>, and <strong>AES-256 at rest<\/strong>; the whitepaper adds &quot;there is no plaintext path between any two components,&quot; and that an agent&#x27;s connection access tokens <strong>expire within seconds<\/strong> and refresh silently. The exact TLS version and cipher suites aren&#x27;t published. Notably, an agent <strong>can require end-to-end encryption of task inputs and outputs &quot;so not even the operator can read them&quot;<\/strong> \u2014 an optional, per-agent control (very likely the <code>consumerPublicKey<\/code> I saw on task messages in the SDK). For a sensitive-data use case, that E2E option is the single most important lever.<\/p>\n<p><strong>Where the bytes actually go.<\/strong> This lined up with something I hit in code. Small results come back inline in the task message; <strong>file artifacts go to managed object storage via a short-lived pre-signed URL<\/strong> \u2014 &quot;the socket carries the coordination messages but not the bytes themselves.&quot; So large payloads transit object storage, not the message bus. <strong>Task state<\/strong> \u2014 input, status, current step, intermediate results, final output \u2014 is <strong>persisted in the platform&#x27;s database at every transition.<\/strong> Good for auditability; worth noting that <em>intermediate<\/em> results are persisted too, not just the final answer.<\/p>\n<p><strong>Isolation.<\/strong> Tenant-isolation rules apply on every point-of-presence, and messages are visible only to subscribers authorized for that tenant&#x27;s channels. Admins can <strong>revoke an agent&#x27;s channel-level access within seconds<\/strong>, and streaming credentials are scoped to a single channel.<\/p>\n<p><strong>Residency.<\/strong> There&#x27;s a path, not a blanket guarantee: a customer with residency requirements can <strong>run dedicated instances on their own infrastructure<\/strong>, with the platform routing some tasks to those and others to the shared pool. Traffic goes to the closest PoP and replicates across PoPs as needed; the docs don&#x27;t state which region shared-pool task data lives in. <strong>Air-gapped networks are explicitly not supported.<\/strong><\/p>\n<p><strong>Compliance.<\/strong> The security page shows badges for <strong>SOC 2 Type II, SOC 3, HIPAA (with BAA), GDPR, CCPA and ISO\/IEC 27001<\/strong>, and points to PubNub&#x27;s Trust Center for attestations \u2014 but audit dates, scope and certificates aren&#x27;t on the page, and the launch press release&#x27;s other claims (zero-trust, a 99.999% SLA) aren&#x27;t substantiated there.<\/p>\n<p><strong>Still unconfirmed \u2014 ask before procurement:<\/strong> data-retention and deletion periods, the TLS version\/cipher baseline, which region shared-pool task data resides in, the audit scope behind each compliance badge, and whether the platform analyzes or trains on payloads (the security page doesn&#x27;t say; the only adjacent statement is the optional per-agent E2E control).<\/p>\n<p><strong>Bottom line for security:<\/strong> the architecture is defensible \u2014 outbound-only, TLS everywhere, per-tenant channel isolation, seconds-to-revoke credentials, optional end-to-end encryption, and a dedicated-instance escape hatch for residency. The gaps are documentation and attestation, not obvious design holes. I verified the connection posture and the inline-vs-object-storage artifact split against my own build; the encryption, isolation, residency and compliance claims are read from Blocks&#x27; own docs, not independently audited.<\/p>\n<h2>Does it actually work? Yes \u2014 live.<\/h2>\n<p>I registered both agents (private, free), started both providers, and called <code>order_intake<\/code> with a sample order (a sofa + two cushions to Poland). The result came back confirmed, with the delivery window the estimator computed (EU-East, 51 kg, \u20ac949, window spanning early November).<\/p>\n<p>The proof it was a real network hop and not a local function call: the estimator&#x27;s own provider logged a <strong>separate<\/strong> completed task ID (<code>098e8916\u2026<\/code>) distinct from the inbound order task (<code>356f4b70\u2026<\/code>). Two processes, two tasks, one network call between them.<\/p>\n<h2>Verdict<\/h2>\n<p>The primitive is real and the core value \u2014 register a capability once, reuse it everywhere, private by default \u2014 is exactly what the &quot;every team is building agents&quot; problem needs. The developer path is short and the error UX is, in places, excellent.<\/p>\n<p>What I&#x27;d want closed before putting it in front of my teams:<\/p>\n<ol>\n<li><strong>Install hardening<\/strong> for managed machines (it&#x27;s command #1).<\/li>\n<li><strong>A crisp production outbound-auth story<\/strong> \u2014 the thing that makes agent-to-agent actually deployable.<\/li>\n<li><strong>A security surface<\/strong> an infosec team can sign off on \u2014 pinned deps, a clean tree, an SBOM.<\/li>\n<\/ol>\n<p>None of those are architecture problems; they&#x27;re onboarding and documentation problems. Which, encouragingly, is the most fixable kind.<\/p>\n<hr \/>\n<p><em>Appendix \u2014 the full path I walked:<\/em><\/p>\n<pre><code class=\"language-bash\">npm i -g @blocks-network\/cli         # (use a user prefix if EACCES)\nblocks init my_agent --yes --language node\n# edit agent-card.json + handler.ts\nblocks check                         # validate card + handler\nblocks login --api-key-stdin         # headless\/CI: dashboard key on stdin\nblocks register                      # private + free\nblocks run                           # start the provider\nnpx tsx trigger.ts                   # call it (or let another agent call it)<\/code><\/pre>\n<hr \/>\n<p><em>Sources for the governance section: the Blocks.ai security page (https:\/\/blocks.ai\/security) and architecture whitepaper (https:\/\/blocks.ai\/architecture\/network-whitepaper), plus the official docs at config.blocks.ai. Everything else is from my own build on 2026-10-30; where a claim is read from docs rather than independently audited, the text says so.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Two agents, one live agent-to-agent call, and an honest engineering read for developers, DevOps, analysts and security teams.<\/p>\n","protected":false},"author":0,"featured_media":221,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[209,24],"tags":[116,222,26,221,223,224],"class_list":["post-222","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-agents","category-ai-engineering","tag-a2a","tag-agent-to-agent","tag-ai-agents","tag-blocks-network","tag-devops","tag-security"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.dobryakov.net\/blog\/222\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Grigoriy Dobryakov - IT+AI Blog - Grigoriy Dobryakov&#039;s blog: management, development and testing\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Building on Blocks Network \u2014 a hands-on field report on the &quot;Internet of Agents&quot;\" \/>\n\t\t<meta property=\"og:description\" content=\"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.dobryakov.net\/blog\/222\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-10-30T12:51:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-10-30T12:51:42+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Building on Blocks Network \u2014 a hands-on field report on the &quot;Internet of Agents&quot;\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#blogposting\",\"name\":\"Building on Blocks Network \\u2014 a hands-on field report on the \\\"Internet of Agents\\\"\",\"headline\":\"Building on Blocks Network \\u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;\",\"author\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/author\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/building-on-blocks-network.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Building on Blocks Network \\u2014 a hands-on field report on the \\\"Internet of Agents\\\"\"},\"datePublished\":\"2026-10-30T12:51:42+00:00\",\"dateModified\":\"2026-10-30T12:51:42+00:00\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#webpage\"},\"articleSection\":\"AI Agents, AI Engineering, a2a, agent-to-agent, AI agents, blocks-network, devops, security\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/category\\\/ai-engineering\\\/#listItem\",\"name\":\"AI Engineering\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/category\\\/ai-engineering\\\/#listItem\",\"position\":2,\"name\":\"AI Engineering\",\"item\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/category\\\/ai-engineering\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#listItem\",\"name\":\"Building on Blocks Network \\u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#listItem\",\"position\":3,\"name\":\"Building on Blocks Network \\u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/category\\\/ai-engineering\\\/#listItem\",\"name\":\"AI Engineering\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/#organization\",\"name\":\"Grigoriy Dobryakov - IT+AI Blog\",\"description\":\"Grigoriy Dobryakov's blog: management, development and testing\",\"url\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#webpage\",\"url\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/\",\"name\":\"Building on Blocks Network \\u2014 a hands-on field report on the \\\"Internet of Agents\\\"\",\"description\":\"Field report: npm install to a live two-agent call on Blocks Network \\u2014 developer, DevOps, architect and security lenses, with what still needs closing.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/author\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/author\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/building-on-blocks-network.jpg\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#mainImage\",\"width\":1200,\"height\":630,\"caption\":\"Building on Blocks Network \\u2014 a hands-on field report on the \\\"Internet of Agents\\\"\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/222\\\/#mainImage\"},\"datePublished\":\"2026-10-30T12:51:42+00:00\",\"dateModified\":\"2026-10-30T12:51:42+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/\",\"name\":\"Grigoriy Dobryakov - IT+AI Blog\",\"description\":\"Grigoriy Dobryakov's blog: management, development and testing\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.dobryakov.net\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\"","description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.","canonical_url":"https:\/\/www.dobryakov.net\/blog\/222\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.dobryakov.net\/blog\/222\/#blogposting","name":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\"","headline":"Building on Blocks Network \u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;","author":{"@id":"https:\/\/www.dobryakov.net\/blog\/author\/#author"},"publisher":{"@id":"https:\/\/www.dobryakov.net\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.dobryakov.net\/blog\/wp-content\/uploads\/2026\/10\/building-on-blocks-network.jpg","width":1200,"height":630,"caption":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\""},"datePublished":"2026-10-30T12:51:42+00:00","dateModified":"2026-10-30T12:51:42+00:00","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/www.dobryakov.net\/blog\/222\/#webpage"},"isPartOf":{"@id":"https:\/\/www.dobryakov.net\/blog\/222\/#webpage"},"articleSection":"AI Agents, AI Engineering, a2a, agent-to-agent, AI agents, blocks-network, devops, security"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dobryakov.net\/blog\/222\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.dobryakov.net\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog\/category\/ai-engineering\/#listItem","name":"AI Engineering"}},{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog\/category\/ai-engineering\/#listItem","position":2,"name":"AI Engineering","item":"https:\/\/www.dobryakov.net\/blog\/category\/ai-engineering\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog\/222\/#listItem","name":"Building on Blocks Network \u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog\/222\/#listItem","position":3,"name":"Building on Blocks Network \u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;","previousItem":{"@type":"ListItem","@id":"https:\/\/www.dobryakov.net\/blog\/category\/ai-engineering\/#listItem","name":"AI Engineering"}}]},{"@type":"Organization","@id":"https:\/\/www.dobryakov.net\/blog\/#organization","name":"Grigoriy Dobryakov - IT+AI Blog","description":"Grigoriy Dobryakov's blog: management, development and testing","url":"https:\/\/www.dobryakov.net\/blog\/"},{"@type":"WebPage","@id":"https:\/\/www.dobryakov.net\/blog\/222\/#webpage","url":"https:\/\/www.dobryakov.net\/blog\/222\/","name":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\"","description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.dobryakov.net\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.dobryakov.net\/blog\/222\/#breadcrumblist"},"author":{"@id":"https:\/\/www.dobryakov.net\/blog\/author\/#author"},"creator":{"@id":"https:\/\/www.dobryakov.net\/blog\/author\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.dobryakov.net\/blog\/wp-content\/uploads\/2026\/10\/building-on-blocks-network.jpg","@id":"https:\/\/www.dobryakov.net\/blog\/222\/#mainImage","width":1200,"height":630,"caption":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\""},"primaryImageOfPage":{"@id":"https:\/\/www.dobryakov.net\/blog\/222\/#mainImage"},"datePublished":"2026-10-30T12:51:42+00:00","dateModified":"2026-10-30T12:51:42+00:00"},{"@type":"WebSite","@id":"https:\/\/www.dobryakov.net\/blog\/#website","url":"https:\/\/www.dobryakov.net\/blog\/","name":"Grigoriy Dobryakov - IT+AI Blog","description":"Grigoriy Dobryakov's blog: management, development and testing","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.dobryakov.net\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Grigoriy Dobryakov - IT+AI Blog - Grigoriy Dobryakov's blog: management, development and testing","og:type":"article","og:title":"Building on Blocks Network \u2014 a hands-on field report on the &quot;Internet of Agents&quot;","og:description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.","og:url":"https:\/\/www.dobryakov.net\/blog\/222\/","article:published_time":"2026-10-30T12:51:42+00:00","article:modified_time":"2026-10-30T12:51:42+00:00","twitter:card":"summary_large_image","twitter:title":"Building on Blocks Network \u2014 a hands-on field report on the &quot;Internet of Agents&quot;","twitter:description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing."},"aioseo_meta_data":{"post_id":"222","title":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\"","description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.","keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\"","og_description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.","og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":"Building on Blocks Network \u2014 a hands-on field report on the \"Internet of Agents\"","twitter_description":"Field report: npm install to a live two-agent call on Blocks Network \u2014 developer, DevOps, architect and security lenses, with what still needs closing.","schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-10-30 12:52:02","updated":"2026-10-30 12:52:02"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.dobryakov.net\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.dobryakov.net\/blog\/category\/ai-engineering\/\" title=\"AI Engineering\">AI Engineering<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tBuilding on Blocks Network \u2014 a hands-on field report on the \u201cInternet of Agents\u201d\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.dobryakov.net\/blog"},{"label":"AI Engineering","link":"https:\/\/www.dobryakov.net\/blog\/category\/ai-engineering\/"},{"label":"Building on Blocks Network \u2014 a hands-on field report on the &#8220;Internet of Agents&#8221;","link":"https:\/\/www.dobryakov.net\/blog\/222\/"}],"_links":{"self":[{"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/posts\/222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/comments?post=222"}],"version-history":[{"count":0,"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/posts\/222\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/media\/221"}],"wp:attachment":[{"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/media?parent=222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/categories?post=222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dobryakov.net\/blog\/wp-json\/wp\/v2\/tags?post=222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}