{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Build log | Krishnendu Biswas",
  "home_page_url": "https://krishnendu.me/log/",
  "feed_url": "https://krishnendu.me/log/feed.json",
  "description": "What I build and run with agents, reviewed before publishing.",
  "language": "en",
  "authors": [
    {
      "name": "Krishnendu Biswas",
      "url": "https://krishnendu.me/"
    }
  ],
  "items": [
    {
      "id": "https://krishnendu.me/log/2026/10/site-rebuild-fact-audit/",
      "url": "https://krishnendu.me/log/2026/10/site-rebuild-fact-audit/",
      "title": "Rebuilt this site and ran a fact audit on its numbers",
      "summary": "This site went from a game-themed page to a professional portfolio. A planning model wrote the spec, a builder agent worked through it from a task board, and served screenshots were reviewed before it went live. The diagrams and charts are now 14 inline SVG figures, each with a data table.",
      "image": "https://krishnendu.me/og/og-log-site-rebuild-fact-audit.png",
      "content_html": "<p><strong>What changed</strong>: This site went from a game-themed page to a professional portfolio. A planning model wrote the spec, a builder agent worked through it from a task board, and served screenshots were reviewed before it went live. The diagrams and charts are now 14 inline SVG figures, each with a data table.</p><p><strong>Why it matters</strong>: I mapped 380 numbers on the site to a source line. A script measures diagram text on 23 pages at 3 screen widths. Rows under the 13px floor went from 18 to 0.</p><svg class=\"dg wide\" viewBox=\"0 0 680 133\" role=\"img\" aria-labelledby=\"f-site-rw-t f-site-rw-d\" xmlns=\"http://www.w3.org/2000/svg\"><title id=\"f-site-rw-t\">How a site change moves from plan to merge</title><desc id=\"f-site-rw-d\">Five steps left to right: plan, build, fact audit, screenshot review, merge. A return arrow runs from fact audit back to build, labelled fabricated draft discarded.</desc><defs><marker id=\"f-site-rw-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M0 0L10 5L0 10z\" fill=\"currentColor\"/></marker></defs><rect class=\"k-b\" x=\"1\" y=\"1\" width=\"118\" height=\"64\" rx=\"3\"/><text x=\"60\" y=\"38\" font-size=\"16\" text-anchor=\"middle\" font-weight=\"600\">Plan</text><rect class=\"k-b\" x=\"141\" y=\"1\" width=\"118\" height=\"64\" rx=\"3\"/><text x=\"200\" y=\"38\" font-size=\"16\" text-anchor=\"middle\" font-weight=\"600\">Build</text><path class=\"edge\" d=\"M121 33H138\" marker-end=\"url(#f-site-rw-ah)\"/><rect class=\"k-a\" x=\"281\" y=\"1\" width=\"118\" height=\"64\" rx=\"3\"/><text class=\"t-a\" x=\"340\" y=\"38\" font-size=\"16\" text-anchor=\"middle\" font-weight=\"600\">Fact audit</text><path class=\"edge\" d=\"M261 33H278\" marker-end=\"url(#f-site-rw-ah)\"/><rect class=\"k-b\" x=\"421\" y=\"1\" width=\"118\" height=\"64\" rx=\"3\"/><text x=\"480\" y=\"28\" font-size=\"16\" text-anchor=\"middle\" font-weight=\"600\">Screenshot</text><text x=\"480\" y=\"48\" font-size=\"16\" text-anchor=\"middle\" font-weight=\"600\">review</text><path class=\"edge\" d=\"M401 33H418\" marker-end=\"url(#f-site-rw-ah)\"/><rect class=\"k-b\" x=\"561\" y=\"1\" width=\"118\" height=\"64\" rx=\"3\"/><text x=\"620\" y=\"38\" font-size=\"16\" text-anchor=\"middle\" font-weight=\"600\">Merge</text><path class=\"edge\" d=\"M541 33H558\" marker-end=\"url(#f-site-rw-ah)\"/><path class=\"edge\" d=\"M340 65V99H200V69\" marker-end=\"url(#f-site-rw-ah)\"/><text x=\"270\" y=\"123\" font-size=\"15\" text-anchor=\"middle\">Fabricated draft discarded</text></svg><p><strong>Result</strong>: Merged and live on 3 Oct 2026, with 0 failing rows on the text size check.</p><p><strong>Lesson</strong>: An earlier draft contained claims that did not match my records, and the fact audit caught them before release. An automated review also passed a build with visible defects, so every release now gets a separate check of the rendered pages before it goes live.</p><p>Sources: <span data-src=\"K:t_d2253e4b\">Task card: v2 visual redesign with diagrams and charts, including the reviewer run and the model fallback</span>, <span data-src=\"K:t_fe967bff\">Task card: v2.1 diagram polish, facts map and diagram text size check</span>, <span data-src=\"K:t_2e5cde57\">Task card: v1.2 agent case studies, where the unmatched claims were found</span></p>",
      "date_published": "2026-10-03T20:00:00+05:30",
      "tags": [
        "site",
        "shipped"
      ]
    },
    {
      "id": "https://krishnendu.me/log/2026/09/cloud-migration/",
      "url": "https://krishnendu.me/log/2026/09/cloud-migration/",
      "title": "Moved the agents from laptop to cloud server",
      "summary": "Hermes Agent, the open-source framework my agents run on, moved from a Linux virtual machine on my MacBook (M1 Max) to a cloud server running Ubuntu. The model gateway (9Router, which sends each request to a model) and the provider sync now run as system services on that server.",
      "image": "https://krishnendu.me/og/og-log-cloud-migration.png",
      "content_html": "<p><strong>What changed</strong>: Hermes Agent, the open-source framework my agents run on, moved from a Linux virtual machine on my MacBook (M1 Max) to a cloud server running Ubuntu. The model gateway (9Router, which sends each request to a model) and the provider sync now run as system services on that server.</p><p><strong>Why it matters</strong>: The agents keep working when the laptop is closed. Scheduled jobs and the daily progress report no longer depend on my machine being awake.</p><svg class=\"dg wide\" viewBox=\"0 0 680 162\" role=\"img\" aria-labelledby=\"f-cloud-w-t f-cloud-w-d\" xmlns=\"http://www.w3.org/2000/svg\"><title id=\"f-cloud-w-t\">Before and after the move to a cloud server</title><desc id=\"f-cloud-w-d\">Left: the laptop setup, a Linux virtual machine on a MacBook (M1 Max) running Hermes Agent and the model gateway. Right: the cloud server running Ubuntu with Hermes Agent, and the model gateway and provider sync as system services. Arrow between them labelled moved 20 Sep 2026.</desc><defs><marker id=\"f-cloud-w-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M0 0L10 5L0 10z\" fill=\"currentColor\"/></marker></defs><rect class=\"k-b\" x=\"1\" y=\"1\" width=\"250\" height=\"138\" rx=\"3\"/><text x=\"15\" y=\"29\" font-size=\"17\" font-weight=\"600\">Before: MacBook (M1 Max)</text><line class=\"rule\" x1=\"15\" y1=\"41\" x2=\"237\" y2=\"41\"/><text class=\"t-s\" x=\"15\" y=\"61\" font-size=\"16\">Linux virtual machine</text><line class=\"rule\" x1=\"15\" y1=\"71\" x2=\"237\" y2=\"71\"/><text class=\"t-s\" x=\"15\" y=\"91\" font-size=\"16\">Hermes Agent</text><line class=\"rule\" x1=\"15\" y1=\"101\" x2=\"237\" y2=\"101\"/><text class=\"t-s\" x=\"15\" y=\"121\" font-size=\"16\">Model gateway</text><rect class=\"k-a\" x=\"429\" y=\"1\" width=\"250\" height=\"160\" rx=\"3\"/><text class=\"t-a\" x=\"443\" y=\"29\" font-size=\"17\" font-weight=\"600\">After: cloud server,</text><text class=\"t-a\" x=\"443\" y=\"51\" font-size=\"17\" font-weight=\"600\">Ubuntu</text><line class=\"rule-a\" x1=\"443\" y1=\"63\" x2=\"665\" y2=\"63\"/><text class=\"t-a\" x=\"443\" y=\"83\" font-size=\"16\">Hermes Agent</text><line class=\"rule-a\" x1=\"443\" y1=\"93\" x2=\"665\" y2=\"93\"/><text class=\"t-a\" x=\"443\" y=\"113\" font-size=\"16\">Model gateway, as a service</text><line class=\"rule-a\" x1=\"443\" y1=\"123\" x2=\"665\" y2=\"123\"/><text class=\"t-a\" x=\"443\" y=\"143\" font-size=\"16\">Provider sync, as a service</text><path class=\"edge\" d=\"M264 82H416\" marker-end=\"url(#f-cloud-w-ah)\"/><text x=\"340\" y=\"70\" font-size=\"15\" text-anchor=\"middle\">Moved 20 Sep 2026</text></svg><p><strong>Result</strong>: Gateway and sync were deployed as services on 21 Sep 2026.</p><p><strong>Lesson</strong>: The date of this move rests on a billing record and a boot log rather than my memory. I now log milestones to an append-only ledger with an ID and cite that ID when I write about them.</p><p>Sources: <span data-src=\"G:0009\">Ledger: first billed day of the cloud server (billing record, amount withheld)</span>, <span data-src=\"G:0010\">Ledger: cloud server first boot on 20 Sep, from the system boot log</span>, <span data-src=\"G:0011\">Ledger: agent runtime moved from laptop to cloud server</span>, <span data-src=\"G:0012\">Ledger: model gateway and provider sync deployed as system services</span></p>",
      "date_published": "2026-09-20T20:00:00+05:30",
      "tags": [
        "infra",
        "shipped"
      ]
    }
  ]
}
